下面这段代码是JavaScript中最牛逼的表达式
([][[]] + [])[+!![]] + ([] + {})[+!![] + +!![]]
为什么说这个表达式是最牛逼的表达式呢?我们把它放浏览器内执行一下
输出如下,怎么样,牛不牛逼
那它为什么会输出这么一个玩意儿呢,我们先把它拆解一下
([][[]] + [])[+!![]] + ([] + {})[+!![] + +!![]]
可以看成是两部分
([][[]] + [])[+!![]] +
([] + {})[+!![] + +!![]]
先看上部分
([][[]] + [])[+!![]]
可以看出这是一个取下标的表达式,括号内的
那么具体分析
[][[]] + []
//空数组的第[]个元素,我们都知道[]转成字符串是空字符串也就是''
//那[][[]]的语义就是取空数组的第''个元素,即[]['']
//很明显[]里面没有下标为''的元素
//那么[][[]]值就是undefined
//看到这里相信各位都已经明白
//为什么([][[]] + [])[+!![]] + ([] + {})[+!![] + +!![]]这么个玩意儿为什么会输出'nb'
//闲话少说现在括号内的式子已经变成了undefined+[]
//undefined+[]一个原始类型加上一个空数组
//空数组就也得转成原始类型,那[]就转化成了'',一个空字符串
//undefined+'' 也就是 undefined加字符串,那么就变成了'undefined'
//第一部分的式子也就由
([][[]] + [])[+!![]]
//变为了
'undefined'[+!![]]
//那+!![]一转就是1
// 式子就变为了
'undefined'[1]
// 也就是 'n'
第二部分分析
([] + {})[+!![] + +!![]]
//还是先分析前半段
([]+{})
//空数组加空对象,很明显,又是基础知识 ->类型转换
// 即 '' + '[object object]'
//也就是说
//([]+{}) 转换后是 '[object object]'
//即
'[object object]'[+!![] + +!![]]
//至于后半段就不赘述了,和前面一样
//这时候式子就变成了
'[object object]'[2]
// 输出为 'b'
也就是说
([][[]] + [])[+!![]] + ([] + {})[+!![] + +!![]]
转换后就是
'undefined'[1] + '[object object]'[2]
输出
nb
最后,我想说的是如果你从一开始就明白了还看到这,那你是真正的
(![] + [])[+!![] + !![] + !![]] + ([] + {})[+!![] + +!![]]
我的朋友,你是真正的
(![] + [])[+!![] + !![] + !![]] + ([] + {})[+!![] + +!![]]