【前端工程师手册】说清楚JavaScript中的相等性判断

简介: 【前端工程师手册】说清楚JavaScript中的相等性判断

有哪些判断相等性的方法


JavaScript现在提供了三种方法来判断相等性:

  1. ===,三个等号即严格相等
  2. ==,两个等号即宽松相等
  3. Object.is(),ES6中用来判断相等的方法


判断相等性的细节


===(严格相等)


被比较的两个数不会进行类型转换,具体的比较过程如下:

  1. 不同类型的值:直接返回false
  2. 同一类型的基本类型的值:比较值是否相同,相同就返回true,不相同就返回false,有一个例外NaN === NaN返回false
  3. 同一类的复合类型的值:比较它们是否指向同一个对象,是就返回true,否则返回false

例子:

var a = 2, b = '2'
a === b // false
undefined === null // false
NaN === NaN // false
+0 === -0 // true
var f = function(){}
var c = f, d = f;
c === d // true
复制代码

==(宽松相等)


宽松相等主要是在某些情况下涉及到隐式类型转换的问题,废话不说,看一下MDN上面对宽松相等的规则总结:

image.png

总结一下就是:

  1. 类型相同时,结果和===一样
  2. undefined和null互相比较时为true,但是它们和其他类型比较时都为false
  3. 原始类型A和原始类型B比较时:ToNumber(A) === ToNumber(B)
  4. 原始类型A和复合类型B比较时:ToNumber(A) == ToPrimitive(B)

那么ToNumber和ToPrimitive这两个方法内部到底是如何判断的呢?查看一下ECMA说明


image.pngimage.pngimage.pngimage.pngimage.pngimage.png

image.png

image.pngimage.png

如果是这么个意思:


ToNumber


  1. undefined,返回NaN
  2. null,返回+0
  3. boolean,true返回1,false返回+0
  4. number,直接返回自身
  5. string,将字符串的内容转换为数字,转换失败则返回NaN。例如"123"这样的就是返回123,"213a"这样的返回NaN
  6. symbol,抛出typeerror错误
  7. object,先调用toPrimitive,再对其结果调用toNumber


ToPrimitive


首先这个方法有两个参数,input和preferredType,如果preferredType是number的话,大致过程如下:

  1. 如果input就是原始类型,直接返回其自身
  2. 调用input.valueOf(),如果结果是原始类型,则返回该结果
  3. 调用input.toString(),如果结果是原始类型,则返回该结果
  4. 抛出typeerror错误

如果preferredType是string,那么第2步和第3步顺序反过来。

如果preferredType没有传入的话:

  • 如果input是Date类型,则preferredType取string
  • 否则,preferredType取number


Object.is


这个方法大致和===一样,除了以下:

  1. Object.is(NaN, NaN) 返回true
  2. Object.is(+0, -0) 返回false

参考

知乎-Javascript 中 == 和 === 区别是什么?

全面解析js中的数据类型与类型转换

ECMA规范



相关文章
|
3月前
|
前端开发 JavaScript 开发者
【前端开发者的福音】彻底改变你编码习惯的神奇数组迭代技巧——从基础到进阶,解锁 JavaScript 数组迭代的N种姿势!
【8月更文挑战第23天】在Web前端开发中,数组是JavaScript中最常用的数据结构之一,掌握高效的数组迭代方法至关重要。本文详细介绍了多种数组迭代技巧:从基础的`for`循环到ES6的`for...of`循环,再到高阶方法如`forEach`、`map`、`filter`、`reduce`及`some`/`every`等。这些方法不仅能提高代码的可读性和维护性,还能有效优化程序性能。通过具体的示例代码,帮助开发者更好地理解和运用这些迭代技术。
41 0
|
12天前
|
资源调度 前端开发 JavaScript
vite3+vue3 实现前端部署加密混淆 javascript-obfuscator
【11月更文挑战第10天】本文介绍了在 Vite 3 + Vue 3 项目中使用 `javascript-obfuscator` 实现前端代码加密混淆的详细步骤,包括安装依赖、创建混淆脚本、修改 `package.json` 脚本命令、构建项目并执行混淆,以及在 HTML 文件中引用混淆后的文件。通过这些步骤,可以有效提高代码的安全性。
|
20天前
|
设计模式 前端开发 JavaScript
揭秘!前端大牛们如何巧妙利用JavaScript,打造智能交互体验!
【10月更文挑战第30天】前端开发领域充满了无限可能与创意,JavaScript作为核心语言,凭借强大的功能和灵活性,成为打造智能交互体验的重要工具。本文介绍前端大牛如何利用JavaScript实现平滑滚动、复杂动画、实时数据更新和智能表单验证等效果,展示了JavaScript的多样性和强大能力。
34 4
|
15天前
|
前端开发 JavaScript 安全
vite3+vue3 实现前端部署加密混淆 javascript-obfuscator
【11月更文挑战第7天】本文介绍了在 Vite 3 + Vue 3 项目中使用 `javascript-obfuscator` 实现前端代码加密混淆的详细步骤。包括项目准备、安装 `javascript-obfuscator`、配置 Vite 构建以应用混淆,以及最终构建项目进行混淆。通过这些步骤,可以有效提升前端代码的安全性,防止被他人轻易分析和盗用。
|
2月前
|
存储 前端开发 JavaScript
前端基础(二)_JavaScript变量、JavaScript标识符、JavaScript获取元素、JavaScript的鼠标事件
本文介绍了JavaScript变量的声明和使用、标识符的命名规则、如何获取和操作HTML元素,以及JavaScript的鼠标事件处理,通过示例代码展示了这些基础知识点在实际开发中的应用。
43 2
前端基础(二)_JavaScript变量、JavaScript标识符、JavaScript获取元素、JavaScript的鼠标事件
|
2月前
|
Web App开发 JavaScript 前端开发
前端基础(一)_初识JavaScript
本文介绍了JavaScript的起源、核心组成(ECMAScript、DOM、BOM),并解释了JavaScript的三种引入方式:行内引入、内部引入和外部引入,以及`window.onload`的使用,最后讨论了网页、网站、浏览器和兼容性的概念。
16 2
前端基础(一)_初识JavaScript
|
2月前
|
前端开发 JavaScript
前端基础(八)_JavaScript循环(for循环、for-in循环、for-of循环、while、do-while 循环、break 与 continue)
本文介绍了JavaScript中的循环语句,包括for循环、for-in循环、for-of循环、while循环、do-while循环以及break和continue的使用。
66 1
前端基础(八)_JavaScript循环(for循环、for-in循环、for-of循环、while、do-while 循环、break 与 continue)
|
1月前
|
JavaScript 前端开发 应用服务中间件
vue前端开发中,通过vue.config.js配置和nginx配置,实现多个入口文件的实现方法
vue前端开发中,通过vue.config.js配置和nginx配置,实现多个入口文件的实现方法
158 0
|
1月前
|
前端开发 JavaScript 程序员
【从前端入门到全栈】Node.js 之核心概念
【从前端入门到全栈】Node.js 之核心概念
|
2月前
|
存储 前端开发 JavaScript
前端基础(三)_JavaScript数据类型(基本数据类型、复杂数据类型)
本文详细介绍了JavaScript中的数据类型,包括基本数据类型(Number、String、Boolean、Undefined、Null)和复杂数据类型(Object),并解释了如何使用`typeof`操作符来识别变量的数据类型。同时,还讨论了对象、函数和数组等复杂数据类型的使用方式。
51 2
下一篇
无影云桌面