《Javascript權威指南-第6版》讀書筆記

《Javascript權威指南-第6版》讀書筆記
第3章 類型、值和變量
3.2 文本
3.2.1 字符串直接量
建議:在javascript中使用單引號表示字符串,在HTML中使用雙引號表示字符串;

3.2.2 轉義字符
\n 換行符
\r 回車符

3.3 布爾值
undefined null 0 -0 NaN “” 會轉化爲false,其他值轉化爲true

3.6 包裝對象
字符串通過new String()構造函數創建一個臨時對象,這個對象繼承了字符串的方法,並被用來處理屬性的引用,一旦引用結束,這個對象自動銷燬。
數字和布爾值也具有各自的方法 Number() Boolean()
null和undefined沒有包裝對象

3.10 變量作用域
在函數體內,局部變量的優先級高於同名的全局變量

第5章 語句
嚴格模式和非嚴格模式之間的區別:

嚴格模式中禁止使用with語句
嚴格模式中所有變量要先聲明,否則將會拋出一個引用錯誤異常
嚴格模式用調用的函數中的一個this值是undefined,在非嚴格模式中,this值總是全局變量。這可以用來判斷是否支持嚴格模式var hasStrictMode = (fuction(){“use strict”;return this === undefined}())
嚴格模式中,當通過call()或apply()來調用函數時,其中的this就是call()或apply()傳入的第一個參數
嚴格模式中,給只讀屬性和給不可擴展的對象創建新成員都將拋出一個類型錯誤
嚴格模式中,傳入eval()的代碼不能再調用程序所在的上下文中聲明變量或定義函數
嚴格模式中,函數裏的arguments對象擁有傳入函數值的靜態副本,在非嚴格模式中,arguments裏的數組元素和函數參數都指向同一個值的引用
嚴格模式中試圖刪除一個不可配置的屬性將拋出一個類型錯誤
嚴格模式中,在一個對象直接量中定義兩個或多個同名屬性將產生一個語法錯誤
嚴格模式中,函數聲明中存在兩個或多個同名參數將產生一個語法錯誤
嚴格模式中,不允許使用八進制直接量
嚴格模式中,arguments,caller和arguments.callee都將拋出一個類型錯誤。
第6章 對象
6.1 創建對象
6.1.3 原型
object.prototype沒有原型對象,它不繼承任何屬性,所有內置函數都繼承自它

6.1.4 Object.create()
使用Object.create()創建一個新對象,其中第一個參數是這個對象的原型

var o = Object.create(null); //o是一個沒有原型的對象
6.2 屬性的查詢和設置
當使用方括號([])運算符來獲取屬性的值時,方括號內的表達式必須返回字符串,或者是一個可以返回字符串的值

6.3 刪除屬性
delete運算符只能刪除自有屬性,不能刪除繼承屬性。
delete表達式刪除成功後,返回true

6.4 檢測屬性
propertyIsEnumerable()只有檢測到是自有屬性,且這個屬性的可枚舉性爲true時才返回true

6.5 枚舉屬性
對象繼承的內置方法不可枚舉,但在代碼中給對象添加的屬性都是可枚舉的(除非將他們轉換爲不可枚舉的)
ECMAScript5定義了兩個用以枚舉屬性名稱的函數:

Object.keys(),返回一個由對象中可枚舉的自有屬性的名稱組成的數組
Object.getOwnPropertyNames(),只返回對象的所有自有屬性的名稱
第7章 數組
7.5 數組元素的添加和刪除
用delete刪除數組元素與爲其賦undefined值是類似的,注意:使用delete刪除數組元素的時候不會修改數組的length屬性

7.8.3 sort()
爲了按照其他方式而非字符順序進行數組排序,必須給sort()方法傳遞一個比較函數,該函數決定了它的兩個參數在排好序的數組中的先後順序。假設第一個參數在前,比較函數應該返回一個小於0的數,第一個參數在後,比較函數返回一個大於0的數

7.9 ECMAScript5中定義的數組方法
forEach() 該方法遍歷數組,爲每個元素調用指定的函數
map()該方法調用數組的每個元素傳遞給指定的函數,並返回一個數組。

var a = [1,2,3];
b = a.map(function(x){
return x*x
}); //b = [1,4,9]
filter()該方法返回的數組元素是調動的數組的一個子集,傳遞的函數是用來邏輯判定的

var a = [1,2,3,4,5];
samllValue = a.filter(function(x){
return x < 3
}); //[1,2]
every()和some()
every()當且僅當針對數組中所有元素調用判定函數都返回true,它才返回true。
some()當針對數組中所有元素調用判定函數都返回false,它才返回false

var a = [1,2,3,4,5];
a.every(function(x){ return x < 0 }) //true
a.every(function(x){ return x % 2 === 0}) //false
a.some(function(x){ return x % 2 === 0 }) //true
a.some(isNaN) //false
一旦every()和some()確認返回什麼值他們就會停止遍歷數組元素
reduce()和reduceRight() 使用指定的函數將數組元素進行組合,生成單個值

var a = [1,2,3,4,5];
var sum = a.reduce(function(x,y){return x + y },0); //15
var max = a.reduce(function(x,y){ return (x>y) ? x : y;}) //5
reduce()第一個參數執行化簡操作的函數,該函數的x參數是數組的元素,y參數是上一次操作的結果值,第二個參數是一個傳遞給函數的初始值,當沒有初始值時默認爲數組第一個元素
reduceRight()按照數組的索引從高到低處理數組

7.11 類數組對象
javascript數組的一些特性是其他對象所沒有的:

當有新的元素添加到列表時,自動更新length屬性
設置length屬性爲一個較小值時將截斷數組
從Array.prototype中繼承一些有用的方法
其類屬性爲Array
第8章 函數
8.7 函數的屬性方法和構造函數
8.7.3 call()和apply()
要想以對象o的方法來調用f函數,可以這樣使用:

f.call(o)
f.apply(o)
call()和apply()的第一個實參是要調用函數的母體,在函數內通過this來獲得它的引用
區別:
對call()來說,第一個實參之後的所有實參都是要傳入待調用函數的值,所傳入參數一一列出
apply()第一個實參之後的參數可以以參數數組的形式傳入

8.7.4 bind()
當在函數f()上調用bind()方法並傳入一個對象o作爲參數,這個方法將返回一個新函數。新函數將會把原始函數f()當做o的方法來調用,傳入新函數的任何實參都將傳入原始函數

function f(y){ return this.x + y; }
var o = { x : 1};
var g = f.bind(o);
g(2) //3
第9章 類和模塊
9.2 類和構造函數
9.2.1 構造函數和類的標識符
a instanceof b 本質是檢測a對象是否繼承自b.prototype

第10章 正則表達式的模式匹配
10.1 正則表達式的定義
一個正則表達式直接量會在執行到它時轉化爲一個正則對象,同一段代碼每次運算都返回同一個對象

10.1.1 直接量字符
^ $ . * + ? = ! : | \ / () [] {}
在正則表達式中使用這些字符的直接量進行匹配,則必須使用前綴\

10.1.2 字符類
將直接量字符單獨放進方括號內就組成了字符類,一個字符類可以匹配它所包含的任意字符

/[abc]/ 匹配a,b,c中任意一個
/[^abc]/ 匹配abc之外的所有字符
/[a-zA-Z0-9]/ 匹配拉丁字母表中任何字母和數字
/[…]/ 匹配方括號內任意字符
/[^…]/ 匹配不在方括號內任意字符
/./ 匹配除換行符和其他Unicode行終止符之外的任意字符
/\w/ 匹配任何ASCII字符組成的單詞 等價於/[a-zA-Z0-9]/
/\W/ 匹配任何不是ASCII字符組成的單詞 等價於/[^a-zA-Z0-9]/
/\d/ 匹配任何ASCII數字 等價於/[0-9]/
/\D/ 匹配除ASCII數字之外的任何字符 等價於/[^0-9]/
/\s/ 匹配任何Unicode空白符
/\S/ 匹配任何非Unicode空白符
10.3 重複
正則表達式的重複字符語法

{n,m} 匹配前一項至少n次,但不能超過m次
{n,} 匹配前一項n次或者更多
{n} 匹配前一項n次
? 匹配前一項0次或1次 等價於{0,1}
+ 匹配前一項1次或多次 等價於{1,}
* 匹配前一項0次或多次 等價於{0,}
使用?,*時要注意,由於這些字符串可能匹配0個字符,因此他們允許什麼都不匹配
非貪婪的重複
非貪婪的重複即儘可能少的匹配,只須在待匹配的字符後跟隨一個問號即可

10.1.4 選擇分組和引用
字符”|”用於分隔供選擇的字符
/\d{3}|[a-z]{4}/匹配的是三位數字或者四個小寫字母
注意選擇項的匹配次序是從左到右,直到發現匹配項,如果左邊的選擇項匹配,就忽略右邊的匹配項
正則表達式圓括號的多種用途:

把單獨的項組成子表達式,以便通過”*+?|”進行修飾 /java(script)?/
允許在同一正則表達式的後部引用前面的子表達式 \1引用的是第一個帶圓括號的子表達式
| 匹配的是該表達式左邊或右邊的子表達式
(…) 將幾個項組合爲一個單元,這個單元可通過“*”,“+”,“?”和“|”等符號加以修飾,而且可以記住和這個組合相匹配的字符串以供此後的引用使用
(?…) 只組合,把項組合帶一個單元,但不記憶與該組相匹配的字符
\n 和第n個分組第一次匹配的字符相匹配,組是圓括號中的子表達式
10.1.5 指定匹配位置
^ 匹配字符串的開頭,在多行檢索中匹配一行的開頭
$ 匹配字符串的結尾,在多行檢索中匹配一行的結尾
\b 匹配一個單詞的邊界,簡言之就是位於字符\w和\W之間的位置,或位於字符\W和字符串的開頭或者結尾之間的位置
\B 匹配非單詞邊界的位置
(?=p) 零寬正向先行斷言,要求接下來的字符都與p匹配,但不包括匹配p的那些字符
(?=p) 零寬負向先行斷言,要求接下來的字符都不與p匹配
10.1.6 修飾符
i 執行不區分大小寫的匹配
g 執行一個全局匹配
m 多行匹配模式
10.2 用於模式匹配的string
search() 返回第一個與之匹配的子串的起始位置,如果找不到匹配則返回-1。該方法不支持全局檢索

“javascript”.search(/script/i); //4
replace() 用於檢索與替換操作
第一個參數是一個正則表達式,第二個參數是要進行替換的字符串。如正則表達式不帶修飾符g,則只替換所匹配的第一個子串

text.replace(/javascript/gi,”JavaScript”);
var quote = /”([^”]*)”/g;
text.replace(quote,’”$1”’);
match(正則表達式) 返回的是一個由匹配結果組成的數組

“1 plus 2 euqals 3”.match(/\d+/g); //[“1”, “2”, “3”]
split() 這個方法用以將調用它的字符串拆分爲一個子串組成的數組

“1, 2, 3, 4”.split(/\s*,\s*/); //[“1”,”2”,”3”,”4”]

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章