Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

宽松相等和严格相等 #7

Open
allenleeok opened this issue Oct 10, 2018 · 0 comments
Open

宽松相等和严格相等 #7

allenleeok opened this issue Oct 10, 2018 · 0 comments

Comments

@allenleeok
Copy link
Owner

allenleeok commented Oct 10, 2018

宽松相等(抽象相等)== 和严格相等 === 正确的解释:

"==" 允许在相等比较中进行强制类型转换,而 "===" 不允许

抽象相等

规则:

  • 如果两个值的类型相同,就仅比较它们是否相等。
    有几个非常规的情况需要注意。
    • NaN 不等于 NaN。
    • +0 等于 -0。
  • 对象(包括函数和数组)的宽松相等 ==。两个对象指向同一个值时
    即视为相等,不发生强制类型转换。
  • 在比较两个不同类型的值时会发生隐式强制类型转换,会将其中之一或两者都转换为相同的类型后再进行比较。

比较:

  1. 字符串和数字之间的相等比较:
    字符串被强制类型转换为数字以便进行相等比较。
     
  2. 其他类型和布尔类型之间的相等比较:
    布尔类型被强制类型转换为数字,然后进行下一步判断。
     
  3. null 和 undefined 之间的相等比较:
    (1) 如果 x 为 null,y 为 undefined,则结果为 true。
    (2) 如果 x 为 undefined,y 为 null,则结果为 true。
     
  4. 对象和非对象之间的相等比较:
    (1) 如果 Type(x) 是字符串或数字,Type(y) 是对象,则返回 x == ToPrimitive(y) 的结果;
    (2) 如果 Type(x) 是对象,Type(y) 是字符串或数字,则返回 ToPromitive(x) == y 的结果。

注: ToPrimitive 抽象操作的所有特性(如 toString()、valueOf()) 在这里都适用。

ToPrimitive

ToPrimitive 运算符接受一个值,和一个可选的 期望类型 作参数。ToPrimitive 运算符把其值参数转换为非对象类型。如果对象有能力被转换为不止一种原语类型,可以使用可选的 期望类型 来暗示那个类型。

对Object进行ToPrimitive()操作: 返回该对象的默认值。对象的默认值由把期望类型传入作为hint参数调用对象的内部方法[[DefaultValue]]得到。

[[DefaultValue]] (hint)

  • 传入的hint是String,先判断toString能否调用,再判断toString()的结果,是基本类型才返回,再判断valueOf能否调用,再判断valueOf()的结果,是基本类型才返回,否则报错。
  • 传入的hint是Number(或者没有hint,默认是Number),先判断valueOf,再判断toString
  • 普通Object,默认用hint为Number的方式来转换,对于Date类型的Object,用hint为String的方式来转换

例子

"0" == ""   // false
"0" == []   // false

false == ""   // true
false == ""   // true
false == []   // true
false == {}  // false

"" == 0    //true
"" == []   // true
"" == {}  // false

0 == []   // true
0 == {}   // false

比较特殊的情况

更改内置原生原型

  • 返回其他数字
Number.prototype.valueOf = function() {
 return 3;
};
new Number( 2 ) == 3;   // true

参考

http://yanhaijing.com/es5/#203
http://yanhaijing.com/es5/#103
http://yanhaijing.com/es5/#100
https://zhuanlan.zhihu.com/p/29730094

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant