JavaScript 中的相等性判断
16lz
2021-01-22
概述
ECMAScript 2015/ES6中有四种相等算法:
- 抽象相等比较(
==
) - 严格相等比较(
===
) Array.prototype.indexOf, Array.prototype.lastIndexOf, 和 case-matching - 同值零: 用于 %TypedArray% 和 ArrayBuffer 构造函数、以及Map和Set操作, 并将用于 ES2016/ES7 中的String.prototype.includes
- 同值: 用于所有其他地方
JavaScript提供三种不同的值比较操作:
- 严格相等 ("triple equals" 或 "identity"),使用 ===
- 宽松相等 ("double equals") ,使用 ==
- 以及 Object.is (ECMAScript 2015/ ES6 新特性)
说明如下:
==
双等号将执行类型转换===
三等号不进行类型转换 (如果类型不同, 直接返回 false )- Object.is的行为方式与三等号相同,但是对于NaN、-0和+0进行特殊处理,所以最后两个不相同,而Object.is(NaN,NaN)将为 true
- 使用双等号或三等号将NaN与NaN进行比较,结果为false
- 对于任意两个不同的非原始对象,即便他们有相同的结构,以上三个运算符都会计算得到 false
严格相等 ===
全等操作符比较两个值是否相等,两个被比较的值在比较前都不进行隐式转换,需要注意:
- 如果两个被比较的值具有不同的类型,这两个值是不全等的
- 如果两个被比较的值类型相同,值也相同,并且都不是 number 类型时,两个值全等
- 如果两个值都是 number 类型,当两个都不是 NaN,并且数值相同,或是两个值分别为 +0 和 -0 时,两个值被认为是全等的
- 全等操作符认为 NaN 与其他任何值都不全等,包括它自己(等式 (x !== x) 成立的唯一情况是 x 的值为 NaN)
- 需要注意两个浮点数比较时的进度缺失问题: 0.1 + 0.2 === 0.3 为false
var num = 0; // Number 原始类型
var obj = new String("0"); // String 对象
var str = "0"; // String 原始类型
var b = false; // Boolean 原始类型
console.log(num === num); // true
console.log(obj === obj); // true
console.log(str === str); // true
console.log(num === obj); // false
console.log(num === str); // false
console.log(obj === str); // false
console.log(null === undefined); // false
console.log(obj === null); // false
console.log(obj === undefined); // false
console.log(0.1+0.2 === 0.3); //false
更多相关文章
- 两个svg文件用javascript合并的问题?
- 禁用Chrome严格的MIME类型检查
- 请问解决整数,货币,INT,DOUBLE,等类型的JavaScript验证--不是高手不
- 【第2篇】TypeScript - 基本类型详解
- python数据类型二(列表和元组)
- 在seaborn.jointplot中绘制两个分布
- 流畅python学习笔记:第十二章:子类化内置类型
- 剑指offer python版 数组中只出现一次的两个数字
- 在两台服务器上有效地在两个Django应用程序之间进行通信(多租户)