基本类型和引用类型的值

ECMAScript 变量可能包含两种不同数据类型的值:基本类型值和引用类型值。基本类型值指的是简单的数据段,而引用类型的值指那些可能由多个值构成的对象。

在将一个值赋给变量时,解析器必须确定这个值是基本类型值还是引用类型值。

ECMAScript 中有五种基本类型: Undefined、Null、Boolean、Number 和 String。这五种基本数据类型是按值访问的,因为可以操作保存在变量中的实际的值。

引用类型的值是保存在内存中的对象。与其他语言不同,JavaScript 不允许直接访问内存中的位置。也就是说不能直接操作对象的内存空间。在复制保存着对象的某个变量时,操作的是对象的引用。但在为对象添加属性时,操作的是实际的对象。

在很多语言中,字符串以对象的形式来表示,因此被认为是引用类型的。ECMAScript 放弃了这一传统

浅比较

浅比较也称引用相等,在 javascript 中, === 是作浅比较 , 只检查左右两边是否是同一个对象的引用:

 1var m = { a: 1 }
 2var n = { a: 1 }
 3var x = m
 4console.log(m === n) 
 5console.log(m === n) 

变量名只是指向栈内存的指针,也就是给这个栈内存取得别名

深比较

深比较也称原值相等,深比较是指检查两个对象的所有属性是否都相等 , 深比较需要以递归的方式遍历两个对象的所有属性,操作比较耗时,深比较不管这两个对象是不是同一对象的引用。

lodash.isEqual

_.isEqual: 执行深比较来确定两者的值是否相等。
注意:这个方法支持比较 arrays, array buffers, booleans, date objects, error objects, maps, numbers, Object objects, regexes, sets, strings, symbols, 以及 typed arrays. Object 对象值比较自身的属性,不包括继承的和可枚举的属性。不支持函数和 DOM 节点比较

 1import _ from 'lodash'
 2const m = {a:1}
 3const n = {a:1}
 4console.log(_.isEqual(m, n)) 

fast-deep-equal

 1import deepEqual from 'fast-deep-equal'
 2deepEqual({name: '紫升'},{name: '紫升'}) 
个人笔记记录 2021 ~ 2025