天天看點

js 标準對象

轉自:js 标準對象

在JavaScript的世界裡,一切都是對象。

但是某些對象還是和其他對象不太一樣。為了區分對象的類型,我們用

typeof

操作符擷取對象的類型,它總是傳回一個字元串:

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——

{}

包裝對象

除了這些類型外,JavaScript還提供了包裝對象,熟悉Java的小夥伴肯定很清楚

int

Integer

這種暧昧關系。

number

boolean

string

都有包裝對象。沒錯,在JavaScript中,字元串也區分

string

類型和它的包裝類型。包裝對象用

new

建立:

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

類型!!!

如果我們在使用

Number

Boolean

String

時,沒有寫

new

會發生什麼情況?

此時,

Number()

Boolean

String()

被當做普通函數,把任何類型的資料轉換為

number

boolean

string

類型(注意不是其包裝類型):

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(); // '123', 注意是兩個點!
(123).toString(); // '123'
           

不要問為什麼,這就是JavaScript代碼的樂趣!