【发布时间】:2012-09-19 02:32:51
【问题描述】:
我对一个思想实验有点困惑,现在我正在寻找一些建议。它是关于 ECMAscript 引用和Array.prototype.indexOf() 方法的。
让我们开始吧:
var container = [ ];
// more code
container.push( 5 );
container.push( 7 );
container.push( 10 );
所以现在我们将一些“原始值”推入到我们的 ECMAscript 数组中(无论该声明是否正确,我都会回来讨论),至少到目前为止我是这样想象的。来电
container.indexOf( 7 );
将按预期返回1。我遇到的一个大问题是,如果 .indexOf() 真的比较原始值,或者实际上是否创建了一个 Number() 对象并存储了它,并且它的 reference 正在被比较。如果我们像这样重写它,这会变得更加明显:
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 );
在这里,我们用 object-references 填充了该容器数组,但 .indexOf() 仍按预期工作
container.indexOf( b ) // === 1
在这样的通话中
container.indexOf({ name: 'b', value: 10 });
显然返回-1,因为我们正在创建一个新对象并获得一个新引用。所以这里它必须在内部相互比较引用,对吧?
一些 ECMAscript 规范天才可以确认或更好地链接我一些关于此的材料吗?
关于此的一个附带问题是,是否有任何可能的方法来访问 lexicalEnvironment 中的内部存储的对象引用,分别为 Activation Object。
【问题讨论】:
-
如果这在与其他语言类似的任何地方都可以工作,那么
indexOf适用于对象散列,其中对象通常具有不同的值,而原始对象通常具有基于其值的恒定散列(对于整数,这是非常通常只是整数值本身)。所以两个 int 对象5和5都有哈希5,因此是“相同的”。 -
我开始写一个答案,但后来它变成了一篇博文,所以我停下来,不愿重新写它。但如果你有兴趣:pastie.org/4828933
标签: javascript arrays reference specifications ecmascript-5