一道有趣的javascript小题
2013-04-10 15:20
148 查看
在国外网站上看到一道javascript的题目:
++[[]][+[]]+[+[]];
值是多少?
虽然最js的语法还算熟,第一眼看到这个表达式的时候还是晕了.直接运行了一下,结果是字符串"10",
结果有点出乎意料,开始怀疑是不是某个浏览器的bug,又在四个浏览器里面都运行了一遍,均是此结果.
于是从结果开始倒推,推出了一些比较诡异逻辑.
首先+[],相当于Number([]),根据Number函数的转换规则,得到+[]=0;
于是,表达式
1.++[[]][+[]]+[+[]];==>
2.++[[]][0]+[0];==>
3.vari=[[]][0];//相当于取数组[[]]的第一项,也就是[]
++i+[0];==>
4.1+[0];==>
5.1+[0].toString();==>
6.结果"10"
结论:可见数组[]作为一元操作时,+[]相当于Number([]);而作为二元已上被操作数时,1+[],相当于1+[].toString();
javascript处处都是坑,稍不注意就踩进去了,实际工作中应尽量用常规语法,避免二义性,副作用,隐式转换等奇技淫巧
注:以上结论均为推导得出,若有错误,诚请指正!另外下面再给一个类似的例子可以验证下:
(![]+[])[0];
++[[]][+[]]+[+[]];
值是多少?
虽然最js的语法还算熟,第一眼看到这个表达式的时候还是晕了.直接运行了一下,结果是字符串"10",
结果有点出乎意料,开始怀疑是不是某个浏览器的bug,又在四个浏览器里面都运行了一遍,均是此结果.
于是从结果开始倒推,推出了一些比较诡异逻辑.
首先+[],相当于Number([]),根据Number函数的转换规则,得到+[]=0;
于是,表达式
1.++[[]][+[]]+[+[]];==>
2.++[[]][0]+[0];==>
3.vari=[[]][0];//相当于取数组[[]]的第一项,也就是[]
++i+[0];==>
4.1+[0];==>
5.1+[0].toString();==>
6.结果"10"
结论:可见数组[]作为一元操作时,+[]相当于Number([]);而作为二元已上被操作数时,1+[],相当于1+[].toString();
javascript处处都是坑,稍不注意就踩进去了,实际工作中应尽量用常规语法,避免二义性,副作用,隐式转换等奇技淫巧
注:以上结论均为推导得出,若有错误,诚请指正!另外下面再给一个类似的例子可以验证下:
(![]+[])[0];
相关文章推荐
- javascript,一道容易犯错的小题
- JavaScript 的一道有趣考题 (论坛回复摘要)
- 自家人不认识自家人——考你一道有趣的Javascript小题目
- javascript,一道容易犯错的小题
- javascript中有趣的反柯里化技术
- 一道有趣的++运算题目
- 【JS】在地址栏实现的Javascript有趣效果
- 多线程的一道有趣问题
- 由一道题目引出的JavaScript中运算符的优先级问题
- 练习题(4) -- 一道简单而有有趣的题目
- 非常有趣的Javascript特效,能让网页上的图片飞起来
- Javascript中奇怪或有趣以及应该注意的地方
- 看了两个有趣的小题,有点想法
- C#学习小记14求助一道让我头疼的C#小题
- 一道有趣的求符号字符的长度
- JavaScript中有趣的反柯里化
- 一道有趣的笔试题目!
- 一道小题(2)
- 一道有趣的Hash加数学思想
- (转)分享几个有趣的 JavaScript 代码片段