1、== 相等运算符
如果 x 与 y 类型一致时规则如下:
1. 如果 x 类型为 Undefined,返回 true。
2. 如果 x 类型为 Null,返回 true。
3. 如果 x 类型为 Number,则,
a. 如果 x 为 NaN,返回 false。
b. 如果 y 为 NaN,返回 false。
c. 如果 x 与 y 为同一个数字,返回 true。
d. 如果 x 为 +0,且 y 为 -0,返回 true。
e. 如果 x 为 -0,且 y 为 +0, 返回 true。
f. 返回 false。
4. 如果 x 为 String,则当 x 和 y 为完全相同的字符序列
(长度相等且相同字符在相同位置)时返回 true,否则,返回 false。
5. 如果 x 为 Boolean, 当 x 和 y 为同为 true 或 false 时返回 true,
否则,返回 false。
6. 如果 x 和 y 引用到同一个 Object 对象,返回 true,否则,返回 false。
如果 x 为 Null 且 y 为 Undefined, 返回 true。
如果 x 为 Undefined 且 y 为 Null, 返回 true。
如果 x 为 Number 且 y 为 String, 返回比较 x == ToNumber(y)的结果。
如果 x 为 String 且 y 为 Number, 返回比较 ToNumber(x) == y的结果。
如果 x 为 Boolean 返回比较 ToNumber(x) == y的结果。
如果 y 为 Boolean 返回比较 x == ToNumber(y)的结果。
如果 x 为 String 或者 Number, 且 y 为 Object,
返回比较 x == ToPrimitive(y)的结果。
如果 x 为 Object, 且 y 为 String 或者 Number,
返回比较 ToPrimitive(x) == y的结果。
否则返回false。

2、=== 严格相等运算符

如果 x 与 y 类型不一致,返回 false。
如果 x 为 Undefined, 返回 true。
如果 x 为 Null, 返回 true。
如果 x 为 Number, 则,
a. 如果 x 为 NaN,返回 false。
b. 如果 x 为 NaN,返回 false。
c. 如果 x 与 y 为同一个数字, 返回 true。
d. 如果 x 为 +0,且 y 为 -0,返回 true。
e. 如果 x 为 -0,且 y 为 +0, 返回 true。
f. 返回 false。
如果 x 类型为 String, 如果 x 与 y 为完全相同的字符序列
(相同的长度和相同的字符对应相同的位置),返回 true,否则,返回 false。
如果 x 为 Boolean, 当 x 和 y 为同为 true 或 false 时,返回 true,
否则,返回 false。
如果 x 和 y 引用到同一个 Object 对象,返回 true,否则,返回 false。
3、Object.is 使用ES6 “Same-value equality”(同值相等)算法,内部严格比较SameValue(x,y)
如果 x 与 y 类型不一致,返回 false,否则, 类型一致时规则如下:
1. 如果 x 类型为 Undefined,返回 true。
2. 如果 x 类型为 Null,返回 true。
3. 如果 x 类型为 Number,则,
a. 如果 x 为 NaN,且 y 也为 NaN,返回 true。
b. 如果 x 为 +0,且 y 为 -0,返回 false。
c. 如果 x 为 -0,且 y 为 +0, 返回 false。
d. 如果 x 与 y 为同一个数字,返回 true。
e. 返回 false。
4. 如果 x 类型为 String, 如果 x 与 y 为完全相同的字符序列
(相同的长度和相同的字符对应相同的位置),返回 true,否则,返回 false。
5. 如果 x 为 Boolean, 当 x 和 y 为同为 true 或 false 时,返回 true,
否则,返回 false。
6. 如果 x 和 y 引用到同一个 Object 对象,返回 true,否则,返回 false。 Object.is(+0, -0) // false
Object.is(NaN, NaN) // true
注: === 和 Object.js 比较差异主要体现在 NaN 及 正负0 的比较。
+0 === -0 // true
NaN === NaN // false
Object.is(+0, -0) // false
Object.is(NaN, NaN) // true
4、ToPrimitive 方法 [[DefaultValue]] (hint)
  ToPrimitive 运算符把其值参数转换为非对象类型,主要理解为对象转换时处理步骤
当不用 hint 调用 O 的 [[DefaultValue]] 内部方法时,除非O 是 Date 对象的情况下把 hint 当作字符串一样解释它的行为,除此之外把 hint 当作数字一样解释它的行为
当期望转换hint类型为 Number 类型时:
1. 调用 valueOf 结果是原始类型,则返回;
2. 调用 toString 结果是原始类型,则返回;
3. 抛出 TypeError 异常。
当期望转换hint类型为 String 类型时:
1. 调用 toString 结果是原始类型,则返回;
2. 调用 valueOf 结果是原始类型,则返回;
3. 抛出 TypeError 异常。
当期望类型hint类型default时,除对象为Date时以String解释,其他情况以Number解释
// 确定 hint 类型
var a = {
[Symbol.toPrimitive](hint){
console.log('hint: ' + hint);
}
}
alert(a); // hint: string
`${a}`; // hint: string
+a; // hint: number
a + 1; // hint: default var b = new Date();
+b; // 1614261017044 当前hint: number
b + 1; // Thu Feb 25(...省略)1 当前hint: default 默认时以String 解析

比较运算规则 == 、 ===、Object.is 和 ToPrimitive 方法 [[DefaultValue]] (hint)的更多相关文章

  1. ECMAScript5 Object的新属性方法

    虽然说现在并不是所有的浏览器都已经支持ECMAScript5的新特性,但相比于ECMAScript4而言ECMAScript5被广大浏览器厂商广泛接受,目前主流的浏览器中只有低版本的IE不支持,其它都 ...

  2. toStirng()与Object.prototype.toString.call()方法浅谈

    一.toString()是一个怎样的方法?它是能将某一个值转化为字符串的方法.然而它是如何将一个值从一种类型转化为字符串类型的呢? 通过下面几个例子,我们便能获得答案: 1.将boolean类型的值转 ...

  3. JavaScript中toStirng()与Object.prototype.toString.call()方法浅谈

    toStirng()与Object.prototype.toString.call()方法浅谈 一.toString()是一个怎样的方法?它是能将某一个值转化为字符串的方法.然而它是如何将一个值从一种 ...

  4. js object 对象 属性和方法的使用

    //object 对象 属性和方法的使用 var person = new Object(); person.name="张海"; person.age="; perso ...

  5. js原型链接(二)和object类的create方法

    原型链的内部执行方式 <script> function Myclass(){ this.x=" x in Myclass"; } var obj=new Myclas ...

  6. Fatal error: Using $this when not in object context in 解决方法

    Fatal error: Using $this when not in object context in 解决方法 粗心造成的错误 $this 只存在于下面情况 $obj = new object ...

  7. Java基础知识强化26:Object类之hashCode()方法、getClass()方法

    1. Object类的hashCode()方法,如下: public  int  hashCode():返回该对象的哈希码值,这个值和地址值有关,但是不是实际地址值(哈希码值是根据实际地址值转化过来的 ...

  8. 【转】javascript Object使用Array的方法

    原文: http://www.cnblogs.com/idche/archive/2012/03/17/2403894.html Array.prototype.push push向数组尾部添加一项并 ...

  9. 关于Object类下所有方法的简单解析

    类Object是类层次结构的根类,是每一个类的父类,所有的对象包括数组,String,Integer等包装类,所以了解Object是很有必要的,话不多说,我们直接来看jdk的源码,开始我们的分析之路 ...

随机推荐

  1. 使用控制台启动Android设备模拟器

    文档 > emulator -list-avds Nexus_5X_API_28_x86 Pixel_2_XL_API_28 > emulator.exe -avd Pixel_2_XL_ ...

  2. 最常用SQL joins:内连接(交集)、左外连接、右外连接、左连接、右连接、全连接(并集),全外连接

    1.内连接.两个表的公共部分用Inner join,Inner join是交集的部分. Select * from TableA A inner join TableB B on A.key=B.ke ...

  3. 后端程序员之路 14、NumPy

    NumPy - NumPyhttp://www.numpy.org/ NumPy-快速处理数据 - 用Python做科学计算http://old.sebug.net/paper/books/scipy ...

  4. 剑指 Offer 14- I. 剪绳子 + 动态规划 + 数论

    剑指 Offer 14- I. 剪绳子 题目链接 还是343. 整数拆分的官方题解写的更清楚 本题说的将绳子剪成m段,m是大于1的任意一个正整数,也就是必须剪这个绳子,至于剪成几段,每一段多长,才能使 ...

  5. HDOJ-3038(带权并查集)

    How many answers wrong HDOJ-3038 一个很好的博客:https://www.cnblogs.com/liyinggang/p/5327055.html #include& ...

  6. JavaScript中的事件循环机制跟函数柯里化

    一.事件循环机制的理解 test();//按秒输出5个5 function test() { for (var i = 0; i < 5; i++) { setTimeout(() => ...

  7. 如何自己配置pip源

    方式一:临时使用国内pypi镜像安装 pip install -i http://pypi.douban.com/simple/ numpy pip install -i http://pypi.do ...

  8. mysql操作和详解

    温馨提示 mysql安装包里面:mysqld是服务端,mysql是客户端. mysqld其实是SQL后台程序(也就是MySQL服务器),它是关于服务器端的一个程序,mysqld意思是mysql dae ...

  9. python-顺序串基本操作的实现

    1 #*********************************************************************** ** 2 #> File Name: seq ...

  10. PTA 中序输出叶子结点

    6-8 中序输出叶子结点 (10 分)   本题要求实现一个函数,按照中序遍历的顺序输出给定二叉树的叶结点. 函数接口定义: void InorderPrintLeaves( BiTree T); T ...