今天看到這樣的面試題,如下:
var yiifaa = 'yiifaa', str1 = new String(yiifaa), str2 = String(yiifaa)
- 1
- 2
- 3
聲明與賦值了3個變量,然后考題如下:
// 請確認以下的判斷是否准確 str1 === yiifaa // str2 === yiifaa // typeof str1 === typeof str2
- 1
- 2
- 3
- 4
- 5
- 6
根據JS的語法,要滿足===的條件如下:
1. 如果是引用類型,則兩個變量必須指向同一個對象(同一個地址);
2. 如果是基本類型,則兩個變量除了類型必須相同外,值還必須相等。
再把話題切換到String對象上來,String的聲明方式有三種(請參見第一段代碼),但產生的類型卻不盡相同,結果如下:
// 類型為string,為基本類型 typeof yiifaa // 類型為object,為引用類型 typeof str1 // 類型為string,為基本類型 typeof str2
- 1
- 2
- 3
- 4
- 5
- 6
那現在答案很清楚了,如下:
// false, 因為str1為引用類型 str1 === yiifaa // true, 因為都是基本類型,並且值相等 str2 === yiifaa // false, 雖然都是字符串,但分別為object與string typeof str1 === typeof str2
- 1
- 2
- 3
- 4
- 5
- 6
總結
很神奇的String對象,一方面可以作為基本類型,另一方面還可以作為引用類型,更神奇的是,為String.prototype添加方法,基本類型還可以引用到,怎么做到的?