概述

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

更多相关文章

  1. 两个svg文件用javascript合并的问题?
  2. 禁用Chrome严格的MIME类型检查
  3. 请问解决整数,货币,INT,DOUBLE,等类型的JavaScript验证--不是高手不
  4. 【第2篇】TypeScript - 基本类型详解
  5. python数据类型二(列表和元组)
  6. 在seaborn.jointplot中绘制两个分布
  7. 流畅python学习笔记:第十二章:子类化内置类型
  8. 剑指offer python版 数组中只出现一次的两个数字
  9. 在两台服务器上有效地在两个Django应用程序之间进行通信(多租户)

随机推荐

  1. Facebook工程师是如何改进他们Android客
  2. Android中使用Handler机制更新UI的两种方
  3. UserInfo.java
  4. Android(安卓)APP旋转屏幕
  5. Android中“分享”功能的实现
  6. Android/安卓存储优化
  7. AIDL踩坑
  8. 一场关于Android的争论
  9. Android江湖(含CD光盘1张)
  10. Android 性能优化 内存优化 How Android