有这么一些人,在这里进行了这样一个有点“无聊”的讨论和思考。如何在javascript中利用有限的非阿拉伯数字和字母的其他字符来得到阿拉伯数字和字母?
比如:只允许使用 []()+ 如何得到Number “1”。讨论同样也吸引了像jeresig这样的js界达人的参与。
有人提交了这样的答案 ++[[]][+[]] == 1,现在就来看看++[[]][+[]]是如何等于1的。
要搞明白这玩意,需要知道Javascript是一门弱类型语言,同样,它可以进行强制类型转换,而且挺重要,经常需要用到。数值可以转换成字符串,字符串也可以转换成数值,数组也可以变成字符串。
比如
return String( [] ); // return "" return Number( "" ); // return 0; return ""-1; // return -1; return []-1; // return -1;
同样 ++ 也具有把其他类型转换成数值的能力,比如:
var a = []; ++a; // 1
这时候也许我们马上就想到了为什么不用 ++[] 来得到1 呢?测试一下,结果发现抛出一个异常,稍加研究,知道了,在这里,[]其实只是一个临时的存在,++完了结果发现怎么也找不到对象来返回结果,因此会抛出一个错误。那怎么办呢?
这里我们可以预先定义好一个变量来存储 ++ 后 的返回结果,比如数组。
++[ [] ][ 0 ]; // 1
也许有一点纳闷,但如果这样写肯定就清楚了。
var a = [ [] ]; ++a[ 0 ]; // 1
到这里,差不多就接近我们的目标了。如何把0换掉呢?0是我们规则里不允许使用的。对比标题,我知道了可以这样写得到0。
+[]; // 0
这个比较好理解了,[]返回字符串””,+则会把””转换成数值0;
ok,到了这里,算是搞明白了为什么 ++[ [] ][ +[] ] 等于1了。