相等运算符用于检查两个操作数是否相等,并返回结果。
所用算法(抽象相等比较算法)概括:
- 如果两个操作数所属数据类型不同,则会在比较前将他们转换为相同类型的数据。
- vs :尝试将字符串转换为数字值。
- vs :将布尔值转换为1或0。
- vs &:尝试使用和方法将对象转换为原始值。
- 如果两个操作数所属数据类型相同,则按如下规则进行比较:
- :仅当两个操作数具有相同顺序的相同字符时才返回。
- :仅当两个操作数具有相同的值时才返回。+0并被-0视为相同的值。如果任一操作数为,则返回。
- :仅当操作数为两个或两个时才返回。
- :仅当两个操作数有相同的引用时才返回。例如:
全等运算符 (===) 会检查它的两个操作数是否相等,并且返回一个布尔值结果。与相等运算符不同,全等运算符并不自动进行类型转换,所以总是认为不同类型的操作数是不同的。
所用算法(全等比较算法)概括:
- 如果两个操作数的类型不同,则返回。
- 如果两个操作数都是对象的引用,则当他们指向同一个对象时才返回。
- 如果两个操作数都为,或都为,则返回。
- 如果两个操作数有任意一个为,则返回。
- 以上条件均满足时,比较两个操作数的值。
全等运算符(===)与相等运算符(==)最显著的区别是,如果操作数的类型不同,== 运算符会在比较之前尝试将它们转换为相同的类型。
ECMAScript的数据类型分为两类:基本类型值和引用类型值。进行赋值操作时,解析器必须清楚该值为哪个类型的数据。
基本数据类型是按值访问的,所以可以直接操作保存在变量中的值。
引用数据类型的值是保存在内存中的对象。在JavaScript中,不允许直接操作对象的内存空间。例如复制对象时,实际上是复制的对象的引用。但是为对象添加属性时,操作的时实际的对象。
浅比较,即检查引用是否相等。在JavaScript中,===作浅比较,即检查两个操作数是否为同一个对象的引用。例如:
深比较,即检查两个对象的所有属性是否相等,但不关心两个对象是否为同一个对象的引用。深比较需要以递归的方式遍历两个对象的所有属性,操作比较耗时。
- 浅拷贝:复制对象的所有变量都含有与原来的对象相同的值,改变任何一个对象,其他对象的值都会被改变
- 深拷贝:不仅将原对象的各个属性复制过来,而且对原对象所包含的各个属性中的对象也依次采用深拷贝的方式递归的复制到新对象上;深拷贝时,一个对象的改变不会影响另一个对象
实现深拷贝的方式:
目标对象是数组【arr1 = [4,5,2]】
1. for… in
2. let arr2 = arr1.slice(0)
3. let arr2 = Array.from(arr1)
4. let arr2 = arr1.concat()
5. 扩展运算符 let […arr2] = arr1
目标对象是普通对象
1. let arr2 = JSON.parse(JSON.stringify(arr1))
解决了传址和值互相影响的问题,但由于返回了新对象,会丢失function函数和undefined变量
2. 使用lodash的cloneDeep方法 let arr2 = lodash.cloneDeep(arr1)
3. 自定义方法

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/199316.html