论坛首页 Web前端技术论坛

JavaScript中“+”的陷阱

浏览 8127 次
精华帖 (5) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2012-02-22   最后修改:2012-02-25

先给出示例,据说是某公司的测试题

 

{}+{}

 

结果是什么?

 

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

 

1,字符串连接

2,数字相加

 

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

 

 

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

 

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

 

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

Number(undefined) // NaN
Number(null)      // 0
Number(true)      // 1
Number(false)     // 0
Number('1')       // 1
 

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

 

String(undefined) // "undefined"
String(null)      // "null"
String(true)      // "true"
String(false)     // "false"
String(1)         // "1"
 

 

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

 

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

 

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

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

 

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

 

 

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

 

 

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

 

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

 

1 {}+{}

2 +{}

3 +"[object Object]"

4 NaN

 

 

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

 

 

({}+{})
 

这时将输出

 

 

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

 

(续)

 

  • 大小: 5.4 KB
  • 大小: 2 KB
   发表时间:2012-02-24  
真的是蛋疼的问题啊·1
0 请登录后投票
   发表时间:2012-02-24  
坑爹的测试题。。。
0 请登录后投票
   发表时间:2012-02-25  
蛮好,蛮好,这类测试题不会是无源之水,大多是复杂问题的导出的表象。
0 请登录后投票
   发表时间:2012-02-25  
这道题即使做对了,也不会证明你的JavaScript水平有多高;即使做错了,也不会证明你的JavaScript水平有多低。
0 请登录后投票
   发表时间:2012-02-25  
面试题出这个意义的确不大,有点偏。
不过确实这些都是特基础的JS知识。
0 请登录后投票
   发表时间:2012-02-25  
其实操作符的确是一个很给力的东西,转换数字类型你不在需要parseInt什么的,轻轻的一个 + 就解决你的问题。
+ "34343" + 123
"34343" + 123
解决了你的很多问题~~
0 请登录后投票
   发表时间:2012-02-26  
如果应聘者回答“[object Object][object Object]”,基础知识也应该达到水平了
0 请登录后投票
   发表时间:2012-02-26  
让做题的人对结果从ECMAScript规范角度给出个合理的解释就行,毕竟这个也有点信赖运行环境
0 请登录后投票
   发表时间:2012-02-27  
真的蛋疼。

这个运算结果,基本上源于当年标准制定不完善——也不能怪标准,没事谁这样子写代码——甚至有可能随着标准的完善,运行结果真的合成“[object Object][object Object]”

让我想到一个故事:招聘司机,问三人能把汽车停在悬崖边多远。回答1米和50厘米的都被淘汰了。因为第三个的回答很简答:“我会把车开的离悬崖越远越好”
0 请登录后投票
论坛首页 Web前端技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics