javascript標準對象與包裝對象

 

標準對象

在JavaScript的世界裏,一切都是對象。 函數

可是某些對象仍是和其餘對象不太同樣。爲了區分對象的類型,咱們用typeof操做符獲取對象的類型,它老是返回一個字符串: spa

typeof 123; // 'number' typeof NaN; // 'number' typeof 'str'; // 'string' typeof true; // 'boolean' typeof undefined; // 'undefined' typeof Math.abs; // 'function' typeof null; // 'object' typeof []; // 'object' typeof {}; // 'object'

可見,number、string、boolean、function和undefined有別於其餘類型。特別注意null的類型是object,Array的類型也是object,若是咱們用typeof將沒法區分出null、Array和一般意義上的object——{}。 code

包裝對象

除了這些類型外,JavaScript還提供了包裝對象,熟悉Java的小夥伴確定很清楚int和Integer這種曖昧關係。 對象

number、boolean和string都有包裝對象。沒錯,在JavaScript中,字符串也區分string類型和它的包裝類型。包裝對象用new建立: ip

var n = new Number(123); // 123,生成了新的包裝類型 var b = new Boolean(true); // true,生成了新的包裝類型 var s = new String('str'); // 'str',生成了新的包裝類型

雖然包裝對象看上去和原來的值如出一轍,顯示出來也是如出一轍,但他們的類型已經變爲object了!因此,包裝對象和原始值用===比較會返回false: 字符串

typeof new Number(123); // 'object' new Number(123) === 123; // false typeof new Boolean(true); // 'object' new Boolean(true) === true; // false typeof new String('str'); // 'object' new String('str') === 'str'; // false

因此閒的蛋疼也不要使用包裝對象!尤爲是針對string類型!!! string

若是咱們在使用Number、Boolean和String時,沒有寫new會發生什麼狀況? io

此時,Number()、Boolean和String()被當作普通函數,把任何類型的數據轉換爲number、boolean和string類型(注意不是其包裝類型): function

var n = Number('123'); // 123,至關於parseInt()或parseFloat() typeof n; // 'number' var b = Boolean('true'); // true typeof b; // 'boolean' var b2 = Boolean('false'); // true! 'false'字符串轉換結果爲true!由於它是非空字符串! var b3 = Boolean(''); // false var s = String(123.45); // '123.45' typeof s; // 'string'

是否是感受頭大了?這就是JavaScript特有的催眠魅力! 變量

總結一下,有這麼幾條規則須要遵照:

  • 不要使用new Number()、new Boolean()、new String()建立包裝對象;

  • 用parseInt()或parseFloat()來轉換任意類型到number;

  • 用String()來轉換任意類型到string,或者直接調用某個對象的toString()方法;

  • 一般沒必要把任意類型轉換爲boolean再判斷,由於能夠直接寫if (myVar) {...};

  • typeof操做符能夠判斷出number、boolean、string、function和undefined;

  • 判斷Array要使用Array.isArray(arr);

  • 判斷null請使用myVar === null;

  • 判斷某個全局變量是否存在用typeof window.myVar === 'undefined';

  • 函數內部判斷某個變量是否存在用typeof myVar === 'undefined'。

最後有細心的同窗指出,任何對象都有toString()方法嗎?null和undefined就沒有!確實如此,這兩個特殊值要除外,雖然null還假裝成了object類型。

更細心的同窗指出,number對象調用toString()報SyntaxError:

123.toString(); // SyntaxError

遇到這種狀況,要特殊處理一下:

123..toString(); // '123', 注意是兩個點!
(123).toString(); // '123'

不要問爲何,這就是JavaScript代碼的樂趣!

相關文章
相關標籤/搜索