javascript - 使用 Array brackets notation 时在 javascript 中发生了什么

标签 javascript arrays operators

我通常发现 javascript 是透明的,因为只有很少的黑框会发生“魔法”,你应该接受并换个 Angular 看,但是我还没有找到数组括号 [] 符号实际上在幕后工作。

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

我看过很多很多在线讨论,所有讨论都得出这样的结论,即您不能重载括号表示法来真正子类化一个数组,但我从来没有看到任何解释,说明在允许数组工作的幕后发生了什么魔法它的方式。

明显的后续问题是是否有任何方法可以拦截括号表示法访问以定义您自己的行为,但我想我已经知道答案了。

最佳答案

您可能需要查看实现代码才能准确了解发生了什么,但基本思想是数组实际上位于对象之上。

这是倒退的:

With an object, the [] is a shortcut for a property accessor.

括号表示法更为基础。因此,obj['foo']obj.foo 的工作方式相同,但是 obj['foo & bar'] 没有等效项>,这是完全合法的,如果 obj 有一个名为 "foo & bar" 的键,它将返回一个值。

Is an array then just an object with a long list of integer based properties?

不完全是,但你离得不远了。数组是具有 Array 原型(prototype)的对象,并且有一点额外的魔法可以在添加新键时设置 length 属性,或者在 length 时删除键 已设置。

不,您不能为了自己的目的而覆盖 [] 运算符。

关于javascript - 使用 Array brackets notation 时在 javascript 中发生了什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50454462/

相关文章:

javascript - 自动从 Gmail 帐户垃圾邮件文件夹中删除包含特定关键字的电子邮件

javascript - 设置函数参数的类型?

arrays - Postgres GROUP BY 整数数组

python - Python 的内置打印为什么/如何允许 ">>"运算符?

javascript - 在JQuery中制作HTML对象后触发事件

java - if 语句的奇怪行为

python - Python 中的数组是按值分配还是按引用分配?

javascript - 使用 == 而不是 === 时的类型转换

powershell - 为什么 `-lt` 对字符和字符串的行为不同?

javascript - 我还需要学习更多的编程语言吗?