摘要:原文第一章主要介紹的大概情況基本語法。通過和來引用對象屬性或數(shù)組元素的值就構(gòu)成一個(gè)表達(dá)式。
原文:https://keelii.github.io/2016/06/16/javascript-definitive-guide-note-0/
JavaScript 簡介第一章 主要介紹 JavaScript 的大概情況、基本語法。之前沒有 JavaScript 基礎(chǔ)的看不懂也沒關(guān)系,后續(xù)章節(jié)會有進(jìn)一步的詳細(xì)說明,我會通讀一遍 《JavaScript 權(quán)威指南》,然后根據(jù)個(gè)人的理解整理出來我認(rèn)為重要的核心概念,同時(shí)我也會參考原版英文版 JavaScript The Definitive Guide,取一些關(guān)鍵性、重要的單詞做補(bǔ)充
中文排版指南遵守 中文文案排版指北,歡迎批評批正
JavaScript 是面向 web 的編程語言,是一門 高階的(high-level)、動態(tài)的(dynamic)、弱類型的(untyped)解釋型(interpreted)編程語言,適合面向?qū)ο螅╫op)和函數(shù)式的(functional)編程風(fēng)格。JavaScript 語法源自 Java 和 C,一等函數(shù)(first-class function)來自于 Scheme,它的基于原型繼承來自于 Self
JavaScript 的版本JavaScript 語言規(guī)范由 ECMA 國際發(fā)布,版本號一般叫做 ECMAScript x,如:ECMAScript 3, ECMAScript 5, ECMAScript 6,簡稱 ES x
Mozilla 發(fā)布的 JavaScript 版本一般叫做 JavaScript x.x,如:JavaScript 1.3, JavaScript 1.5
Micorsoft 發(fā)布的 JavaScript 版本一般叫做 JScript
可以這么說 「Mozilla 和 Micorsoft 開發(fā)的瀏覽器中 JavaScript內(nèi)核一般都實(shí)現(xiàn)了某個(gè) ECMAScript 版本的規(guī)范」
JavaScript 語言核心有很多 API,比如:針對字符串、數(shù)組、正則、日期。但這些通常不包括輸入輸出 API(類似網(wǎng)絡(luò)、存儲、圖形相關(guān)的特性),輸入輸出 API 一般是由 JavaScript 的宿主環(huán)境(host environment)提供的,通常是瀏覽器
JavaScript 語言核心 變量/賦值快速預(yù)覽下 JavaScript 變量的用法
// 雙斜線之后內(nèi)容是單行注釋 /* 這是多行注釋 */ // 變更是表示值的一個(gè)符號名字,通過 var 關(guān)鍵字聲明 var x; // 聲明一個(gè)變量 x // 值可以通過等號賦值給變量 x = 0 // 現(xiàn)在變量 x 的值為 0 x // => 0 通過變量獲取其值 // JavaScript 支持多種數(shù)據(jù)類型 x = 1; // 數(shù)字 x = 0.01; // 整數(shù)和實(shí)數(shù)都是數(shù)字(number)類型 x = "hello world" // 字符串 x = "JavaScript"; // ... x = true; // 布爾值 x = false; // ... x = null; // 是一個(gè)特殊的值,意思是「空」 x = undefined; // 和 null 非常累似對象/數(shù)組
JavaScript 中兩個(gè)非常重要的數(shù)據(jù)類型是對象和數(shù)組
// 對象是名/值對的集合,或字符串到值映射的集合 var book = { // 對象由花括號括起來 topic: "JavaScript", // book 對象的屬性 topic 的值是 "JavaScript" fat: true }; // 通過「.」或「[]」來訪問對象屬性 book.topic // => "JavaScript" book.["fat"] // => true book.author = "Flanagan" // 通過賦值給 book 對象創(chuàng)建一個(gè)新屬性 author // JavaScript 數(shù)組 var primes = [2, 3, 5, 7]; primes[0] // => 2 通過數(shù)組下標(biāo)訪問第一個(gè)元素 primes.length // => 4 數(shù)組中元素的個(gè)數(shù) primes[4] = 9 // => 9 添加新元素 primes[6] = 11 // => 11 此時(shí)數(shù)組變成 [2, 3, 5, 7, 9, undefined, 11], 長度也變?yōu)?7 // 對象數(shù)組 var points = [ { x: 0, y: 0 }, { x: 1, y: 1 } ]; // 數(shù)組對象 var data = { listA: [1, 3, 5], listB: [2, 4, 6] };表達(dá)式/運(yùn)算符
通過方括號定義數(shù)組元素和通過花括號定義對象屬性名和值的語法稱為 初始化表達(dá)式(initializer expression),表達(dá)式是 JavaScript 中的一個(gè)短語,這個(gè)短語可以通過運(yùn)算得出一個(gè)值。通過「.」和「[]」來引用對象屬性或數(shù)組元素的值就構(gòu)成一個(gè)表達(dá)式。上面的代碼中注釋中箭頭(=>)后的值就是表達(dá)式的運(yùn)算結(jié)果
JavaScript 中最常見的表達(dá)式寫法就是像下面代碼一樣使用運(yùn)算符(operator),運(yùn)算符作用于操作數(shù),生成一個(gè)新的值
// 最常見的是算術(shù)運(yùn)算符 3 + 2 // => 5 加法 3 - 2 // => 1 減法 3 * 2 // => 6 乘法 3 / 2 // => 1.5 除法 points[1].x - points[0].x // => 1 復(fù)雜的操作數(shù)運(yùn)算 "3" + "2" // => "32" 字符串連接 // 運(yùn)算符簡寫形式 var count = 0; count++; // 自增1 count--; // 自減1 count += 2; // 自加2, 相當(dāng)于 count = count + 2 count *= 3; // ... count // => 6 變量名本身也是表達(dá)式 var x = 2, y = 3 x == y // => false x != y // => true x < y // => true x <= y // => true x == y // => false "two" == "three" // => false "two" > "three" // => true "tw" 在字母表中的索引大于 "th" false == (x > y) // => true // 邏輯運(yùn)算符 (x == 2) && (y == 3) // true (x > 2) && (y < 3) // false !(x == y) // true
如果 JavaScript 中的「短語」是表達(dá)式,那么整個(gè)句子就稱做 語句(statement),以分號結(jié)束的行都是一條語句。語句和表達(dá)式有很多共同之處
函數(shù)粗略了講,表達(dá)式僅僅計(jì)算出一個(gè)值并不進(jìn)行其它操作,不會改變程序的運(yùn)行狀態(tài),而語句并不包含一個(gè)值(或者說它包含的值我們并不關(guān)心),但它們改變了程序運(yùn)行狀態(tài)
函數(shù)是帶有名稱(named)和參數(shù)的 JavaScript 代碼片段,可以一次定義多次調(diào)用
function plus1(x) { // 定義了一個(gè)名為 plus1 的函數(shù),帶有參數(shù) x return x + 1; // 返回一個(gè)比傳入?yún)?shù)大 1 的數(shù)值 } // 函數(shù)代碼塊是由花括號包裹起來的部分 plus1(3) // => 4 函數(shù)調(diào)用結(jié)果為 3+1 var square = function(x) { // 函數(shù)是一種值,可以賦值給變量 return x * x; }; square(plus1(3)) // => 16 在一個(gè)表達(dá)式中調(diào)用兩個(gè)函數(shù)
當(dāng)函數(shù)和對象合寫在一起時(shí),當(dāng)函數(shù)就變成了「方法」(method):
// 當(dāng)函數(shù)賦值給對象的屬性,我們稱為「方法」,所有 JavaScript 對象都含有方法 var a = []; // 創(chuàng)建一個(gè)空數(shù)組 a.push(1, 2, 3); // 調(diào)用數(shù)組的添加元素方法 a.reverse(); // 調(diào)用數(shù)組的次序反轉(zhuǎn)方法 // 自定義方法 points.dist = function() { var p1 = this[0]; var p2 = this[1]; var a = p2.x - p1.x; var b = p2.y - p1.y; return Math.sqrt(a*a + b*b) // 勾股定理,用 Math.sqrt 來計(jì)算平方根 } points.dist(); // => 求得兩個(gè)點(diǎn)之間的距離面向?qū)ο?/b>
JavaScript 中的面向?qū)ο筇匦院蛡鹘y(tǒng)語言的很大的區(qū)別,下面展示一個(gè)類用來表示 2D 平面中的幾何點(diǎn),這個(gè)類實(shí)例化后的對象有一個(gè)名為 r() 的方法,可以計(jì)算該點(diǎn)到原點(diǎn)的距離:
function Point(x, y) { this.x = x; this.y = y; } // 通過給構(gòu)造函數(shù)的 prototype 對象賦值,來給 Point 對象定義方法 Point.prototype.r = function() { return Math.sqrt(this.x * this.x + this.y * this.y) }; // 使用 new 關(guān)鍵字和構(gòu)造函數(shù)來創(chuàng)建一個(gè)實(shí)例 p var p = new Point(1, 1); // Point 的實(shí)例對象 p(以及所有 Point 的實(shí)例對象)繼承了方法 r() p.r() // => 1.414...客戶端的 JavaScript 嵌入到 HTML 中的 JavaScript
JavaScript 代碼可以通過
正常 HTML 段落