在 JavaScript 中,通过执行一些奇怪的操作,有时可以得到出乎意料的结果。其中一个例子是使用双重方括号和单个方括号来获取一个看似不可能的值。
下面我们来看这个问题的具体情况。
双重方括号
首先,让我们看看双重方括号 [[ ]]
的含义,它其实是一个用于创建对象字面量的简写语法。例如,以下两个对象是等价的:
-- -------------------- ---- ------- ----- ---- - - ---- ------ ---- ----- - ----- ---- - - -------- ------ -------- ----- -
这两种写法都会创建一个包含 foo
和 baz
属性的对象,它们的值分别为 'bar'
和 'qux'
。
单个方括号
接下来,让我们看看单个方括号 [ ]
的含义,它是用于访问 JavaScript 对象属性的语法。例如,以下代码将打印出对象 obj
的 foo
属性的值:
const obj = { foo: 'bar' } console.log(obj['foo']) // 输出 "bar"
如果知道属性名,则可以使用点号 .
来访问该属性:
const obj = { foo: 'bar' } console.log(obj.foo) // 输出 "bar"
现在,我们来看看为什么 [[]] []
表达式会返回字符串 "10"
。
首先,让我们考虑 [[]]
。这个表达式是一个包含一个空数组的数组。它等价于以下代码:
const arr = [] const outerArr = [arr]
接下来,我们使用这个结果对象 outerArr
来执行 [ ]
运算符。因为 []
运算符是用于获取对象属性的语法,所以 JavaScript 会将 outerArr
隐式地转换为一个字符串,即 outerArr.toString()
。
通常情况下,当一个对象被隐式转换为字符串时,它的类型会变成 "[object Object]"
。但是,JavaScript 对象有一个特殊的方法 toString()
,可以被覆盖,从而更改对象被隐式转换为字符串时的输出。
当我们调用一个空数组的 toString()
方法时,它将返回一个空字符串 ""
。所以,在这个例子中,outerArr.toString()
的结果就是 ""
。
但是,我们并没有结束。当我们使用 []
运算符来访问一个字符串的某个字符时,它会将该字符串视为类似数组的对象,并返回相应索引处的字符。例如,以下代码将输出 'f'
:
const str = 'foo' console.log(str[0]) // 输出 "f"
因此,当我们使用 []
运算符来访问字符串 ""
的第一个字符时,它会返回 "1"
。这是因为在 ASCII 码表中,数字字符 '1'
的编码是 49
,而空字符串的编码是 0
。
综上所述,[[]] []
表达式返回的字符串是由空数组转换而来的空字符串的第一个字符,即数字字符 '1'
,后面紧跟着数字字符 '0'
。
总结
虽然 [[]] []
这个表达式看起来非常奇怪,但它其实涉及到了 JavaScript 中对象字面量和属性访问的一些特殊语法。通过深入理解这些语法,我们可以更好地理解 JavaScript 并写出更高效、更优雅的代码。
最后,我们再次提醒大家,在实际开发中请
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/7265