Speaking
JavaScript
By Justin
本書的四個部分
- JavaScript 快速入門
- 背景知識
- 深入探討 JavaScript
- 訣竅、工具與程式庫
有興趣看原文的可以點這 : http://speakingjs.com/
關於本書你需要知道的事
- 目標讀者
- 不涵蓋的範圍
- 所用的 JavaScript 版本
今天會聊到的部分
- JavaScript 的背景知識
- JavaScript 語法
背景知識
JavaScript
vs
ECMAScript
影響
JavaScript 的本質
- 它是動態的
- 它是動態定型的
- 它是函式型的也是物件導向的
- 它會無聲無息的失敗
- 它是以原始碼方式部署
- 它是 Web 平台的一部份
JavaScript 是如何
被創造出來的?
1993年,NCSA的 Mosaic 是第一個廣受歡迎的 web 瀏覽器
1994年,Netscape看準www的潛力而創立,創造了 Netscape Navigator 瀏覽器稱霸了 1990 年代
1995年,Netscape 為了讓 Web 更動態,於是聘用 Brendan Eieh 讓他在瀏覽器中實作 Scheme
Brendan Eieh 在 5月花了十天寫出了這個原型
JavaScript 第一個代號是 Mocha
標準化 : ECMAScript
1996 年 8 月,微軟在 IE 3.0 實作了相同的語言,但稱為 JScript。
有部分原因是為了不讓微軟掌握全局,Netscape 決定要標準化 JavaScript,並要求標準化組織 Ecma International 來提供這個標準。
在 1996年 11月 發展出 ECMA-262 這個規格。但因為 Sun 註冊了 JavaScript 的商標,所以就改稱為 ECMAScript
ECMAScript 1 (1997年 6月)
ECMAScript 2 (1998年 8月)
ECMAScript 3 (1999年 12月)
ECMAScript 4 (2008年 7月被終止)
ECMAScript 5 (2009年 12月)
ECMAScript 5.1 (2011年 6月)
ECMAScript 6 (2015年 6月)
JavaScript 歷史里程碑
1997 - Dynamic HTML
1999 - XMLHttpRequest
2001 - JSON
2004 - Dojo Tookit (js編寫的大型軟體系統的框架)
2005 - ajax
2005 - Apache CouchDB (以 js 為中心的資料庫)
2006 - JQuery
2007 - WebKit 讓 mobile Web 成主流
2008 - V8 證明 JS 也可以很快
2009 - Node.Js 在伺服器實作了 JS
2009 - PhoneGap 使用HTML 5 撰寫原生的 app
2009 - ChromeOS 讓瀏覽器成為作業系統
2011 - Windows 8 HTML5 app
語法概觀
var x; //宣告一個變數
x = 3 + y; // 將一個值(value) 指定(assign)給變數 x
foo(x,y); // 以參數 x, y 來呼叫 foo 函式
obj.bar(3); // 呼叫物件 obj 的 bar 方法
// 一個條件式述句
if(x === 0){
x = 123;
}
// 定義帶有參數 的 baz 函式
function baz(a, b){
return a + b;
}
分號
var x = 3 * 7;
var f = function() {}; // 函式宣告裡的函式運算式
var y = 0
var z = 2
在 JavaScript 中,分號是選擇性的
註解
x++; // 單行註解
/*
這是
多行
註解
*/
變數宣告與指定
var foo; // 宣告變數 foo
var foo = 6; // 宣告變數 foo 並指定值
foo = 4; // 指定一個值給變數
// 複合指定運算子
foo += 1;
foo = foo + 1;
識別字
基本型別 (primitive values)
- booleans
- 數字
- 字串
- null
- undefined
其他非基本型別的值都是物件
> var obj1 = {}; // 一個空物件
> var obj2 = {}; // 另一個空物件
> obj1 === obj2;
false
> obj1 === obj1
true
> var prim1 = 123;
> var prim2 = 123;
> prim1 === prim2;
true
基本型別值
- Booleans : true、false
- Numbers : 1234、1.451
- Strings : 'abc'、"abc"
- 非值 : null、undefined
// 以值比較他們的內容
> 3 === 3
true
> 'abc' === 'abc'
true
// 無法變更的特性
> var str = 'abc';
> str.length = 1;
> str.length
3
> str.foo = 3;
> str.foo // 無效
undefined
物件
// 一般物件
var obj = {
firstName: 'Jane',
lastName: 'Doe'
};
// 陣列
var objArr = ['apple','banana'];
// 正規表達式
var regex = /^a+b+$/;
// 特徵
> ({} === {})
false
> var obj1 = {};
> var obj2 = obj1;
> obj1 === obj2
true
Undefined 與 null
// undefined 代表 「沒有值 ( no value )」。未初始化的變數
> var foo;
> foo
undefined
> function f(x) { return x }
> f()
undefined
> var obj = {};
> obj.foo
undefined
// 檢查方式
if (x === undefined || x === null){
}
if(!x){
}
Booleans
// &&、||、!、===、!==、==、!=、>、>=、<、<= 皆會產生 booleans
/*
以下都會被解讀為 false
undefined、null
Boolean : false
Number : 0, NaN
String : ''
其他所有的值都會被視為 true
*/
> Boolean(undefined)
false
> Boolean(0)
false
> Boolean(3)
true
> Boolean({})
true
> Boolean('false')
true
數值
// JavaScript 中的所有數值都是浮點數
> 1 === 1.0
true
// 特殊數字
NaN (not a number)
> Number('xyz')
NaN
Infiity
> 3/0
Infinity
> Math.pow(2, 1024)
Infinity
// Infinity 比任何數字還大 (除了 NaN)
字串
'abc'
"abc"
'Did she say "Hello"?'
> 'That\'s nice!'
"That's nice!"
> var str = 'abc';
> str[1]
b
> 'abc'.length
3
條件式
if (myvar === 0) {
// then
}
if (myvar === 0) {
// then
} else {
// else
}
if (myvar === 0) {
// then
} else if (myvar === 1) {
// else-if
} else {
// else
}
迴圈
for (var i=0; i<arr.length; i++) {
console.log(arr[i]);
}
var i = 0;
while (i < arr.length) {
console.log(arr[i]);
i++;
}
do {
// ...
} while(condition)
// break 會跳離迴圈
// continue 會起是一次新的迴圈
函式
function add(param1, param2) {
return param1 + param2;
}
> add(1, 2)
3
> add('a', 'b')
'ab'
var add = function(param1, param2) {
return param1 + param2;
};
// 函式會被拉升
function foo() {
boo();
function boo() {
// ...
}
}
特殊變數 arguments
> function f() { return arguments }
> var args = f('a', 'b', 'c');
> args.length
3
> args[0]
'a'
function f(x, y) {
console.log(x, y);
return toArray(arguments);
}
> f('a', 'b', 'c')
a b
[ 'a', 'b', 'c']
> f('a')
a undefined
[ 'a' ]
> f()
undefined undefined
[]
例外處理
function getPerson(id) {
if (id < 0) {
throw new Error('Id must not be negative')
}
return { id: id };
}
function getPersons(ids) {
var result = [];
ids.forEach(function (id) {
try {
var person = getPerson(id);
result.push(person);
} catch (ex) {
console.log(ex);
}
});
return result;
}
Strict 模式
'use strict'
function add() {
'use strict'
}
IIFE 模式
// immediately invoked finction expression 即刻調用的函式運算式
(function () {
// do something
}());
預知更多詳情
請密切關心讀書會動態
2017/12/14 菁英讀書會
By CHI, YUN-JAI
2017/12/14 菁英讀書會
Justin 報告 Speaking JavaScript
- 951