var test = null;
typeof test // "object"
var str1;
var str2;
typeof str1; // "undefined"
str1 == str2; // true
str1 === str2 // false
undefined 像是系統層級的錯誤值(嘗試去取得未初始化的參數)
null 像是程式層級的空值(非錯誤)
在web browser開啟時啟動Javascript會創建group參數。
var group = this;
看看以下的例子
var str = "test";
當我們str是"test"(字串)時,JavaScript 會透過 new String(str)的方式轉成Object,這個Object繼承了String的方法,所以這時候可以去引用String的方法或屬性,當引用結束後,會將這個創立的Object銷毀(實際上不一定是真的銷毀)
所以看看以下的例子
var str = "test";
str.len = 5;
str.len; // return "undefined"
可以看到str.len 會回undefined,這是因為上面所說的當引用結束會將Object銷毀
var str1 = "test";
var str2 = new String(str1);
str1; // return "test"
str2; // teturn String {"test"} ->是一個String 的Object 如下圖
str1 == str2; // return true
str1 === str2; // return false
typeof str1; // "string"
typeof str2; // "object"
Number()、Boolean()、String()是同樣的邏輯。
當在參考 string number boolean 的特性,會暫時產生Wrapper物件 (有種臨時物件的感覺),當對wrapper 物件操作時,如果碰到需要基本型別的場景,也是會被自動轉換。
wrapper 屬於js得實作細節,無法定義新特性
wrapper物件是JavaScript的實作,string、number、boolean與物件的差異在於他們無法加新的特性,新增完隨即會被註銷。
當在使用boolean時,但提供任意類型值,JavaScript會根據需要自動轉換類型
value | string | number | boolean | object |
---|---|---|---|---|
undefined | "udefined" | NaN | false | throws TypeError |
null | "null" | 0 | false | throws TypeError |
true | "true" | 1 | true | new Boolean(true) |
false | "false" | 0 | false | new Boolean(false) |
""(空字串) | 0 | false | new String("") | |
"1.5" | 1.5 | true | new String("1.5") | |
0 | "0" | 0 | false | new Number(0) |
-0 | "0" | -0 | false | new Number(-0) |
NaN | "NaN" | NaN | false | new Number(NaN) |
Infinity | "Infinity" | Infinity | true | new Number(Infinity) |
-Infinity | "-Infinity" | -Infinity | true | new Number(-Infinity) |
null == undefined;
"0" == 0;
0 == false;
"0" == false
undefined 在轉成boolean時會以false表示,但不代表 undefiined == false。
str1="string";
str2 = new String("string");
str1 == str2 // true
// str2 會先執行 str2.valueof() 在作比較
str1 === str2 // false
參考資料: valueof() and tostring()
JavaScript會將宣告的參數提昇(hoisting)到函數的頂端(僅提昇宣告,並未做賦予值)
var scope = "global";
function() {
console.log(scope); // "undefined"
var scope = "local";
console.log(scope); // local
}
可以看出第三行印出的是"undefined",非"global",再來看看以下經過hoisting後的程式
var scope = "global";
function() {
var scope;
console.log(scope); // "undefined"
scope = "local";
console.log(scope); // local
}
以上的程式,可以看出hoisting後第三行對scope宣告,但為初始會(給值),所以第四行會是"undefined",第五行才給值,所以第六行才有local可以印出。