javascript - 以下表达式如何计算为 "10"

标签 javascript expression

<分区>

我最近从一个来源看到一个表达式,看起来像下面这样 -

++[[]][+[]]+[+[]]

将此输入到 Chrome(Windows 7,版本 27.0.1453.94 m)控制台会显示 “10” 的结果。

谁能解释一下这里发生了什么?

JSFiddle .

最佳答案

JavaScript 在数据类型之间的转换方面相当灵活。首先要注意的是 +[] 的计算结果为 0.* 这让我们可以将表达式重写为:

++[[]][0] + [0]

接下来要注意的是 ++[[]][0] 是应用于 [[]] 的第一个元素的预递增运算符。通常你不能将 ++ 应用于数组,但是 JavaScript 友好地将第一个元素转换为 0,所以结果是 ++[[]] [0] 的计算结果为 1([[]] 的第一个元素现已递增)。它有点像这样:

var a = [[]];
var b = ++a[0];
// now a will be [1] and b will be 1

这给我们留下了:

1 + [0]

JavaScript 现在将 int 和数组转换为字符串(因为 [0] 不是数值)并将它们连接在一起。完成!

* 我对 +[] 如何变成 0 的理解是它是一个两步过程:首先,[ ] 被转换为字符串原语,即空字符串。然后空字符串转换为数字,即零。通过相同的路径,[1] 计算为 '1' 然后为 1[2] 计算2 等。但是,[1, 2] 的计算结果为 '1,2',后者的计算结果为 NaN。 (最后一个是因为小数点分隔符是.,不是,。我不知道如果我的语言环境不同会发生什么。)

关于javascript - 以下表达式如何计算为 "10",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16850994/

相关文章:

java - 正则表达式 (regex) 不起作用

c# - 从 3 个通用类型中推断出 2 个

java - jSTL 表达式中的默认日期格式

javascript - 使用正则表达式和 Javascript 从字符串中提取值

javascript - 如何强制javascript不使回调函数并行?

javascript - 将 Cordova 插件添加到 Vue-Cordova?

attributes - Thymeleaf:将任意值设置为任意属性

Javascript将SharedArrayBuffer同步到主线程

javascript - 离线 Android GIS App 开发

PHP 代码替换为正则表达式