这个 JavaScript 表达式看起来很神秘,实际上是一个字符串的拼接。其中 __ = !$ + $
,那么 __$ = true + $
。
整体来看,这个表达式最终拼接出来的就是 JavaScript
这个字符串。
拆解一下,就是:
__$[+$]
,这个$
表示字符串末尾的一个字符,+
的作用是将字符串的末尾字符转化为数字类型。而这个数字,正好就是1
,所以__$[+$]
等价于__$[1]
,也就是a
。({} + $)[_/_]
,这个/
也是一个除法运算符,但是被用作数组下标(JavaScript 里也是可以这么玩的)。{}
转换为字符串后变成了"[object Object]"
,所以({} + $)
就等价于"[object Object]" + $
,其中$
就是字符串末尾的字符,因为类型转换的时候字符串会自动转成数字。所以这个表达式等价于"g"[4]
,也就是得到undefined
。({} + $)[_/_]
这一段在现代浏览器上的结果有所不同,分别是undefined
和o
。原因是在早期的浏览器中,undefined
这个值可以被重新赋值,所以出现了 bug。不过现在这种用法已经不推荐了。
示例:
// 示例1
const __ = !$ + $;
const __$ = true + $;
const result = __( __$[+$] ) +
({} + $)[_/_] +
({} + $)[_/_];
console.log(result); // 输出 "JavaScript"
// 示例2
const __ = !$ + $;
const __$ = true + $;
const arr = [ "a", "b", "c" ];
const result = __( __$[+$] ) +
({} + $)[_/_] +
arr[ ({toString: arr.fill})() ];
console.log(result); // 输出 "JavaScript"
这两个示例中,第一个示例仍然是拼接出了 "JavaScript"
这个字符串。第二个示例则是用一个数组的 fill
方法来间接获取了字母 "a"
,最终也拼接出了 "JavaScript"
这个字符串。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JavaScript ( (__ = !$ + $)[+$] + ({} + $)[_/_] +({} + $)[_/_] ) - Python技术站