《JavaScript語言精粹》學(xué)習(xí)筆記

按章節(jié)來記錄的,都是看這本書時的學(xué)習(xí)筆記供置,有些地方真的是柳爽,不看根本不知道原來是這個樣子进鸠。

知其所以然的學(xué)習(xí)過程

2. 語法

  • 注釋

在JavaScript中稠曼,/ *可能出現(xiàn)在正則表達(dá)式字面量里,所以塊注釋對于被注釋的代碼塊來說是<u>不安全的</u>客年。

推薦使用 //來做注釋

5. 繼承

5.2 原型

在一個純粹的原型模式中蒲列,我們將摒棄類,轉(zhuǎn)而關(guān)注對象搀罢』柔基于原型的繼承相比于基于類的繼承在概念上更為簡單:<u>一個新對象可以繼承一個舊對象的屬性。</u>

6. 數(shù)組

數(shù)組是一段線性分配的內(nèi)存榔至,它通過整數(shù)計算偏移并訪問其中的元素抵赢。數(shù)組是一種性能出色的數(shù)據(jù)結(jié)構(gòu)。不幸的是唧取,JavaScript沒有想此類數(shù)組一樣的數(shù)據(jù)結(jié)構(gòu)铅鲤。

作為替代,JavaScript提供了一種擁有一些類數(shù)組特性的對象枫弟。它把數(shù)組的下標(biāo)轉(zhuǎn)變成字符串邢享,用其作為屬性。

  • JavaScript允許數(shù)組包含任意混合類型的值淡诗。
var misc = ['string', 889, true, false, null, undefined, ['nested', 'array'], {object: true}, NaN];
  • 每個數(shù)組都有一個length屬性骇塘。和大多數(shù)其他語言不同,JavaScript的數(shù)組的length是沒有上界的韩容。
  • !!! 數(shù)組的length屬性不一定等于數(shù)組的長度款违。

array只有一個屬性,就是length群凶,length表示的是數(shù)組所占內(nèi)存空間的數(shù)目插爹,而不僅僅是數(shù)組中元素的個數(shù).

> test[1000] = '4';
< "4"
> test.length
< 1001
array-length.png
  • 刪除
    由于JavaScript的數(shù)組其實是一個對象,所以可以使用delete test[1]來移除元素。但是遮掩會留下一個空洞赠尾,我們希望的是后面的元素依次移動位置力穗,所以我, 可以使用splice(index, num, [])來進(jìn)行移除气嫁。

  • typeof運算符報告數(shù)組的類型是object睛廊。JavaScript沒有一個好的機制來區(qū)別數(shù)組和對象。

// 有一個不錯方法去判斷一個對象是否為數(shù)組:
Object.prototype.toString.apply(misc) === '[object Array]'

7. 正則表達(dá)式

  • 可處理正則表達(dá)式的方法有:regexp.exec杉编、regexp.teststring.match咆霜、string.replace邓馒、string.searchstring.split蛾坯。

附錄A - 毒瘤

JavaScript中一些不可避免的問題特征光酣,你必須知道這些問題并準(zhǔn)備好應(yīng)對的措施。

  • 偽數(shù)組

    • <u>JavaScript沒有真正的數(shù)組脉课。</u>

    • typeof運算符不能辨別數(shù)組和對象救军。
      要辨別一個值是否是數(shù)組,需要檢查它的constructor屬性倘零。

    
      var array = [1,2,3,4,5];
      // 可以檢測是否是數(shù)組
      typeof array  === 'object' && array.constructor === Array
    
     // 同樣可以檢測是否是數(shù)組
      Object.prototype.toString.apply(array) === '[object Array]'
    
    • arguments數(shù)組不是一個數(shù)組唱遭,它只是一個有著length成員屬性的對象。
  • 假值

JavaScript擁有一組數(shù)量龐大的假值呈驶。

類型
0 Number
NaN(非數(shù)字) Number
' '(空字符串) String
false Boolean
null Object
undefined Undefined

<u>這些值全部都等同于假拷泽,但是他們是不可互換的。</u>

undefined和null是全局變量袖瞻。

  • hasOwnProperty

只是一個方法司致,而不是一個運算符,所以在任何對象中聋迎,他可能會被一個不同的函數(shù)甚至一個非函數(shù)的值所替換脂矫。

another_stooge. hasOwnProperty = null;
  • 對象

JavaScript的對象永遠(yuǎn)不會是真的空對象,因為它們可以從原型鏈中取的成員屬性霉晕。這樣庭再,就會帶來一些麻煩。

下面是一段程序去極端一算文本中每個單詞出現(xiàn)的次數(shù)牺堰。

var counts = {};
var word;
var words = ['sad', 'wasdaf', 'erae', 'wafc'];
for(i = 0; i < words.length; i ++) {
  word = words[i];
  if(counts[word]) {
    counts[word]++;
  } else {
    counts[word] = 1;
  }
}

這里的if(counts[word])是不嚴(yán)謹(jǐn)?shù)呐逦ⅲ瑧?yīng)該if(typeof counts[word] === 'number)

附錄B - 糟粕

在本附錄中,將會展示JavaScript的一些有問題的特性萌焰,但是我們很容易就能避免它們哺眯。

  • ==

JavaScript有梁旭相等運算符: ===和!==,以及它們的邪惡的孿生兄弟==和!=扒俯。

如果兩個運算數(shù)類型一致且擁有相同的值奶卓,則===返回true一疯,否則!==返回false。

==和!= 則會在只有兩個運算數(shù)類型一致的時候才會做出正確的判斷夺姑。當(dāng)類型不一致的時候墩邀,它們會試圖強制轉(zhuǎn)換值的類型,轉(zhuǎn)換的規(guī)則復(fù)雜且難以記憶盏浙。下面有些例子:

表達(dá)式
'' == '0' false
0 == '' true
0 == '0' true
false =='false' false
false ==0 true
false == undefined false
false == null false
null == undefined true
'\t\r\n' == 0 true

建議:
永遠(yuǎn)不要使用==眉睹、!=

  • with語句
    with語句在這門語言里存在废膘,本身就嚴(yán)重應(yīng)縣了JavaScript處理器的速度竹海,因為它組算了變量名的此法作用域綁定。

建議:
永遠(yuǎn)不要使用with語句丐黄。

  • eval

eval減弱了你的應(yīng)用程序的安全性斋配,因為它給被求值的文本授予了太大的權(quán)利。它也降低了語言的性能灌闺。

建議:

  1. 避免使用eval艰争。

  2. Function的構(gòu)造器是eval的另一種形式,也應(yīng)該避免使用它桂对。

  3. 瀏覽器提供的setTimeout和setInterval函數(shù)甩卓,它們能接受自渡船參數(shù)或者函數(shù)參數(shù),當(dāng)傳遞的是字符串參數(shù)時蕉斜,setTimeout和setInterval函數(shù)會像eval那樣去處理猛频,所以應(yīng)該避免使用字符串參數(shù)形式。

  • 缺少塊的語句

避免if蛛勉、while鹿寻、dofor這樣的語句可以接受一個括在花括號中的代碼塊诽凌,也可以接受單行語句毡熏。單行語句雖然可以節(jié)約2個字節(jié),但是它模糊了程序的結(jié)構(gòu)侣诵,會給以后帶來隱患痢法,所以不建議使用。

  • ++ --

++ --會使得程序變得擁擠杜顺、復(fù)雜和隱晦财搁,所以不建議使用。

JavaScript中只有雙精度浮點整數(shù)躬络。

  • 位運算符

位運算符接近硬件處理尖奔,所以非常快,但是JavaScript的執(zhí)行環(huán)境一般接觸不到硬件提茁,所以非常慢淹禾,JavaScript不建議唄用來執(zhí)行未操作。

寫在后面

GitHub上集大家之力搞了一個前端面試題的項目茴扁,里面都是大家面試時所遇到的題以及一些學(xué)習(xí)資料铃岔,有興趣的話可以關(guān)注一下。如果你也有興趣加入我們的話峭火,請在項目中留言毁习。項目同時也可以在gitbook上查看。

InterviewLibrary-GitHub
InterviewLibrary-gitbook

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末卖丸,一起剝皮案震驚了整個濱河市纺且,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌坯苹,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,000評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件摇天,死亡現(xiàn)場離奇詭異粹湃,居然都是意外死亡,警方通過查閱死者的電腦和手機泉坐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,745評論 3 399
  • 文/潘曉璐 我一進(jìn)店門为鳄,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人腕让,你說我怎么就攤上這事孤钦。” “怎么了纯丸?”我有些...
    開封第一講書人閱讀 168,561評論 0 360
  • 文/不壞的土叔 我叫張陵偏形,是天一觀的道長。 經(jīng)常有香客問我觉鼻,道長俊扭,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,782評論 1 298
  • 正文 為了忘掉前任坠陈,我火速辦了婚禮萨惑,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘仇矾。我一直安慰自己庸蔼,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 68,798評論 6 397
  • 文/花漫 我一把揭開白布贮匕。 她就那樣靜靜地躺著姐仅,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上萍嬉,一...
    開封第一講書人閱讀 52,394評論 1 310
  • 那天乌昔,我揣著相機與錄音,去河邊找鬼壤追。 笑死磕道,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的行冰。 我是一名探鬼主播溺蕉,決...
    沈念sama閱讀 40,952評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼悼做!你這毒婦竟也來了疯特?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,852評論 0 276
  • 序言:老撾萬榮一對情侶失蹤肛走,失蹤者是張志新(化名)和其女友劉穎漓雅,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體朽色,經(jīng)...
    沈念sama閱讀 46,409評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡邻吞,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,483評論 3 341
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了葫男。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片抱冷。...
    茶點故事閱讀 40,615評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖梢褐,靈堂內(nèi)的尸體忽然破棺而出旺遮,到底是詐尸還是另有隱情,我是刑警寧澤盈咳,帶...
    沈念sama閱讀 36,303評論 5 350
  • 正文 年R本政府宣布耿眉,位于F島的核電站,受9級特大地震影響鱼响,放射性物質(zhì)發(fā)生泄漏跷敬。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,979評論 3 334
  • 文/蒙蒙 一热押、第九天 我趴在偏房一處隱蔽的房頂上張望西傀。 院中可真熱鬧,春花似錦桶癣、人聲如沸拥褂。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,470評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽饺鹃。三九已至莫秆,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間悔详,已是汗流浹背镊屎。 一陣腳步聲響...
    開封第一講書人閱讀 33,571評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留茄螃,地道東北人缝驳。 一個月前我還...
    沈念sama閱讀 49,041評論 3 377
  • 正文 我出身青樓,卻偏偏與公主長得像归苍,于是被迫代替她去往敵國和親用狱。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,630評論 2 359

推薦閱讀更多精彩內(nèi)容