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 规范天才可以确认或更好地链接我一些关于此的材料吗?

一个附带的问题是,是否有任何可能的方式来访问lexicalEnvironmentActivation Object中的内部存储的对象引用。

4

3 回答 3

8

它归结为indexOf()使用与运算符相同的算法依次比较每个数组属性===

ECMAScript 5 规范的相关部分是第 15.4.4.14 节,第 9 步,第 b 节(突出显示我的):

如果 kPresent 为真,则

一世。令 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

@Tim Down 是对的。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 回答