JavaScript中“+”的陷阱

以下运算

1
{}+{}

结果是什么?稍等..

 

先了解下+运算符。JavaScript中运算符 “+” 很简单,有两种意思

1,字符串连接

2,数字相加

运算时其它值都将转换成这两个类型。

JavaScript中有基本类型(undefined, null, booleans, numbers, strings)、对象类型(objects, arrays)和函数类型(functions)。类型转换时先将对象/函数类型转换成基本类型。然后在根据运算符“+”转成字符串或数字。

 

其它基本类型转成数字 有如下规则

1
2
3
4
5
Number(undefined) // NaN
Number(null)      // 0
Number(true)      // 1
Number(false)     // 0
Number('1')       // 1

 

其它基本类型转成字符串 有如下规则

1
2
3
4
5
String(undefined) // "undefined"
String(null)      // "null"
String(true)      // "true"
String(false)     // "false"
String(1)         // "1"

 

回到上面的题目 : {}+{}

1,先将两个对象直接量转成基本类型,{}的valueOf()还是自己。如下

1
2
var obj = {};
obj.valueOf() === obj; // true

 

2,转成字符串,{}的toString()是“[object Object]”

最后两个字符串连接的结果是“[object Object][object Object]”。

 

结果真是这个吗?在浏览器的控制台中测试不是,是NaN。

 

真让人匪夷所思,前面一路推理下来最后竟然不对。

其实原因是第一个{}并非表示对象直接量,而是语句块的意思。参考:Javascript中大括号“{}”的多义性

 

即第一个大括号是语句块,该语句块中没有任何执行语句,可以忽略。演变是这样的

1 {}+{}

2 +{}

3 +"[object Object]"

4 NaN

 

恍然大悟了,加个小括号强制将第一个大括号转成对象直接量 。结果就是期望的了。如

1
({}+{})

这时将输出

 

补充:node环境中 {}+{} 输出的是“[object Object][object Object]” 却不是 NaN

 

posted on   snandy  阅读(2232)  评论(11编辑  收藏  举报

编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端
历史上的今天:
2011-03-02 JavaScript1.6数组新特性和JQuery的几个工具方法
2011-03-02 返回两个数组中非相同的元素
2011-03-02 利用JS的动态语言特性对数组排序
2011-03-02 Javascript变量作用域
< 2012年3月 >
26 27 28 29 1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
1 2 3 4 5 6 7

统计

点击右上角即可分享
微信分享提示