我一般发现JavaScript很透明,因为很少有“魔法”发生的黑盒子,你只需接受并看向其他方面。然而,我并没有找到关于数组括号[]
符号在底层实际是如何工作的答案。
let arr = [4, 5, 6, 7]
console.log(arr[3]) // <- How does this work?
JavaScript如何访问索引为3的项?它是否在Array.prototype上内部调用某些方法?
对于对象,[]是属性访问器的一种快捷方式。
let obj = {
a: 'hello',
b: 'world'
}
obj['a'] === obj.a // true
数组只是一个具有一长串基于整数的属性的对象吗?
let objArray = {
0: 'hello',
1: 'world'
}
let realArray = ['hello', 'world']
objArray[0] === 'hello' // true
realArray[0] === 'hello' // true
objArray.0 // SyntaxError: Unexpected number
realArray.0 // SyntaxError: Unexpected number
我看过很多关于如何真正子类化一个数组的网络讨论,最终得出的结论是无法重载括号符号,但我从未见过有关在幕后发生了什么神奇的事情,使数组能够以这种方式工作的解释。
显然的后续问题是是否有任何方法截取括号符号访问以定义自己的行为,但我认为我已经知道答案了。
[ ]
is an operator. I imagine if you could overload operators, you could customize what's happening under the hood. I imagineobjArray.'0'
would work as the key is a string, but after trying, it does not. Using it as the key does work, however:objArray[0] === objArray['0']
- Maximilian BurszleySymbol.Iterator
,以便在for...of
循环中使用我的新列表实例,或者使用展开运算符...list
或解构let [a, b, c] = list
。就所有目的而言,我有了一个漂亮的新数据类型。唯一不能做的事情是使用方括号表示法访问单个桶。我希望能够做类似于Symbol.Iterator
的事情,这样我就可以为list[0]
等定义自己的行为。 - Michael Sutherland