14

私は思考実験と少し混乱していました、そして今私はいくつかのアドバイスを探しています。ECMAscriptの参照とArray.prototype.indexOf()メソッドについてです。

簡単に始めましょう:

var container = [ ];
// more code
container.push( 5 );
container.push( 7 );
container.push( 10 );

そこで、ECMAscript配列にいくつかの「プリミティブ値」をプッシュしました(そのステートメントが真であるかどうかにかかわらず、私は戻ってきます)、少なくともこれまでのところ、このように想像していました。への呼び出し

container.indexOf( 7 );

期待どおりに戻り1ます。私が抱えている大きな問題は.indexOf()、プリミティブ値を実際に比較するのか、それとも実際にNumber()オブジェクトが作成されて保存され、その参照が比較されるのかということです。このように書き直すと、これはもう少し明白になります。

var a = 5,
    b = 7,
    c = 10;

var container = [ ];

container.push( a );
container.push( b );
container.push( c );

container.indexOf( b );

この時点までは、値を比較するだけでよいと簡単に主張.indexOf()できますが、次のようになります。

var a = { name: 'a', value: 5 },
    b = { name: 'b', value: 10 },
    c = { name: 'c', value: 15 };

var container = [ ];
// more code
container.push( a );
container.push( b );
container.push( c );

ここでは、そのコンテナ配列をオブジェクト参照で埋めましたが、それでも.indexOf()期待どおりに機能します

container.indexOf( b ) // === 1

このような呼び出し中に

container.indexOf({ name: 'b', value: 10 });

-1新しいオブジェクトを作成して新しい参照を取得しているので、明らかに戻ります。したがって、ここでは、参照を相互に内部的に比較する必要がありますね。

ECMAscript仕様の天才の中には、それについての資料を確認したり、さらに適切にリンクしたりできますか?

これに関する副次的な質問は、lexicalEnvironmentまたはActivationObject内の内部に保存されたオブジェクト参照にアクセスする方法があるかどうかです。

4

3 に答える 3

8

つまり、演算子indexOf()と同じアルゴリズムを使用して、各配列プロパティと順番に比較することになります。===

ECMAScript 5仕様の関連セクションは、セクション15.4.4.14、ステップ9、セクションb(私の強調表示)です。

kPresentがtrueの場合、

私。elementKを、引数ToString(k)を使用してOの[[Get]]内部メソッドを呼び出した結果とします。

ii。searchElementとelementKに厳密な等式比較アルゴリズムを適用した結果も同じです。

iii。同じことが当てはまる場合は、kを返します。

参照:

于 2012-09-27T10:31:52.367 に答える
2

これがすべてのECMAScript実装で保証されているかどうかはわかりませんが、Mozillaのドキュメントには、比較を行うために厳密な等式を使用していると記載されています(===)。そのため、これは、プリミティブの値では比較しますが、オブジェクトの参照では比較して、説明した動作を示します(厳密な等式を参照)。

于 2012-09-27T10:25:33.693 に答える
0

@ティムダウンは正しいです。indexOf厳密な比較を行います。valueOf関数をオーバーライドすることでこれをデモンストレーションしています

var MyObject = function(n, v){
   this.name = n;
   this.value = v;
}

MyObject.prototype.valueOf = function(){
    return this.value;
}

var a = new MyObject("a", 5);
var b = new MyObject("b", 10);
var c = new MyObject("c", 15);

var container = [ ];

container.push( a );
container.push( b );
container.push( c );

console.log(b == 10); // true
console.log(container[1] == 10); // true

console.log(b === 10); // false
container.indexOf(10); // -1
于 2012-09-27T10:49:31.660 に答える