JavaScript在比较的时候,会进行隐式转换,你若是对隐式转换不是特别熟悉,结果每每出乎你的意料。
咱们来看看这行代码segmentfault
(![]+[])[+!![]- -+!![]- -+!![]]+({}+[])[+!![]]+(![]+[])[+!![]- -+!![]- -+!![]]
这行代码的结果可能出乎你的意料,看结果 spa
结果竟然是sos,这就是为何会给文章这样一个题目了,这行代码看上去彷佛是乱七八糟的,可是相信你看完这篇文章,必定能本身写出这样的代码来。code
相信我,这行代码是简单的,它并不复杂,咱们先来分解一下这行代码对象
(![]+[])[+!![]- -+!![]- -+!![]] //s + ({}+[])[+!![]] //o + (![]+[])[+!![]- -+!![]- -+!![]] //s
咱们把这一行,分解成了3行了。blog
先看第一行(![]+[])[+!![]- -+!![]- -+!![]]
这行还能分红两部分图片
(![]+[]) [+!![]- -+!![]- -+!![]]
咱们继续看这分开的两部分(![]+[])
看看这个是什么意思
友情提示:
[ ] 转为布尔值是 true
[ ] 转为字符串是 ""
ip
若是想知道为何,推荐看看下面的两篇文章。
简单说 JavaScript中的tostring( ) 与 valueOf( )方法
简单说 !![]==true 与 []==true 引起的思考 rem
![ ] 就是false (![]+[])
会转为这个样子 (false+"")
结果就是"false",字符串类型的哦!字符串
[+!![]- -+!![]- -+!![]]
这个又是什么意思呢?
咱们能看见 +!![]
这个东西是什么,竟然出现了三次 +!![]
,!的优先级最高,先算 !![ ],!![ ] 是对 [ ]进行了布尔值的转换,最后结果就是true,最后在往前面来个+,就成了+true
这样,进行隐式转换,把true转为数字,就是1,好了,+!![]
就是 1 的意思,咱们用1来替换一下代码,看看变成了什么样子[1- -1 - -1]
,我相信你们都能算出这么简单的正数 减 负数 减 负数 的结果来,全部最后的结果是[3]
get
好的,咱们把第一行的这两个部分放在一块儿看看 "false"[3]
,这下明显了吧!字符串的第3个字符,这样就有s了
继续看第二行({}+[]])[+!![]]
咱们一样拆成两部分
({}+[]]) [+!![]]
第一部分 ({}+[])
( )里面的{},不是语法上的花括号,不是语句块的意思,而是表示了一个空对象,这里相加的时候会调用对象的toString()方法,因此它会转为"[object Object]",字符串类型的哦!
[ ],它一样也会调用toString()方法,因此[ ],会转为"",也就是一个空字符串。
这两个结果放在一块儿就是"[object Object]"+""
,最后结果是"[object Object]"
。
第二部分 [+!![]]
上面咱们已经知道+!![]
是 1 的意思,因此最后的结果就是[1]
好的,咱们把第二行的这两个部分放在一块儿看看"[object Object]"[1]
,这样咱们就看的很清楚了,o也有了
最后的第三行,和第一行如出一辙,好的咱们用 + ,把这三行的结果拼接起来就是 "sos" 了。
最后用张图总结一下
相信如今,你应该是理解上面的代码了,写这个代码,也主要是想理解理解隐式转换,题目是开玩笑的,但愿你们永远不会真的遇到须要这样的代码的关键时刻。
最后推荐两篇相关的文章,但愿对你们有所帮助。
简单说 JavaScript中的tostring( ) 与 valueOf( )方法
简单说 !![]==true 与 []==true 引起的思考