javascript - 在 JavaScript 数字上使用括号表示法
问题描述
我正在阅读某人在编码论坛上提交的代码。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。(请注意,我们只能通过强制创建数字实例来观察这些行为,自动装箱不会发生在除相等检查之外的任何事情上)。
推荐阅读
- react-native-android - REACT-NATİVE - jarsigner 错误:java.lang.RuntimeException:密钥库加载:密钥库被篡改,或密码不正确
- php - 如何在 STRIPE API 中获取客户的失败发票列表?
- java - 在这种情况下使用泛型时如何让spring注入正确的bean?
- git - 如果源(功能)分支在不久之后被删除,那么 --squash 合并和 --no-ff 合并之间有区别吗?
- node.js - 在 Node.js 项目中解析 OpenXML Office 文档
- c# - SSIS 错误 - 找不到脚本的二进制代码
- xamarin - 如何解决“无法解析主机”错误?
- swift - 带有 SF 符号的 HStack 图像未居中对齐
- javascript - React Hook 组件不会在导入的数组更改时更新
- java - Jodatime畸形即使看起来正确