摘要:這時(shí)候控制臺看到的是對象的快照,然而點(diǎn)開看詳情的話是這段代碼在運(yùn)行的時(shí)候,瀏覽器可能會認(rèn)為需要把控制臺延遲到后臺,這種情況下,等到瀏覽器控制臺輸出對象內(nèi)容時(shí),可能已經(jīng)運(yùn)行,因此會在點(diǎn)開的時(shí)候顯示,這是的異步化造成的。
本書屬于基礎(chǔ)類書籍,會有比較多的基礎(chǔ)知識,所以這里僅記錄平常不怎么容易注意到的知識點(diǎn),不會全記,供大家和自己翻閱;
上中下三本的讀書筆記:
《你不知道的JavaScript》 (上) 讀書筆記
《你不知道的JavaScript》 (中) 讀書筆記
《你不知道的JavaScript》 (下) 讀書筆記
第一部分 類型和語法 第二章 值43.toFixed(3) // 報(bào)錯(cuò): Invalid or unexpected token 43..toFixed(3) // "43.000"
這是因?yàn)?b>42.toFixed(3)這里因?yàn)?b>.被視為常量42的一部分,所以沒有.屬性訪問運(yùn)算符來調(diào)用toFixed方法。而42..toFixed則沒有問題。
第四章 強(qiáng)制類型轉(zhuǎn)換JSON.stringify在對象中遇到undefined、function、symbol時(shí)會自動將其忽略,在數(shù)組中則會返回null,比如:
JSON.stringify([1, 23, 4, null, undefined, function(){ return 123 }]) // "[1,23,4,null,null,null]"
JS中的假值 undefined、null、false、+0、-0、NaN、""
除了空字符串外的所有字符串都是真值
所有對象都是真值
關(guān)于真假值的判斷:
new Boolean(false) // true new Number(0) // true new String("") // true Boolean("false") // true Boolean("0") // true Boolean("""") // true Boolean([]) // true Boolean({}) // true Boolean(function() {}) // true第五章 語法 結(jié)果值
語句都有個(gè)結(jié)果值:
賦值表達(dá)式 b = a 的結(jié)果值是a的值
規(guī)范定義 var 的結(jié)果值是 undefined
代碼塊 { ... } 的結(jié)果值是其最后一個(gè)語句表達(dá)式的結(jié)果
標(biāo)簽語句
{ foo: bar() } 這里的 foo 是標(biāo)簽語句,帶標(biāo)簽的循環(huán)跳轉(zhuǎn)可以使用 continuereak 來實(shí)現(xiàn)執(zhí)行標(biāo)簽所在循環(huán)的下一輪循環(huán)或跳出標(biāo)簽所在循環(huán);
foo: for (var i = 0; i < 4; i++){ for (var j = 0; j < 4 ; j++){ if ((i * j) === 3){ console.log("stoping", i, j) break foo; } console.log(i, j) } } // 0 0 // 0 1 // 0 2 // 0 3 // 1 0 // 1 1 // 1 2 // stoping 1 3
這里的 break foo 不是指跳轉(zhuǎn)到標(biāo)簽 foo 所在位置繼續(xù)執(zhí)行,而是跳出標(biāo)簽 foo 所在的循環(huán)/代碼塊,繼續(xù)執(zhí)行后面的代碼。因此這里的標(biāo)簽語句并非傳統(tǒng)意義上的 goto;
關(guān)聯(lián)
運(yùn)算符有優(yōu)先級,那么如果多個(gè)相同優(yōu)先級的運(yùn)算符同時(shí)出現(xiàn),執(zhí)行的順序就和關(guān)聯(lián)順序有關(guān)了,JS默認(rèn)的執(zhí)行順序是從左到右,但是有時(shí)候不是,比如:
? : 三元運(yùn)算符是右關(guān)聯(lián),比如? : ? : ,其實(shí)是? : (? :) 這樣的順序
= = 連等是右關(guān)聯(lián),比如 a=b=c=2,其實(shí)是 (a=(b=(c=2)))
函數(shù)參數(shù)像函數(shù)傳遞參數(shù)時(shí),arguments 數(shù)組中對應(yīng)單元會和命名參數(shù)建立關(guān)聯(lián)(linkage)以得到相同的值;相反,不傳遞參數(shù)就不會建立關(guān)聯(lián):
function foo(a){ a=42 console.log(arguments[0]) } foo(2) // 42 foo() // undefined
注意:嚴(yán)格模式?jīng)]有建立關(guān)聯(lián)一說;
try...finallyfinally 中的代碼總是會在 try 之后執(zhí)行,即使 try 中已經(jīng) return 了,如果有 catch 的話則在 catch 之后執(zhí)行;
function foo(){ try{ return("returned") } finally { console.log("finally") } } console.log(foo()) // finally // returned
如果 finally 中拋出異常,函數(shù)會終值,如果之前 try 中已經(jīng) return 了返回值,則返回值會被丟棄;
finally 中的 return 會覆蓋 try 和 catch 中 return 的返回值;
finally 中如果沒有 return,則會返回前面 return 的返回值;
switchswitch 中的 case 執(zhí)行的匹配是 === 嚴(yán)格相等的,也就是說如果不是 true,是真值也是不通過的:
switch(true) { case ("hello" || 10): console.log("world") // 不會執(zhí)行 break; default: console.log("emmm") } // emmm
所以這里的字符串即使是真值,也是不被匹配,所以可以通過強(qiáng)制表達(dá)式返回 Boolean 值,比如 !!("hell0" || 10)
default 是可選的,無需放在最后一個(gè),且并非必不可少:
switch(10){ case 1: case 2: default: console.log("hello") case 3: console.log(3) break; case 4: console.log(4) } // hello // 3
上面這個(gè)例子的邏輯是:首先找匹配的 case,沒找到則運(yùn)行 default,因?yàn)槠渲袥]有 break,所以繼續(xù)執(zhí)行 case 3 中的代碼,然后 break;
附錄 全局 DOM 變量由于瀏覽器歷史遺留問題,在創(chuàng)建帶有 id 屬性的 DOM 元素的時(shí)候也會創(chuàng)建同名的全局變量:
console.log(foo) // 打印出DOM元素 所以說 HTML 中盡量少用 id 屬性...
第二部分 異步和性能 第一章 異步:現(xiàn)在和將來 異步控制臺某些瀏覽器的 console.log 并不會把傳入的內(nèi)容立即輸出,原因是在許多程序(不只是JS)中,I/O 是非常低速的阻塞部分,所以,從頁面UI的角度來說,瀏覽器在后臺異步處理控制臺 I/O 能夠提高性能,這時(shí)用戶可能根本意識不到其發(fā)生。
var a = { b: 1 } console.log(a) a.b++這時(shí)候控制臺看到的是 a 對象的快照 {b:1},然而點(diǎn)開看詳情的話是 {b:2} ;這段代碼在運(yùn)行的時(shí)候,瀏覽器可能會認(rèn)為需要把控制臺 I/O 延遲到后臺,這種情況下,等到瀏覽器控制臺輸出對象內(nèi)容時(shí),a.b++ 可能已經(jīng)運(yùn)行,因此會在點(diǎn)開的時(shí)候顯示 {b:2},這是 I/O 的異步化造成的。
如果遇到這種情況:
使用JS調(diào)試器中的斷點(diǎn),而不要依賴控制臺輸出;
把對象序列化到一個(gè)字符串中,以強(qiáng)制執(zhí)行一次快照,比如通過 JSON.stringify;
第三章 Promise 回調(diào)未調(diào)用如果 Promise 狀態(tài)一直未改變,怎么得到通知呢,這里可以使用 Promise.race 競態(tài),如果在設(shè)置時(shí)間內(nèi)還未返回,那么 Promise 將會被 reject;
function timeoutPromise(delay) { return new Promise((resolve, reject) => { setTimeout(() => { reject("Timeout!") }, delay) }) } Promise.race([foo(), timeoutPromise(3000)]) .then(() => console.log("Promise 及時(shí)完成")) .catch(() => console.log("Promise 超時(shí)了"))第四章 生成器 輸入和輸出function* foo(x) { return x * (yield "hello") } const it = foo(6) let res = it.next() res.value // hello res = it.next(7) res.value // 42可以看到第一個(gè) next 并沒有傳參,因?yàn)橹挥袝和5?yield 才能接受這樣一個(gè)通過 next 傳遞的參,而在生成器剛生成還沒有 next() 這時(shí)候還沒有暫停的 yield 來接受這樣一個(gè)值,所以會默默丟棄傳遞給第一個(gè) next 的任何參數(shù)。
生成器中的 Promise 并發(fā)function* foo() { const r1 = yield request("http://some.url.1") const r2 = yield request("http://some.url.2") }這種方式的兩個(gè)請求是串行的,yield 只是代碼中一個(gè)多帶帶的暫停點(diǎn),不能同時(shí)在兩個(gè)點(diǎn)上暫停,如果希望并行的發(fā)送,那么考慮:
function* foo() { const p1 = request("http://some.url.1") const p2 = request("http://some.url.2") const r1 = yield p1 const r2 = yield p2 }PS:歡迎大家關(guān)注我的公眾號【前端下午茶】,一起加油吧~
另外可以加入「前端下午茶交流群」微信群,長按識別下面二維碼即可加我好友,備注加群,我拉你入群~
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/100748.html
相關(guān)文章
《你不知道的JavaScript》 (下) 閱讀摘要
摘要:本書屬于基礎(chǔ)類書籍,會有比較多的基礎(chǔ)知識,所以這里僅記錄平常不怎么容易注意到的知識點(diǎn),不會全記,供大家和自己翻閱不錯(cuò),下冊的知識點(diǎn)就這么少,非常不推介看下冊上中下三本的讀書筆記你不知道的上讀書筆記你不知道的中讀書筆記你不知道的下讀書筆記第三 本書屬于基礎(chǔ)類書籍,會有比較多的基礎(chǔ)知識,所以這里僅記錄平常不怎么容易注意到的知識點(diǎn),不會全記,供大家和自己翻閱; 不錯(cuò),下冊的知識點(diǎn)就這么少,非...
《你不知道的JavaScript》 (上) 閱讀摘要
摘要:但是如果非全局的變量如果被遮蔽了,無論如何都無法被訪問到。但是如果引擎在代碼中找到,就會完全不做任何優(yōu)化。結(jié)構(gòu)的分句中具有塊級作用域。第四章提升編譯器函數(shù)聲明會被提升,而函數(shù)表達(dá)式不會被提升。 本書屬于基礎(chǔ)類書籍,會有比較多的基礎(chǔ)知識,所以這里僅記錄平常不怎么容易注意到的知識點(diǎn),不會全記,供大家和自己翻閱; 上中下三本的讀書筆記: 《你不知道的JavaScript》 (上) 讀書筆記...
2017年 最好的javascript 書籍
摘要:請記住,這些書中的一些可能不是最新的,但概念和基礎(chǔ)仍應(yīng)適用。是最好的老師之一。的秘密由部分組成。在你完成這些書后,查看書籍和最好的本土?xí)? 我看過三本,第1本,第二本,第四本。第一本買的的實(shí)體書,其他兩本看的是電子書。第一本是大名鼎鼎老道寫的,書很薄,但是非常經(jīng)典。javascirpt忍者秘籍是jquery的作者寫的,也是非常經(jīng)典。you dont kown js系列也是非常好。看了...
H5 知識點(diǎn) - 收藏集 - 掘金
摘要:目錄不要過度依賴一前端掘金毫無疑問,是一款非常優(yōu)秀的庫,它讓我們開發(fā)項(xiàng)目變得更加便捷容易。但是作為一個(gè)前端工作者,我們肯定也希望在我們的網(wǎng)頁里也能看到這么酷分鐘搞定常用基礎(chǔ)知識前端掘金基礎(chǔ)智商劃重點(diǎn)在實(shí)際開發(fā)中,已經(jīng)非常普及了。 跨域解決方案總結(jié) - 前端 - 掘金為什么需要跨域? 就得先知道同源策略. 同源策略 同源策略是為了保證數(shù)據(jù)的安全性,一個(gè)域的腳本不能去操作另外一個(gè)域的腳本的...
發(fā)表評論
0條評論
閱讀 844·2021-11-24 10:44
閱讀 2778·2021-11-11 16:54
閱讀 3160·2021-10-08 10:21
閱讀 2067·2021-08-25 09:39
閱讀 2899·2019-08-30 15:56
閱讀 3459·2019-08-30 13:46
閱讀 3493·2019-08-23 18:09
閱讀 2066·2019-08-23 17:05