簡體   English   中英

在JavaScript中用Object創建數組(反之亦然)?

[英]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控制台 顯示 lengthsplice為數組的對象,但這並不意味着它們數組。

創建的對象不是數組,但它將表現為一個(雖然不可變),因為它有一個長度字段和一個splice方法。

在JavaScript數組中,更新數組時會自動更新length字段。 對於您的對象,情況並非如此。 在您的對象中,無論對象包含什么, length字段都將保持為3 這也是將索引更改為0,1,3時不再起作用的原因。 在這種情況下,長度字段應該是4而不是3 由於值為3 ,迭代將在索引2之后停止,這確實是未定義的,因為您沒有為索引2設置值...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM