锁定老帖子 主题:JavaScript中“+”的陷阱
精华帖 (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
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2012-02-24
真的是蛋疼的问题啊·1
|
|
返回顶楼 | |
发表时间:2012-02-24
坑爹的测试题。。。
|
|
返回顶楼 | |
发表时间:2012-02-25
蛮好,蛮好,这类测试题不会是无源之水,大多是复杂问题的导出的表象。
|
|
返回顶楼 | |
发表时间:2012-02-25
这道题即使做对了,也不会证明你的JavaScript水平有多高;即使做错了,也不会证明你的JavaScript水平有多低。
|
|
返回顶楼 | |
发表时间:2012-02-25
面试题出这个意义的确不大,有点偏。
不过确实这些都是特基础的JS知识。 |
|
返回顶楼 | |
发表时间:2012-02-25
其实操作符的确是一个很给力的东西,转换数字类型你不在需要parseInt什么的,轻轻的一个 + 就解决你的问题。
+ "34343" + 123 "34343" + 123 解决了你的很多问题~~ |
|
返回顶楼 | |
发表时间:2012-02-26
如果应聘者回答“[object Object][object Object]”,基础知识也应该达到水平了
|
|
返回顶楼 | |
发表时间:2012-02-26
让做题的人对结果从ECMAScript规范角度给出个合理的解释就行,毕竟这个也有点信赖运行环境
|
|
返回顶楼 | |
发表时间:2012-02-27
真的蛋疼。
这个运算结果,基本上源于当年标准制定不完善——也不能怪标准,没事谁这样子写代码——甚至有可能随着标准的完善,运行结果真的合成“[object Object][object Object]” 让我想到一个故事:招聘司机,问三人能把汽车停在悬崖边多远。回答1米和50厘米的都被淘汰了。因为第三个的回答很简答:“我会把车开的离悬崖越远越好” |
|
返回顶楼 | |