How does string equality work in JavaScript?

后端 未结 3 983
我寻月下人不归
我寻月下人不归 2020-12-10 03:40

There are plenty of tutorials for == and === so please don\'t guide me to a basic tutorial, my question is a bit more specific:

For example

3条回答
  •  旧巷少年郎
    2020-12-10 04:21

    You are correct that in your example case you are comparing 2 different object references. Within the language specification you'll find this algorithm. The portion you are looking for is section 1 f.

    11.9.3 The Abstract Equality Comparison Algorithm

    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 the same as Type(y), then 
        a.    If Type(x) is Undefined, return true. 
        b.  If Type(x) is Null, return true. 
        c.    If Type(x) is Number, then 
            i.  If x is NaN, return false. 
            ii.  If y is NaN, return false.
            iii.  If x is the same Number value as y, return true. 
            iv.  If x is +0 and y is -0, return true. 
            v.  If x is -0 and y is +0, return true. 
            vi.  Return false.
        d.  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. 
        e.  If Type(x) is Boolean, return true if x and y are both true or both false. Otherwise, return false. 
        f.  Return true if x and y refer to the same object. Otherwise, return  false. 
    2.  If x is null and y is undefined, return true. 
    3.  If x is undefined and y is null, return true. 
    4.  If Type(x) is Number and Type(y) is String, 
    return the result of the comparison x == ToNumber(y). 
    5.  If Type(x) is String and Type(y) is Number, 
    return the result of the comparison ToNumber(x) == y. 
    6.  If Type(x) is Boolean, return the result of the comparison ToNumber(x) == y. 
    7.  If Type(y) is Boolean, return the result of the comparison x == ToNumber(y). 
    8.  If Type(x) is either String or Number and Type(y) is Object, 
    return the result of the comparison x == ToPrimitive(y). 
    9.  If Type(x) is Object and Type(y) is either String or Number, 
    return the result of the comparison ToPrimitive(x) == y.
    10.  Return false. 
    

    Also take notice that steps 8 and 9 which makes dealing with String objects a bit cleaner.

    alert(new String("a") == "a"); // true
    alert("a" == new String("a")); // true
    

提交回复
热议问题