JavaScript數據類型及(隱式)類型轉換詳解

JavaScript是一種很是靈活的現代編程語言,靈活到使用者極其容易被忽視的它那廣闊的世界以及它帶給咱們的無限遐想空間。本文將對JavaScript最最基礎也最容易被忽視的數據類型問題和類型轉換問題進行探索。


數據類型

衆所周知,JavaScript有8種內置數據類型:string,number,boolean,object,null,undefined,function,symbol(來自ES規範)。
除了object外,咱們一般稱其餘類型爲基本類型(typeof null 的運算結果是'object',有些人認爲這是個由來已久的‘bug’)。基本類型能夠想對象同樣產生直接調用類型方法(若是有的話),如4.toFixed,'hello'.split('l')等。編程

typeof 運算符老是會返回一個字符串

typeof sd;//"undefined"
var a = 3;
typeof a; // "number"
a = true;
typeof a; // "boolean"
typeof typeof 42; // "string"
typeof function a(){ /* .. */ }  // "function"
typeof {a:12,b:2};//"object"
typeof [121,2324];//"object"
typeof null ;//"object"

利用typeof 運算符安全的檢查變量是否認義

//檢查變量
// 這樣會拋出錯誤ReferenceError
if (testObject) {
    console.log( "defined" );
}
// 這樣是安全的
if (typeof DEBUG !== "undefined") {
    console.log( "defined" );
}

類型轉換

類型轉換(type casting)指的是將值從一種類型轉換爲另外一種類型。顯示的調用轉換過程稱爲顯式強制類型轉換,隱
式的狀況稱爲隱式強制類型轉換(coercion)。可是坦白說,你知道,就是顯示,你不知道,即是隱式。安全

顯示類型轉換

顯式強制類型轉換旨在讓代碼更加清晰易讀編程語言

//這裏爲何多了個'.'?不加點(12.toString())js會認爲12.是一個數字總體,故而報語法錯誤(SyntaxError)
12..toString();//"12"    
var num = 120;//"120"
Number('012');//12
parseInt('012.3asd88')//12;注意,parseInt返回Str[0]開始的有效數字字符組成的數字
parseFloat('012.3asd88')//12.3;
Boolean(10);//true
Boolean(new Boolean);//true;注意哦,這裏會返回true

隱式類型轉換

這是一種簡化的語法,編譯器爲了咱們方便(可能吧),在這方面幫咱們作了不少事。
隱式強制類型轉換是隱蔽的強制類型轉換,而你本身以爲不夠明顯的強制類型轉換均可以算做隱式強制類型轉換。隱式強制類型轉換讓代碼變得晦澀難懂而又‘便捷而奇妙’。code

+new Date();//1564536588540;== new Date().valueOf();
   '12' + 1;//"121"
    false - 1;//-1
    false - '1';//-1
    false + '1';//"false1"
    [1,2,3] + '';//"1,2,3"
    if(0 /*false*/){}
    if([] /*true*/){}

讓人困惑的求等:==和===(寬鬆相等和嚴格相等)詳解

JavaScript 中,判斷兩個值是否「相等」能夠用寬鬆相等(loose equals) == 和嚴格相等(strict equals) === 。可是在判斷條件上它們有一個很重要的區別。 很多人認爲「 == 檢查值是否相等, === 檢查值和類型是否相等」。然而還不夠準確。不少 JavaScript 的書籍和博客也是這樣來解釋 的,可是很遺憾他們都錯了。 事實上,== 容許在比較中進行強制類型轉換,而 === 不容許。 這幾個狀況須要注意:對象

•  null == 0;//false;null 除了null 和undefined,與null或undefined執行==都會得false
•  [] == ![];//true;意外吧!
•  false == []; // true
•  "" == 0; // true 
•  "" == []; // true
•  0 == []; // true
•  NaN === NaN;//false;NaN不等於NaN,不論嚴不嚴格
•  +0 === -0; //true;
•  "0" == false; // true
•  42 == "43"; // false
•  "foo" == 42; // false
•  "true" == true; // false
•  42 == "42"; // true
•  "foo" == [ "foo" ]; // true

根據ECMA規範,模糊相等計算‘==’通常是如下四種狀況或者其組合:ip

var a = *;
var b = *;
a === b; 
a == b;
  1. 字符串和數字之間的相等比較

    ES5 規範 11.9.3.4-5 這樣定義:
    (1) 若是 Type(x) 是數字, Type(y) 是字符串,則返回 x == ToNumber(y)
    的結果。
    (2) 若是 Type(x) 是字符串, Type(y) 是數字,則返回 ToNumber(x) == y
    的結果。ci

  2. 其餘類型和布爾類型之間的相等比較

    ES5 規範 11.9.3.6-7 :
    (1) 若是 Type(x) 是布爾類型,則返回 ToNumber(x) == y 的結果;
    (2) 若是 Type(y) 是布爾類型,則返回 x == ToNumber(y) 的結果。字符串

  3. null 和 undefined 之間的相等比較

    ES5 規範 11.9.3.2-3 :
    (1) 若是 x 爲 null , y 爲 undefined ,則結果爲 true 。
    (2) 若是 x 爲 undefined , y 爲 null ,則結果爲 true 。編譯器

  4. 對象和非對象之間的相等比較

    ES5 規範 11.9.3.8-9 :
    (1) 若是 Type(x) 是字符串或數字, Type(y) 是對象,則返回 x == ToPrimitive(y)的結果;
    (2) 若是 Type(x) 是對象, Type(y) 是字符串或數字,則返回 ToPromitive(x) == y的結果。
    抽象操做 ToPrimitive (參見 ES5 規範 9.1 節)是爲了求對象的‘值’,它首先(經過內部操做 DefaultValue ,參見 ES5 規範 8.12.8 節)檢查該值是否有 valueOf() 方法。
    若是有而且返回基本類型值,就使用該值進行強制類型轉換。若是沒有就使用 toString()的返回值(若是存在)來進行強制類型轉換。
    若是 valueOf() 和 toString() 均不返回基本類型值,會產生 TypeError 錯誤。博客

注意,對 == 兩邊的值認真推敲,爲了避開沒必要要的錯誤,咱們能夠遵循兩個原則。

• 若是兩邊的值中有 true 或者 false ,千萬不要使用 == 。
• 若是兩邊的值中有 [] 、 "" 或者 0 ,儘可能不要使用 == 。
相關文章
相關標籤/搜索