JavaScript | 深入理解js的資料型別
導讀
5種基本資料型別:Undefined、Null、Boolean、Number、String
1種複雜資料型別:Object
typeof操作符
檢測給定變數的資料型別
var message = "abc"
var msg2;
alert(typeof (msg)); //undefined,未宣告
alert(typeof (msg2)); //undefined,未初始化
alert(typeof (true)); //boolean
alert(typeof (12)); //number
alert(typeof (message)); //string
alert(typeof (null)); //object
資料型別
Undefined
只有一個值,“undefined”
看栗子:
var msg;
// var str;
alert(msg);//undefined
alert(str);//報錯
對於未宣告的變數,只能用typeof檢測其資料型別
var msg;//msg聲明後預設值是undefined
// var str;
alert(typeof (msg));//undefined
alert(typeof (str));//undefined
上述例子說明:未初始化的變數和未宣告的變數用typeof檢測其資料型別,都是undefined。
所以最好初始化變數,這樣當typeof返回“undefined”時,就知道該變數還沒有宣告。
Null
只有一個值,“null”
從邏輯角度看,null值表示一個空物件指標,typeof檢測null值返回”object”。
alert(typeof (null));//object
如果定義的變數將來用作儲存物件,那麼最好初始化為null,這樣只要檢查null值就能知道相應的變數是否已經儲存了一個物件的引用
alert(null == undefined);//true
undefined值是派生自null值的,ECMA-262規定對他們的相等性測試要返回true。雖然這裡的相等操作符(==)總是返回true,但這個操作符處於比較的目的會轉換其運算元。
undefined和null用途完全不同:無論什麼情況下都沒必要把一個變數的值顯式地設定為undefined;但意在儲存物件的變數還沒有真正儲存物件,就明確讓變數儲存null值。體現null作為空物件指標的慣例,進一步區分null和undefined。
undefined 和null 常被用來表示“空的”值或“不是值”的值。二者之間有一些細微的差別:
null 指空值(empty value)
undefined 指沒有值(missing value)
null 是一個特殊關鍵字,不是識別符號,我們不能將其當作變數來使用和賦值。然而undefined 卻是一個識別符號,可以被當作變數來使用和賦值。
Boolean
兩個字面值:true false
ES中所有型別的值都有與這兩個Boolean值等價的值,轉型函式Boolean()
看栗子:
var msg = "hello!"
var msgBoolean = Boolean(msg);
alert(msgBoolean);//true
Boolean()轉換規則:
資料型別 | 轉為true的值 | 轉為false的值 |
---|---|---|
Boolean | true | false |
String | 任何非空字串 | **(空字串) |
Number | 任何非零數字值(包括無窮大) | 0和NaN |
Object | 任何物件 | null |
Undefined | n/a | undefined |
這些轉換規則對理解流控制語句自動執行相應的Boolean轉換很重要,因此確切地知道流控制語句中使用的是什麼變數至關重要。錯誤地使用一個物件而不是Boolean值,就有可能徹底改變應用程式的流程。
看栗子,應用在流控制語句中:
var msg = "hello!";
if(msg){
alert(msg);
}
拓展:
var a = null;
var b = {};
var c = {name:'xx'};
if(!b){ console.log(1);}
else if(b == a) { console.log(2);}
else { console.log(3);}
//打印出3
if({name:'xx'})console.log("true"); // true
在此,想要說明的是null是空物件指標,裡面沒有東西的;而b的變數值存放了一個地址引用(也叫做地址指標),從列印的結果來看,{}能找到它的原型,證明它裡面是有東西的,這個以後也能接觸到,在這裡就不長篇大論啦。
Number
用IEEE754格式來表示整數和浮點數值。
在進行算術計算時,所有以八進位制和十六進位制表示的數值最終都被轉換成十進位制數值(八進位制字面量在嚴格模式下是無效的,導致支援的javascript引擎丟擲錯誤)。
javascript可以儲存正零(+0)和負零(-0),被認為相等。
浮點數值計算會產生舍入誤差,是使用基於IEEE754數值的浮點計算的通病。看栗子:
var a=0.1,b=0.2;
sum=a+b;
console.log(sum); //0.30000000000000004
如果某次計算的結果得到一個超出js數值範圍的值,這個數值就被自動轉換成特殊的Infinity值。如果某次計算返回了正/負的Infinity值,那麼該值無法繼續參與下一次的計算,這個值不是能夠參與計算的數值。要想確定一個數值是不是有窮的(是不是位於最大和最小值之間),可以用isFinite()函式,這個函式在引數位於最大與最小值間返回true。
NaN:表示一個本來要返回數值的運算元未返回數值的情況(這樣就不會丟擲錯誤了)。eg:其他程式語言中,任何數除以0都會導致錯誤。從而停止程式碼執行,但在ES中,任何數除以0都會返回NaN,不會影響其他程式碼的執行。特點:①任何涉及NaN的操作,都會返回NaN,這個在多步計算中可能導致問題;②NaN與任何值都不想等,包括NaN本身。
alert( NaN == NaN );//false
String
由零或多個16位的Unicode字元組成的字元序列,即字串。
5.1 字元字面量
字面量 | 含義 |
---|---|
\n | 換行 |
\t | 製表 |
\b | 空格 |
\r | 回車 |
\\ | 斜槓 |
\’ | 單引號(’),在用單引號表示的字串中使用 |
\” | 雙引號(”),在用雙引號表示的字串中使用 |
\xnn | 以十六進位制程式碼nn表示的一個字元(n為0~F) |
\unnnn | 以十六進位制程式碼nnnn表示的一個Unicode字元(n為0~F) |
字串特點
ES中的字串是不可變,要改變的話只能銷燬原本的字串。
看栗子:
var lang = 'Java'
lang = lang + 'Script'
實際操作:先建立一個容納10個字元的新字串,字串拼接成JavaScript之後,會銷燬Java和Script兩個字串(部分舊瀏覽器拼接字串慢)。
轉換字串
toString():把一個邏輯值轉換為字串,並返回結果
var num = 10;
alert (num.toString()); //除了null和undefined,其他資料型別都能用這個方法
alert(num.toString(8)); //數值可傳引數,引數指定輸出的值的基數(進位制)
轉型函式String():在不確定值是否為null和undefined時
var value1=10,value2=null,value3;
console.log(String(value1));//如果值有toString()方法,呼叫toString(),返回10
console.log(String(value2));//返回null
console.log(String(value3));//返回undefined
Object
JavaScript 中的所有事物都是物件:字串、數值、陣列、函式…
此外,JavaScript 允許自定義物件。物件只是帶有屬性和方法的特殊資料型別。
ES中的物件的行為不一定適用於js中的其他物件。瀏覽器環境中的物件,eg:BOM物件和DOM物件,屬於宿主物件,可能會也可能不會繼承Object。
參考文獻:
〔1〕Nicholas C. Zakas .
Professional JavaScript for Web Developers,3rd Edition[M] . Wrox . 2012
〔2〕Kyle Simpson . You Don’t Know JS[M] . O’Reilly Media . 2014