摘要:本文将介绍一段使用隐式类型转换输出的代码,并讲解具体的转换过程。代码转换过程我们分四部分讲解具体的转换过程,一个空数组,紧跟在数组后面的的语义应该是表示属性操作,类似于中的作用,而不是表示数组。
本文将介绍一段使用JavaScript隐式类型转换输出"nb"的代码,并讲解具体的转换过程。
预备知识请先阅读文章ECMAScript7规范中的ToPrimitive抽象操作。
代码([][[]]+[])[+!![]]+([]+{})[!+[]+!![]] // "nb"转换过程
我们分四部分讲解具体的转换过程:
([][[]]+[])
[+!![]]
([]+{})
[!+[]+!![]]
([][[]]+[])[],一个空数组;
[[]],紧跟在数组后面的[的语义应该是表示属性操作,类似于obj[key]中[]的作用,而不是表示数组。这个里面,既然外层的[]表示获取属性的运算符,里面的[]肯定就表示key了。因为key是原始数据类型,所以会调用ToPrimitive抽象操作把[]转化为原始数据类型,也就是空字符串"",所以上面两个结合起来就是:
var a = [] var b = [] a[b] // => a[""] => undefined
+,相加操作;
[],空对象,和上面的步骤结合起来就是:
undefined + []
相加操作会把操作符两边的操作数通过ToPrimitive抽象操作转化为原始数据类型,也就是[]会变为"":
undefined + ""
相加操作的抽象步骤中,如果有一个操作数是字符串,会调用ToString抽象操作把两个操作数都转化为字符串类型,也就是:
undefined + "" // => "undefined" + "" => "undefined"
综上,([][[]]+[])的结果就是字符串"undefined"。
[+!![]]!![],表示把一个数据转化为布尔类型,因为[]是一个真值,所以!![]的结果是true;
+!![],表示把前面的结果转化为数字类型,也就是+true,true转化为数字是1,所以+!![]的结果是1;
[+!![]],也就是[1],结合第一部分([][[]]+[])的结果:
([][[]]+[])[+!![]] // => "undefined"[1] => 也就是获取字符串"undefined"的第二个字符,也就是"n" => "n"([]+{})
相加操作会调用ToPrimitive抽象操作把操作符两边的数据转化为原始数据类型,也就是:
([]+{}) // => "" + "[object Object]" // => "[object Object]"[!+[]+!![]]
+[],把数组转化为数字:
+[] // => +"" => 0
!+[],也就是!0:true;
!![],true;
!+[]+!![],也就是true + true,又是相加操作,因为操作符两边都是布尔类型,所以会转化为数字类型,也就是1 + 1,也就是2;
第三部分和第四部分的结果结合起来就是:
([]+{})[!+[]+!![]] // => "[object Object]"[2] => 也就是取字符串"[object Object]"的第三个字符,也就是"b" => "b"
第一二部分和第三四部分结合起来的结果就是:
([][[]]+[])[+!![]]+([]+{})[!+[]+!![]] // => "n" + "b" => "nb"总结
希望大家看的开心!如果本文有什么错误或者不严谨的地方,欢迎在评论区留言。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/97601.html
本篇文章主要是讲述在JavaScript中判断两个值相等,不要认为很简单,要注意的是在JavaScript中存在4种不同的相等逻辑。 ECMAScript 是 JavaScript 的语言规范,在ECMAScript 规范中存在四种相等算法,如下图所示: 上图中每个依次写下来,很多前端应该熟悉严格相等和非严格相等,但对于同值零和同值却不熟悉,现在就依次下面四种方法。 同值 同值零 非...
要是别人问您:如何让 x 等于 1 且让 x 等于 2 且让 x 等于 3 的等式成立? 咋地,知道如何实现?想骂人有不 现在我们一起来分解思路: 我们先来讲讲宽松相等== 和严格相等 ===,这两个都能用来判断两个值是否相等,但们明确上文提到的等于指的是哪一种,二者的区别看下: (1) 这两个基础直接的区别: (1.1) 不同类型间比较,== 比较转化成同一类型后的值看值是否相等,...
摘要:为了避免某些场景下的意外,甚至推崇直接使用来代替。使用了运算符的一些规则,发生了类型转换。按照以下规则转换被传递参数直接返回直接返回直接返回直接返回直接返回返回一个对象的默认值。 前言 类型转换在各个语言中都存在,而在 JavaScript 中由于缺乏对其的了解而不慎在使用中经常造成bug被人诟病。为了避免某些场景下的意外,甚至推崇直接使用 Strict Equality( === )...
摘要:私有网络下批量部署多台云主机本篇目录摘要摘要拓扑图拓扑图操作步骤操作步骤参考文献参考文献关键词摘要云主机是构建在云环境的弹性计算资源,是最为核心的服务。私有网络下批量部署多台云主机本篇目录摘要拓扑图操作步骤参考文献关键词:UHost,VPC,Subnet摘要云主机是构建在云环境的弹性计算资源,是 UCloud 最为核心的服务。有些服务,如弹性 IP、镜像、云硬盘等必须与云主机结合后使用,另一...
阅读 2020·2021-11-19 09:58
阅读 1666·2021-11-15 11:36
阅读 2836·2019-08-30 15:54
阅读 3334·2019-08-29 15:07
阅读 2727·2019-08-26 11:47
阅读 2658·2019-08-26 10:11
阅读 2465·2019-08-23 18:22
阅读 2705·2019-08-23 17:58