js中定義字符串的三種方法


今天遇到一道面試題,如下:

        function showCase(value) {
            switch (value) {
                case 'A':
                    console.log("A");
                    break;
                case 'B':
                    console.log("B");
                    break;
                case undefined:
                    console.log("undefined");
                    break;
                default:
                    console.log("do not konw")

            }
        }
    showCase(new String('A')) // do not konw
       console.log(new String('A') === 'A') //false
       showCase('A') //A
       console.log(new String('A') == 'A') //true

涉及知識點有兩個:

(1)js中定義字符串的三種方法區別

  三種方法如下:

var str = 'ABC';
var str1 = String('ABC');
var str2 = new String('ABC');

  經過比較測試發現:

console.log(str == str1) //true
console.log(str == str2) //true
console.log(str1 == str2) //true
 
console.log(str === str1) //true
console.log(str === str2) //false
console.log(str1 === str2) //false
 
//typeof 判斷對象是什么類型的實例,返回值為說明運算數類型的字符串。
//返回值結果:“number”、“string”、“boolean”、“object”、“function”、“undefined”
console.log(typeof str) //string
console.log(typeof str1) // string
console.log(typeof str2) //object
 
//instanceof 判斷對象的類型,通過判斷對象的原型鏈中能否找到類型的 prototype
//只能用來判斷兩個對象是否屬於實例關系, 而不能判斷一個對象實例具體屬於哪種類型
console.log(str instanceof String) //false
console.log(str1 instanceof String) //false
console.log(str2 instanceof String) //true

三者的區別在於使用new定義的字符串其類型是object對象。

我們都知道js中類型分為基本類型:Boolean、Number、String、Null、Undefined、symbol(es6)和引用類型:Object。

基本類型是存儲在棧(stack)內存中的,數據大小確定,內存空間大小可以分配。

引用類型是存儲在堆(heap)內存中的,並在棧中存儲指向堆的地址。

因此前兩種方式定義的是存儲在棧中且值相等,而第三種方法定義的只是棧中的指針。

  擴展知識:原始類型與包裝對象

    在js中number、string、boolean三者屬於原始類型,它們都存在支持構造函數且可用於初始化原始值的包裝對象new Number()、new String()、new Boolean()。

    我們會看到這種代碼:

console.log(str.length) // 3
str.say = 'hello'
console.log(str.say) //undefined

    為什么可以像對象一般直接訪問原始類型str的length屬性呢?

      這是因為當用到某個原始值的方法或屬性時,后台會自動創建相應的原始包裝類型的對象,從而暴露出操作原始值的各種方法,當用完時銷毀。

    而為什么不能為其添加方法或屬性呢?

      因為包裝對象的生命周期只存在於訪問它的那行代碼執行期間,上方代碼第一行調用length對象會創建一次包裝對象,第二行也會創建一次包裝對象並為其賦予say屬性,第三行也會創建一次包裝對象,這三行的對象是不同的,且在當行執行完后就被銷毀,因此不能在運行期間給原始值添加屬性或方法。相比於此,使用new關鍵字實例化引用類型的生命周期會在離開作用域時被銷毀。

    綜上:包裝對象也是對象,從而得到打印三種類型分別為:string(原始類型) , string(原始類型) , object(包裝對象).

(2)switch case的判斷是全等(===)判斷。

    全等要滿足:1、引用類型:指向同一個對象(同一個地址)。
          2、基本類型:類型必須相同,值必須相等。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM