Literal 實字 var o1 = new Object(); var o2 = new Object(); o2.p = 1; o2.q = 2; var a1 = new Array(); var a2 = new Array(); a2[0] = 1; a2[1] = 2; var o1 = {}; var o2 = { p : 1, q : 2 }; var a1 = []; var a2 = [1, 2]; ← 意義相同 → JSON ?
Regular Expression Literal var r1 = new RegExp('JavaScript'); var r2 = new RegExp('JavaScript', 'gi'); var r1 = /JavaScript/; var r2 = /JavaScript/gi; ↑ 意義相同 ↓
Data Type • Primitive Type – number (值 float, 沒有型態 int) – string (沒有型態 char) – boolean – null – undefined • Object – Array – Function … string -> String number -> Number boolean -> Boolean var s = 'ABCDE'; alert(s.substr(1, 2)); // BC weak typing ⾃自動轉型
物件屬性存取⽅方式 • . 和 [] o.p ←意義相同→ o['p'] • 屬性名稱可以包含 任意字元 o['~!@#$%^&*(.'] var s = 'p'; var a = o[s]; var b = eval('o.' + s); var o = { '~!@#$%^&*.' : 1 }; Object Literal
物件好像 C# Dictionary, Java Map var o = {}; var key = 'k', value = 'v'; o[key] = value; if(o[key]) alert(o[key]); // v for(var i in o) { alert(i); // k alert(o[i]); // v } delete o[key];
Function 是物件 var f1 = new Function('x', 'y', 'return x + y'); var a = f2(1, 1); // js error, f2 is not a function var f2 = function(x, y) { return x + y; } var b = f2(1, 1); // 2 var c = f3(1, 1); // 2 function f3(x, y) { return x + y; }
Anonymous function 匿名函式 var a = [1, 3, 2, 5, 4]; function compare(a, b){ return a - b; } a.sort(compare); alert(a); // 1,2,3,4,5 var a = [1, 3, 2, 5, 4]; a.sort(function(a, b) { return a - b; }); alert(a); // 1,2,3,4,5
⽤用 call, apply 指定 this function f() { alert(this.p); } var a = { p : 1, m : f }, b = { p : 2, m : f }; a.m.call(b); // 2 f.call(b); // 2 a.m.call(b, 3, 4); a.m.apply(b, [3, 4]); function g() { a.m.apply(b, arguments); }
裡⾯面的函式宣告和外⾯面函式⼀一樣的變數 裡⾯面⽤用裡⾯面的 外⾯面⽤用外⾯面的 function f() { var a = 1; g(); alert(a); // 1 function g() { alert(a); // undefined var a = 2; alert(a); // 2 } }
Closure 匿名函式化 var h = (function() { var a = 1; return function() { ++a; } })(); var h = (function() { var count = 0; return function() { ++count; // 計算 h 的執⾏行次數 } })();
Scope chain var a = 1; function f() { var b = 2; g(); function g() { var c = 3; h(); function h() { var d = 4; alert(d); // 4 alert(c); // 3 alert(b); // 2 alert(a); // 1 } } } 裡⾯面的函式存取外⾯面函式的變數