9

ここで何が起こっているのですか?

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

だから私は2つの質問があります:

  • この構造は何ですか? length , element , splice

  • 私が持っていると言って、今私はオブジェクト['john','paul','yoko']を作成したい

    var x = {length:3, '0':'john', '1':'paul','2':'yoko', splice:function(){}}

    どうすればいいですか?

4

4 に答える 4

6

配列はオブジェクトに他なりません。いくつかのメソッドが実装されている場合、作成するconsole.log(x)と、コンソールは配列のモデルを認識し、そのように構成されているように表示します。

ArrayはJavascriptでデフォルトで使用可能なオブジェクトであり、ブラウザによって他のオブジェクトとは少し異なる方法で処理されます(@MathiasSchwarzコメントを参照)が、その構造では、他のオブジェクトと同様のオブジェクトです(呼び出すことができるメソッドがあり、インデックスを追加できます。ただし、「通常の」オブジェクトのように文字列インデックスを使用することは通常ありません。これは、そのように使用することを目的としていないためです)。

ただし、オブジェクトは実際にはではありませんArray。コンソールに表示されているものを参照せずに、好きなことを行うことができます。

于 2012-10-29T09:49:18.240 に答える
3

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;
},
// ...
于 2012-10-29T09:50:36.963 に答える
2
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

于 2012-10-29T09:58:55.290 に答える
0

作成されたオブジェクトは配列ではありませんが、長さフィールドとspliceメソッドがあるため、1つとして動作します(ただし不変です)。

JavaScript配列でlengthは、配列が更​​新されるとフィールドが自動的に更新されます。これは、オブジェクトには当てはまりません。オブジェクトでは、オブジェクトに何が含まれていても、lengthフィールドは残ります。3これは、インデックスを0、1、3に変更すると機能しなくなる理由でもあります。この場合、長さフィールドはでは4なくである必要があり3ます。値は3インデックス2の後で停止するため、インデックス2の値を設定しなかったため、実際には未定義です。

于 2012-10-29T10:03:09.040 に答える