在 JavaScript 数字上使用括号表示法

Using bracket notation on a JavaScript number

我正在阅读某人在编码论坛上提交的代码。我在他的代码中遇到了类似 100[0] 的东西。我预计 JavaScript 会抛出错误,但令我惊讶的是 undefined。我知道括号表示法用于对象、数组和字符串,但奇怪的是它在与数字一起使用时不会抛出。

这是否类似于在 "FOO".toLowerCase() 之类的字符串文字上调用方法,其中字符串首先被强制转换为对象,然后调用 toLowerCase?谁能给我解释一下这是怎么回事?

虽然像 12 这样的数字在 javascript 中是原语,但您仍然可以访问它的属性。查看 Number API Reference 了解数字具有哪些类型的属性。

例如,(2).toString() 将产生 '2'2['toString']() 也会如此。这应该有助于解释为什么这种语法仍然有效。

使这成为可能的是一种称为“装箱”的技术。大多数时候,在处理数字时,我们不会访问数字的属性或方法,因此运行时将只使用原始值来保持快速。但是,当我们尝试访问数字上的 属性 之类的 toString() 时,将自动为该数字创建一个临时实例,以便您可以访问 属性.

这主要是一个不可见的过程,但它的人工制品在语言中很明显。例如,比较两个基元 2 === 2 为真。但是,如果我们强制使用 Number 构造函数进行装箱,new Number(2) === new Number(2),那么我们将比较两个数字对象,并且这些对象遵循与任何其他对象相同的规则,因此这实际上将计算为 false。 (请注意,我们只能通过强制创建数字实例来观察这些类型的行为,自动装箱永远不会发生,除了相等性检查)。