[英]Convert a javascript associative array into json object using stringify and vice versa
[英]Creating array by Object (and vice versa) in JavaScript?
這里發生了什么?
var x = {length:3, '0':'foo', '1':'bar','2':'f', splice:function(){}}
這實際上創建了一個數組:
["foo", "bar", "f"]
這種結構語法的文檔在哪里?
它也很聰明:
改為:(注意0,1,3)
var x = {length:3, '0':'foo', '1':'bar','3':'f', splice:function(){}}
將搞亂數組,它將是:
["foo", "bar", undefined × 1]
另外,刪除拼接功能:
var x = {length:3, '0':'foo', '1':'bar','2':'f'}
產量:(常規對象)
Object
0: "foo"
1: "bar"
2: "f"
length: 3
__proto__: Object
所以我有兩個問題:
這個結構是什么? length , element , splice
假設我有['john','paul','yoko']
,現在我想創建對象
var x = {length:3, '0':'john', '1':'paul','2':'yoko', splice:function(){}}
我該怎么做?
一個數組只是一個對象 ,實現了一些方法,當你創建console.log(x)
,你的控制台會識別一個數組的模型,並像配置它一樣顯示它。
Array
是默認情況下在Javascript中可用的對象,它的處理方式與瀏覽器的其他對象略有不同(請參閱@MathiasSchwarz注釋),但在其結構中,它是一個像其他對象一樣的對象(可以調用的方法,並且你可以添加索引。但是,你通常不會像在“普通”對象中那樣使用字符串索引,因為它的目的不是像那樣使用它。
但是你的對象實際上並不是一個Array
,你可以做任何你想做的事情,而無需參考控制台中顯示的內容。
x
不是數組,它只是一個對象。 ( 控制台以數組格式顯示它,這是控制台實現的問題。 )
var x = {length:3, '0':'foo', '1':'bar','2':'f', splice:function(){}};
console.log(typeof x); // object
只需使用firebug作為示例,查看firebug的源代碼,您將看到為什么控制台將其視為一個數組。
//...
isArray: function(obj, win)
{
if (mightBeArray(obj, win))
{
if (!obj)
return false;
// do this first to avoid security 1000 errors
else if (obj instanceof Ci.nsIDOMHistory)
return false;
// do this first to avoid exceptions
else if (obj.toString && obj.toString() === "[xpconnect wrapped native prototype]")
return false;
else if (isFinite(obj.length) && typeof obj.splice === "function")
return true;
else if (Arr.isArray(obj))
return true;
}
return false;
},
// ...
var x = {length:3, '0':'foo', '1':'bar','2':'f', splice:function(){}}
看起來像一個數組,但不是 。 如果你嘗試x.forEach(function(e){...})
它會失敗,但如果你做[1,2,3].forEach(function(e){...})
。
如果要通過文字對象表示法創建實際數組,則可以這樣做
var x = {length:3, ... , __proto__:Array.prototype}
但是請注意,像這樣創建的對象仍然不會在寫入時更新它的length
屬性。
具有長度和數字索引的對象稱為偽數組是Javascript。 這些的一個例子是jQuery對象。
Chrome控制台 顯示 length
和splice
為數組的對象,但這並不意味着它們是數組。
創建的對象不是數組,但它將表現為一個(雖然不可變),因為它有一個長度字段和一個splice
方法。
在JavaScript數組中,更新數組時會自動更新length
字段。 對於您的對象,情況並非如此。 在您的對象中,無論對象包含什么, length
字段都將保持為3
。 這也是將索引更改為0,1,3時不再起作用的原因。 在這種情況下,長度字段應該是4
而不是3
。 由於值為3
,迭代將在索引2之后停止,這確實是未定義的,因為您沒有為索引2設置值...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.