2011-09-01 46 views
13

有很多教程爲=====所以請不要引導我到一個基本的教程,我的問題是一個比較特殊:字符串相等如何在JavaScript中工作?

例如http://www.w3schools.com/jsref/jsref_obj_string.asp指出:

語法:

var txt = new String("string"); 

// or more simply: 
var txt = "string"; 

好,但是這個呢?

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

var a = new String("a"); 
var b = new String("a"); 
alert(a == b); // false 

var c = "a"; 
var d = "a"; 
alert(c == d); // true 

alert(c === d); // true 
alert (a === c); // false 

當然,沒有人來電new String()反正,但它是一些有關平等的失敗,因爲new String()作爲一個對象而不是作爲一個字符串處理?

當然,W3Schools並不是最值得信賴的來源,但我會期望所有上述警報都是真實的。

請解釋。

+3

一個更好的參考是https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/String –

+0

這種行爲現在已經解釋,但後續問題可能是「爲什麼你會曾經使用'new String()'?「 – nnnnnn

+1

只是一個小小的評論:http://w3fools.com/ – RoelF

回答

12

「令人驚訝的結果」來自Javascript處理對象平等的方式,以及字符串文字和String對象之間出現的混淆。從Mozilla的reference guide==操作:

如果兩個操作數是不一樣的類型,JavaScript的轉換 操作數則實行嚴格的比較。如果任一操作數是 或布爾值,則操作數在可能的情況下轉換爲數字;否則 如果任一操作數是一個字符串,則另一個操作數在可能的情況下轉換爲 字符串。 如果兩個操作數都是對象,那麼JavaScript 會比較內部引用,這些內部引用在操作數指向 內存中的同一對象時相等。

你可以遇到相同的行爲與數字:

new Number(5) == new Number(5) // false 

而且通過闡明你的思想:

typeof "string" // string 
typeof new String("string") // object 
+0

好,清楚,全面的答案!謝謝! –

+0

謝謝,這是我想找到的。 – SoonDead

4

作爲原始值類型的字符串文字與新的String對象不同,它們是具有包含這些值的不同引用的實體。有關詳細信息,請參閱Mozilla的JavaScript文檔中的Predefined Core Objects

所以你說得對,文字和對象的處理方式是不同的,只是因爲比較它們的值而另一個比較參考。

3

你是正確的,在你的例子情況下,你要比較兩個不同的對象引用。在語言規範中你會發現這個算法。你正在尋找的部分是第1節f。

11.9.3摘要相等比較算法

 
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. 

另外採取通知,步驟8和9,其使得處理字符串對象位吸塵器。

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

感謝這也,我已經接受了其他答案,但這是一樣的教育。 – SoonDead

相關問題