今天看到如标题所示的一个问题,有人给出了如下解决方案:
([]+![])[+!![]]
有没有大神能解释一下原理啊
就是false
的第二个字符咯;数组隐藏的魔法,这货我有次恰好碰到过
@DevinXian 为什么+true会等于1呢
@backcj 加号会做隐式转换,将非数字转为数字,例如: +"666"
有何意义?
@AlphaTr 也就相当于是Number()? 才知道原来Number(true)是等于1而不是NaN
@leonzhao 猜到了有人会这么问
这个知识点是要掌几种一元运算符,作用于js对象的时候,转换的规则是怎样,这需要仔细去看语言规范是怎么说的,说实在话,抠这种东西不如看一下数据结构与算法,呵呵。 例如我也能出一道题:不使用数字和字母,如何输出’N’, 答案:((-{})+[])[+![]]
空数组 转换成 数字 对应的是 0 空数组 转换成 布尔 对应的是 true 。。。。 任意值转换成数字的 隐式方法 -somevalue +somevalue(not somevalue+somevalue)
所以题目 转换 []+![] 首先执行![] 转换成布尔值 false []+布尔 统一变成 [].toString()+“false”; []对应字符串是“” 所以变成false [+!![]] [] 对应的布尔值是 true !是逻辑符号 非 所以![] ,[]转换成布尔值true,![] 就是false。 !![]就是true。 +true 转换成数字 true对应数字1 题目一最后执行:(“false”)[1] 对应是输出a。 废话很多。。。。 然后就会很纠结一个问题 [] 是神马情况 [] 对应 true ?? [] 对应 0 wtf… var arr = []; console.log(‘Array:’, arr); if (arr) console.log(“It’s true!”); if (arr == false) console.log(“It’s false!”); if (arr && arr == false) console.log("…what??"); 请自己看ecma标准 感觉解释的非常清楚。。懒得翻译了。。