【问题标题】:Using bracket notation on a JavaScript number在 JavaScript 数字上使用括号表示法
【发布时间】:2020-11-17 08:06:43
【问题描述】:

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

这是否类似于在 "FOO".toLowerCase() 这样的字符串文字上调用方法,其中首先将字符串强制转换为对象,然后调用 toLowerCase?有人可以向我解释这里发生了什么吗?

【问题讨论】:

  • 这只是property accessor 的标准行为。这适用于任何类型。
  • 是的,它与您的字符串文字示例相同。试试,例如100["toExponential"]()。但是,代码100[0] 并没有真正的意义——你不能从数字中获得数字属性。除非 Number.prototype 被更改。

标签: javascript indexing prototype


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-18
    相关资源
    最近更新 更多