我对一个思想实验有点困惑,现在我正在寻找一些建议。它关于 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和Activation Object中的内部存储的对象引用。