javascript語法介紹

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);