首页 > 解决方案 > 在 JavaScript 数字上使用括号表示法

问题描述

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

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

标签: javascriptindexingprototype

解决方案


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

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

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

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


推荐阅读