undefined & null
*undefined 是指已經宣告卻沒有賦予任何的值
*null 是「沒有值」的值
*JavaScript 變數的預設值為undefined
*JavaScript 不會將預設值設定為null,這是讓開發者用來定義「沒有值」的值
*undefined 不能使用在JSON資料格式中
*undefined 的類型(typeof)是undefined
*null 的類型(typeof)是object
*undefined 和null都屬於falsy(等價於false)
*使用為定義的變數會引發例外錯誤,使用undefined的變數則不會
範例1-2
var empty;
console.log(empty); //undefined
console.log(typeof empty); //"undefined";
empty = null;
console.log(empty); //null
console.log(typeof empty); //"object";
比較undefined和null
依據ECMAScript標準:
當==左右兩邊分別為undefined與null即回傳true
當===左右兩邊分別為undefined與null即回傳false
範例1-3
console.log(undefined == null); //true
console.log(undefined === null); //false
truthy & falsy
JavaScript的任意值,如果邏輯判斷中結果等價於true,但值實際上並不是true,可稱此為truthy,false也是相同並等價於false
邏輯判斷
if(任意值) {
//此為truthy
} else {
//此為falsy
};
範例1-4
可透過Boolean方法將值轉換
consloe.log(Boolean(""));
範例1-5
可用!! 簡化Boolean寫法,兩個!!等同於Boolean將任何值轉為布林值
console.log(!!""); // false
console.log(!!0); // false
console.log(!!null); // false
console.log(!!undefined); // false
console.log(!!NaN); // false
console.log(!!"hello"); // true
console.log(!!1); // true
console.log(!!{}); // true
console.log(!![]); // true
console.log(!!Infinity); //true
function arguments
First-class function(一級涵式)是指對其他(string,number,boolean等等)做的事情也可對function做。包括將functiuon指定成一個變數,傳入另一個function中當作參數,和物件一樣可設定屬性與方法等等。
每個涵式都有this和arguments這兩個特別的值,arguments可存取所有傳送到涵式的參數。
arguments是類似陣列的物件(Array-Like Object),如同陣列索引數的方式來存取值,並且具有length屬性,但不具備陣列原型方法,例如:filter,map,foreach…
範例1-6
沒有定義參數
function bulid(width, height) {
console.log(width);
console.log(height);
}
build(10,20,30);
範例1-7
透過arguments取得傳入參數
function build() {
var width = arguments[0];
var height = arguments[1];
var depth = arguments[2];
var length = arguments.length;
console.log(width, height, depth, length);
}
build(10,20,30);
範例1-8
將arguments轉換為標準陣列
function build() {
var args = new Array();
for (var i = 0; i < arguments; i++) {
args.push(arguments[i]);
}
args.forEach(function(item){
console.log(item);
});
}
build(10,20,30);
立即涵式(IIFE)
立即涵式(Immediately Invoked Function Expression)就是一個可立刻執行的涵式,常被用在只會執行一次的程式碼,例如初始化的動作,並可將程式碼包起來,形成一個區域,避免與全域變數污染,有兩種優點:
1.全域變數減少:若重複宣告相同到全域變數則會被覆蓋,變數暴露在全域中有可能被其他地方的程式修改,因此將變數放在立即涵式裡避免被修改。
2.全域變數區域化:把全域變數當作參數傳給立即涵式,JavaScript在尋找變數時會優先尋找區域變數,若找不到再去尋找上層或全域變數,在效率上可獲得提升。JavaScript進行壓縮時,並不會對全域變數進行重新命名,區域變數會重新命名,達到減少檔案大小。
範例1-9
在function內宣告區域變數
var a = 100;
(function(){
var b = true;
console.log(a); //100;
})();
console.log(b); //b is not defined
範例1-10
傳入全域變數到立即涵式內
(function(window, document) {
console.log(window, document);
})(window, document); //全域
finally
當無法預期程式是否會發生錯誤時,可用try…catch語句攔截發生的例外錯誤狀況。
finally也可使用在try或是try…catch上,但無法單獨使用。
在finally的區域都一定會執行,當try內有return時,會先執行完畢finally區塊內的程式才會回傳,finally內也有return,則會覆蓋掉try內的return。
範例1-11
一般try...catch語句
function run() {
try {
console.log(a);
} catch(e) {
console.log(e.message);
}
}
console.log(run());
範例1-12
會先執行finally才回傳
function run() {
try {
return "abc";
} finally{
console.log("xyz");
}
}
console.log(run());
範例1-13
覆蓋回傳值
function run() {
try {
return "abc";
} finally{
return "xyz";
}
}
console.log(run()); //"xyz";
switch
除了if…else判斷也可以使用switch…case,使用switch必須先設定好各種條件case,也可以加入預設值default,當所有條件均不符合時,就會執行預設值的程式碼。
範例1-14
一般寫法
switch ("Mark") {
case "Mark":
console.log("Mark");
break;
case "John":
console.log("John");
break;
case "Tom":
console.log("Tom");
break;
default:
console.log("Other");
}
範例1-15
在case中不使用break,可將複雜if...else,if..else改寫
var a = 5;
switch (true) {
case a < 5:
console.log("a<5");
break;
case a < 10:
console.log("a<10");
break;
default:
console.log("other");
}
範圍鏈(Scope chain)
每個變數都有自己的作用區域範圍,若使用前未經宣告(var),就會自動變成全域變數,若是function區域內宣告的變數,這個變數只能在這個區域內使用,涵數參數也相同。
範例1-16
var a = 1;
(function(){
console.log(a);
})();
範例1-17
var a = 1;
(function(){
var a = 100;
console.log(a);
})();
console.log(a);
範例1-18
var a = 1;
(function(){
a = 100;
console.log(a);
})();
console.log(a);
範例1-19
var a = 1;
(function(a){ //a->var
a = 100;
console.log(a); //網外層找
})();
console.log(a);
近期评论