Skip to content

深比较和浅比较 #68

@LightXJ

Description

@LightXJ

浅比较

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

var m = { a: 1 } var n = { a: 1 } 
console.log(m === n) // false 
// 虽然没有赋值给变量,但比较的还是栈内存中的值引用 
console.log({ a:1 } === { a:1 }) // false

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

深比较

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

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

lodash.isEqual

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

fast-deep-equal

import deepEqual from 'fast-deep-equal'deepEqual({name:'xxx'},{name:’xxx'}) // true

js中==和===的区别
简单来说: == 代表相同, ===代表严格相同, 为啥这么说呢,
这么理解: 当进行双等号比较时候: 先检查两个操作数数据类型,如果相同, 则进行===比较, 如果不同, 则愿意为你进行一次类型转换, 转换成相同类型后再进行比较, 而===比较时, 如果类型不同,直接就是false.

比较过程:
双等号==
  (1)如果两个值类型相同,再进行三个等号(===)的比较
  (2)如果两个值类型不同,也有可能相等,需根据以下规则进行类型转换在比较:
    1)如果一个是null,一个是undefined,那么相等
    2)如果一个是字符串,一个是数值,把字符串转换成数值之后再进行比较

三等号===:
  (1)如果类型不同,就一定不相等
  (2)如果两个都是数值,并且是同一个值,那么相等;如果其中至少一个是NaN,那么不相等。(判断一个值是否是NaN,只能使用isNaN( ) 来判断)
  (3)如果两个都是字符串,每个位置的字符都一样,那么相等,否则不相等。
  (4)如果两个值都是true,或是false,那么相等
  (5)如果两个值都引用同一个对象或是函数,那么相等,否则不相等
  (6)如果两个值都是null,或是undefined,那么相等

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions