JavaScript-js {}+{} 的结果

JavaScript-js {}+{} 的结果

浮生未歇 发布于 2016-11-28 字数 144 浏览 1216 回复 1

在社区看到一个很有意思的 js 问题

{} + {} = ?

求 ? 为什么是这样呢...

个人觉得弄明白这个问题 对js的理解很有帮助 ...

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

浮生未歇 2016-12-05 1 楼

Js代码

{}+{}

结果是什么?

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

1,字符串连接
2,数字相加

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

JavaScript中有基本类型(undefined, null, booleans, numbers, strings)、对象类型(objects, arrays)和函数类型(functions)。

类型转换先将对象/函数类型转换成基本类型。然后在根据运算符“+”转成字符串或数字。

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

Number(undefined) // NaN

Number(null) // 0

Number(true) // 1

Number(false) // 0

Number('1') // 1

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

Js代码

String(undefined) // "undefined"

String(null) // "null"

String(true) // "true"

String(false) // "false"

String(1) // "1"

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

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

Js代码

var obj = {};

obj.valueOf() === obj; // true

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

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

结果真是这个吗?在浏览器的控制台中测试不是,是NaN。
原因是第一个{}并非表示对象直接量,而是语句块的意思。参考:Javascript中大括号“{}”的多义性

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

1 {}+{}
2 +{}
3 +"[object Object]"
4 NaN

网上看到的 详细看下这里JavaScript中“+”的陷阱