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的判断

注意点

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

相关推荐
我是伪码农4 分钟前
Vue 1.30
前端·javascript·vue.js
利刃大大12 分钟前
【Vue】默认插槽 && 具名插槽 && 作用域插槽
前端·javascript·vue.js
艳阳天_.16 分钟前
web 分录科目实现辅助账
开发语言·前端·javascript
2601_9498683622 分钟前
Flutter for OpenHarmony 剧本杀组队App实战04:发起组队表单实现
开发语言·javascript·flutter
kgduu38 分钟前
js之javascript API
javascript
xiaoqi9221 小时前
React Native鸿蒙跨平台实现图片画廊类页面是视觉展示型APP(如摄影类、图库类、设计类APP)的核心载体,其核心需求是实现图片的流畅渲染
javascript·react native·react.js·ecmascript·harmonyos
雪芽蓝域zzs1 小时前
uniapp 省市区三级联动
前端·javascript·uni-app
Highcharts.js1 小时前
Next.js 集成 Highcharts 官网文档说明(2025 新版)
开发语言·前端·javascript·react.js·开发文档·next.js·highcharts
Beginner x_u2 小时前
JavaScript 核心知识索引(面试向)
开发语言·javascript·面试·八股
~小仙女~2 小时前
组件的二次封装
前端·javascript·vue.js