JavaScript六種數據類型
js的弱類型特性
var num =32;
num = "this is a string";
在這個表達式裏,有如下結果:
32+32 // 64
"32" +32 // "3232"
"32"-32 // 0
我們將一些比較基礎的js數據類型稱爲“原始類型”:
- number
- string
- boolean
- null
- undefined
剩下的一種叫“對象類型”:
- object [如Function、Array、Date…]
JavaScript隱式轉換
//這裏+可以看作是字符串拼接
var x=' The answer is ' + 42;
var y =42 + 'is the answer' ;
// 這裏的+ -看作是加減法運算符
"37" - 7 // 30
"37" + 7 //37
巧用+/-規則轉換類型,實際上是根據不同的類型做不同的操作。
JavaScript中的運算符有很多,比如:
- “1.23” == 1.23
- 0 == false
- num == undefined
- new Object() == new Object()
- [1,2] == [1,2]
搞清楚這個邏輯,對JavaScript的入門也很重要。
我們來看看嚴格等於的邏輯:a===b
嚴格等於顧名思義,首先判斷等號兩邊的類型
- 如果類型不同,返回false,不需要進行下去了
- 如果類型相同:嘗試類型轉換和比較。如,null == undefined相等,number == string 轉number,boolean == ? 轉number,object == number | string 嘗試對象轉爲基本類型
JavaScript包裝對象
var srt = "string"; // str爲基本類型
var srtObj = new String ("string") // strObj爲對象類型
JavaScript中有一個比較隱藏的機制:當把一個基本類型嘗試以對象的方式去使用的時候,JavaScript會將這個基本類型轉化爲包裝對象,完成這個過程,這個臨時對象就會被銷燬掉,所以下面的代碼中會返回undefined
var a = "string";
alert(a.length); //6
a.t = 3;
alert(a.t); // undefined
JavaScript類型檢測
在js中檢測類型的方法有很多,比如說:
- typeof
- instanceof
- Object.prototype.toString
- constructor
- duck type
關於typeof:適合基本類型及function檢測,遇到null失效
type 100 返回 “number ”
type true 返回 “boolean ”
type function 返回 “function ”
type [1,2] 返回 “object ”
type NaN 返回 “number ”
type null 返回 “object ”
爲什麼typeof null === “object” ?
這其實是一個歷史的原因,事實上在標準規範中嘗試過讓它返回的結果爲null這樣一個字符串,但這會導致大量的網站無法訪問。
關於obj instanceof Object:適合自定義對象,也可以用來檢測原生對象,在不同iframe和window間檢測時失效
判斷左操作數的對象的原型鏈上是否有右邊這個構造函數的type屬性
- [1,2] instanceof Array === true
- new Object() instanceof Array === false
關於Object.prototype.toString
- Object.prototype.toString.apply([]);=== “[object Array]”;
- Object.prototype.toString.apply(function(){}); === “[object Function]”;
- Object.prototype.toString.apply(null);=== “[object Null]”
關於constructor、duck type
constructor會指向構造這個對象的構造函數,由於constructor可以被改寫,所以使用的時候要小心。