中卷有點無聊,不過也是有乾貨的,可是好像要背一下的樣子。不過做者大大都誇我是「優秀的開發人員」了,確定要看完呀~~react
開發人員以爲它們太晦澀,很難掌握和運用,弊(致使bug)大於利(提升代碼可讀性)。這種觀點我不敢苟同,由於本書的讀者都是優秀的開發人員,成天與算法和代碼打交道,「抽象相等」對各位來講只是小菜一碟。算法
第一部分。(圖片太大了,只能轉pdf再轉的png,好像有點變形)數組
數組經常使用方法函數
var new_array = old_array.concat(value1[, value2[, ...[, valueN]]]) : 把一個數組和任意多的對象或數組鏈接,不改變當前數組。新生成的數組對於合成數組是淺拷貝。this
let arr = [1, 2, 3] let arr1 = arr.concat('p', ['x', 'y']) // arr (3) [1, 2, 3] // arr1 (6) [1, 2, 3, "p", "x", "y"]
slice(begin, end): 返回一個從開始到結束(不包括結束)選擇的數組的一部分淺拷貝到一個新數組對象。且原始數組不會被修改。spa
['q', 'w', 'e', 'r'].slice(1, 3) // ["w", "e"] ['q', 'w', 'e', 'r'].slice() // ["q", "w", "e", "r"] ['q', 'w', 'e', 'r'].slice(3) // ["r"]
array.splice(start[, deleteCount[, item1[, item2[, ...]]]]): 從start開始,刪除deleteCount個元素,並添加元素item1...itemn。返回被刪除的元素集合,會直接改變數組自己。3d
var myFish = ["angel", "clown", "mandarin", "surgeon"]; //從第 2 位開始刪除 0 個元素,插入 "drum" var removed = myFish.splice(2, 0, "drum"); //運算後的 myFish:["angel", "clown", "drum", "mandarin", "surgeon"] //被刪除元素數組:[],沒有元素被刪除
arr.join([separator]):將數組的每一個元素經過分隔符連起來,親測應該是經過for (i: 0...length)這種方式遍歷的,因此空元素也會被加上。code
parseInt的坑對象
parseInt( 0.000008 ); // 0 ("0" 來自於 "0.000008") parseInt( 0.0000008 ); // 8 ("8" 來自於 "8e-7") parseInt( false, 16 ); // 250 ("fa" 來自於 "false") parseInt( parseInt, 16 ); // 15 ("f" 來自於 "function..") parseInt( "0x10" ); // 16 parseInt( "103", 2 ); // 2
JavaScript 中的相等blog
下卷就是Promise和生成器。
Promise以前研究了一下,就不寫了,生成器是一個新東西。以前在用react的時候,只以爲field的用法很神奇,但徹底沒注意函數前面的*。後來才知道是生成器。
1. 函數名前面加 * function *foo(x) {...}
2. 經過運行函數獲得生成器,傳參和普通函數同樣。 var it = foo( 6 );
3. 調用 it.next() 函數開始運行
4. 函數運行到 yield 處會中止。
5. yield 的下一個 next(..) 傳入的參數 是 yield 的返回值。注意,第一個next是不能傳值的。
6. yield value 能夠向next var res = next(..) 傳遞值。
function *foo(x) { var y = x * (yield 'zzz') return y } var it = foo(6) var res = it.next() console.log(res) // { value: 'zzz', done: false } res = it.next(7) console.log(res) // { value: 42, done: true }
迭代器。
iterable(可迭代),即指一個包含能夠在其值上迭代的迭代器的對象。
iterable 必須支持一個函數,其名稱是專門的 ES6 符號值 Symbol.iterator 。調用這個函數時,它會返回一個迭代器。一般每次調用會返回一個全新的迭代器,雖然這一點並非必須的。
數字序列生成器實現標準的迭代器接口
var something = (function() { var nextVal; return { [Symbol.iterator]: function() { return this; }, next: function() { if (nextVal === undefined) { nextVal = 1 } else { nextVal = (3 * nextVal) + 6 } return { done: false, value: nextVal } } } })() console.log(something.next().value) // 1 console.log(something.next().value) // 9 console.log(something.next().value) // 33 console.log(something.next().value) // 105
能夠經過 for...of 循環帶有迭代器的對象。
for (var v of something) { console.log(v) // 不要死循環! if (v > 500) { break } } // 1 9 33 105 321 969
當你執行一個生成器,就獲得了一個迭代器。
生成器委託(感受就是,這樣也能夠?)語法就是 yield * foo(),如下代碼輸出 12345
function* foo() { console.log("*foo() starting"); yield 3; yield 4; console.log("*foo() finished"); } function* bar() { yield 1; yield 2; yield* foo(); yield 5; } var it = bar(); console.log(it.next().value) console.log(it.next().value) console.log(it.next().value) console.log(it.next().value) console.log(it.next().value) /** output */ 1 2 *foo() starting 3 4 *foo() finished 5
最近心情浮躁,看不下去了。待續。