类型转换

[]==![]
这个问题我想大家并不陌生。
我在这根据ecma规定来分析下这个运算过程的原理。
根据ecma--11.9.1

1 A==B 运算的顺序如下
1.Evaluate A.
2.Call GetValue(Result(1)).
3.Evaluate B.
4.Call GetValue(Result(3)).
5.Perform the comparison Result(4) == Result(2). (see 11.9.3).
6.Return Result(5).

[]==![]=>计算A和B的值,取到A和B的真实值。[]=>[] . ![]=>false.  false==[],运算过程如下。ecma--11.9.3

2 11.9.3 The Abstract Equality Comparison Algorithm
The comparison x == y, where x and y are values, produces true or false. Such a comparison is performed as follows:
1.If Type(x) is different from Type(y), go to step 14.
2.If Type(x) is Undefined, return true.
3.If Type(x) is Null, return true.
4.If Type(x) is not Number, go to step 11.
5.If x is NaN, return false.
6.If y is NaN, return false.
7.If x is the same number value as y, return true.
8.If x is +0 and y is -0, return true.
9. If x is -0 and y is +0, return true.
10. Return false.
11.If Type(x) is String, then return true if x and y are exactly the same sequence of characters (same length and same characters in corresponding positions). Otherwise, return false.
12. If Type(x) is Boolean, return true if x and y are both true or both false. Otherwise, return false.
13.Return true if x and y refer to the same object or if they refer to objects joined to each other (see 13.1.2). Otherwise, return false.
14. If x is null and y is undefined, return true.
15. If x is undefined and y is null, return true.
16.If Type(x) is Number and Type(y) is String, return the result of the comparison x == ToNumber(y).
17.If Type(x) is String and Type(y) is Number, return the result of the comparison ToNumber(x)== y.
18. If Type(x) is Boolean, return the result of the comparison ToNumber(x)== y.
19. If Type(y) is Boolean, return the result of the comparison x == ToNumber(y).
20.If Type(x) is either String or Number and Type(y) is Object, return the result of the comparison x == ToPrimitive(y).
21.If Type(x) is Object and Type(y) is either String or Number, return the result of the comparison ToPrimitive(x)== y.
22. Return false.
根据18,false=>0   ,   0==[] ?
根据20,取[]的原始值

3 对象的原始值 的计算 ecma--9.1
Object Return a default value for the Object. The default value of an object is retrieved by calling the internal [[DefaultValue]] method of the object, passing the optional hint PreferredType. The behaviour of the [[DefaultValue]] method is defined by this specification for all native ECMAScript objects (8.6.2.6).

ecma--8.6.2.6
1. Call the [[Get]] method of object O with argument "valueOf".
2. If Result(1) is not an object, go to step 5.
3. Call the [[Call]] method of Result(1), with O as the this value and an empty argument list.
4. If Result(3) is a primitive value, return Result(3).
5. Call the [[Get]] method of object O with argument "toString".
6. If Result(5) is not an object, go to step 9.
7. Call the [[Call]] method of Result(5), with O as the this value and an empty argument list.
8. If Result(7) is a primitive value, return Result(7).
9. Throw a TypeError exception.

[]的转换过程如下

1这里首先 [].[[Get]](valueOf)。
2valueOf是一个函数对象
3valueOf.call([])===他自己
4他自己不是一个原始值
5[].[[Get]](toString)
6toString是一个函数对象
7toString.call([])===""
8空字符串""是一个原始值,被返回
所以[]的原始值=“”  . []=>""

然后根据2中16条,空字符串""转换成0.[]=>""=>0
这样0==0就true了。

原文地址:https://www.cnblogs.com/lunalord/p/2030839.html