JS中的等值判断并非只有==和===

严格相等

===使用的等值判断方式

类型不同直接返回false

类型相同:

  • +0-0相等
  • NaNNaN不相等
  • undefinedundefined相等
  • nullnull相等
  • 指向同一地址的对象相等
  • 顺序相同的字符串相等

使用严格相当的场景

  • switch case - ===
  • indexOf lastIndexOf

宽松相等

类型不同则进行类型转换,规则详见js类型转换 todo

类型相同时,除了以下规则外与严格相等相同

  • document.allundefined相等
  • document.allnull相等

这其实不符合ES规范,ES规范所有对象和原始值都不与undefinednull相等,这更像是浏览器BUG,但是也没人进行这个比较吧?

只用于==

同值相等

Api中的只用于Object.is,多用于语言内部

  • NaNNaN相等
  • +0-0不相等

存在的意义:

js 复制代码
Object.defineProperty(Number, "NEGATIVE_ZERO", {
  value: -0,
  writable: false,
  configurable: false,
  enumerable: false,
});

function attemptMutation(v) {
  Object.defineProperty(Number, "NEGATIVE_ZERO", { value: v });
}

attemptMutation(-0)//不报错
attemptMutation(0)//报错

如上代码,当规定了一个不可变属性,此时需要严格判断+0-0,当然也需要判断NaN,主观上这样更加合理

当语言期望一个值等于另外一个值的时候,几乎所有地方都是用同值相等。

可以借助以上例子理解语言内部的含义

零值相等

同值相等的区别是:+0-0相等

不作为Api公开

用于:

  • 数组的includes
  • map的键值判断
  • set的判断

注意点

当任何需要等值判断的时候,可以对其用的什么类型等值判断敏感一些,这样可能能避免一些问题

相关推荐
EndingCoder3 小时前
类的继承和多态
linux·运维·前端·javascript·ubuntu·typescript
用户47949283569153 小时前
React 终于出手了:彻底终结 useEffect 的"闭包陷阱"
前端·javascript·react.js
木头程序员3 小时前
前端(包含HTML/JavaScript/DOM/BOM/jQuery)基础-暴力复习篇
开发语言·前端·javascript·ecmascript·es6·jquery·html5
哈__3 小时前
React Native 鸿蒙跨平台开发:PixelRatio 实现鸿蒙端图片的高清显示
javascript·react native·react.js
wszy18094 小时前
外部链接跳转:从 App 打开浏览器的正确姿势
java·javascript·react native·react.js·harmonyos
pas1364 小时前
31-mini-vue 更新element的children
前端·javascript·vue.js
码界奇点5 小时前
基于Vue3与TypeScript的后台管理系统设计与实现
前端·javascript·typescript·vue·毕业设计·源代码管理
ashcn20015 小时前
水滴按钮解析
前端·javascript·css
爱吃奶酪的松鼠丶5 小时前
React长列表,性能优化。关于循环遍历的时候,key是用对象数据中的ID还是用索引
javascript·react.js·性能优化
xkxnq5 小时前
第二阶段:Vue 组件化开发(第 17天)
javascript·vue.js·ecmascript