1. 程式人生 > >JavaScript筆記:原始值物件包裝類

JavaScript筆記:原始值物件包裝類

原始值有數字、字串、布林值、undefined、null。

但是在JavaScript中,

  • 數字可分為:原始值數字,數字型別物件。

  • 字串可分為:原始值字串,字串型別物件。

  • 布林值可分為:原始值布林值,布林值型別物件。

  • 但是undefined、null沒有上面這些東西。

可以像下面這樣生成原始值物件:


var num = new Number(123);

var str = new String('abcd');

var bol = new Boolean('true');
------------------------
num
Number {123}
------------------------
str
String {"abcd"}
------------------------
bol
Boolean {true}

下面講講包裝類

在下面程式碼中,num並不是一個物件,所以它不包含屬性和方法,應該報錯,但是並沒有。

var num = 4;
num.len = 3; // 在這裡num是原始值,原始值沒有方法函式,那怎麼辦呢
// 建立new Number(4).len = 3; 系統會建立數字型別物件,是為了不讓系統報錯, 然後會delete
console.log(num.len);
// 建立new Number(4).len; 同樣是為了不報錯
----------------------------------
輸出結果為:undefined

num.len = 3; 這裡,系統會新建一個數字物件new Number(4).len = 3; delete

。 讓物件的len等於3。然後刪除。 當下面語句再訪問num.len時,系統又會建立一個new Number(4).len, 但這個物件裡面沒有值,所以結果會是undefined,這個隱式的環節叫包裝類

來一道測試題:

var str = "abcd";
str.length = 2;
console.log(str);
--------------------------
abcd

這裡字串abcd並沒有被截斷,原理同上。

var str = "abcd";
//為不報錯,建立new String('abcd').length = 2;   delete
str.length = 2;
//再訪問str時,上面一步對str並沒有起作用,沒影響,所以還是輸出abcd。
console.log(str);
//而如果這裡訪問console.log(str.length),
//系統會建立,new String('abcd').length,輸出其值,4;

再來一道測試題:

var str = "abc";
str += 1;
var test = typeof(str); str = "string"
if(test.length == 6){
    test.sign = "typeof的返回結果可能為String";
}
console.log(test.sign);
--------------------------------
undefined

輸出結果並不是定義好的字串,而是undefined。解釋如下:

var str = "abc";
str += 1;
var test = typeof(str); str = "string"
if(test.length == 6){
    test.sign = "typeof的返回結果可能為String";
    //在這建立new String(test).sign = "xxx";
}
//當要再次呼叫test.sign時,
//又會建立new String(test).sign,這個物件和上面的沒關係。這裡為空,輸出值為undefined。
console.log(test.sign);