JavaScript最牛逼代码语句

下面这段代码是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

最后,我想说的是如果你从一开始就明白了还看到这,那你是真正的

(![] + [])[+!![] + !![] + !![]] + ([] + {})[+!![] + +!![]]

我的朋友,你是真正的

(![] + [])[+!![] + !![] + !![]] + ([] + {})[+!![] + +!![]]

在这里插入图片描述


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部