按章節(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.test
、string.match
咆霜、string.replace
邓馒、string.search
、string.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)利。它也降低了語言的性能灌闺。
建議:
避免使用eval艰争。
Function的構(gòu)造器是eval的另一種形式,也應(yīng)該避免使用它桂对。
瀏覽器提供的setTimeout和setInterval函數(shù)甩卓,它們能接受自渡船參數(shù)或者函數(shù)參數(shù),當(dāng)傳遞的是字符串參數(shù)時蕉斜,setTimeout和setInterval函數(shù)會像eval那樣去處理猛频,所以應(yīng)該避免使用字符串參數(shù)形式。
- 缺少塊的語句
避免if
蛛勉、while
鹿寻、do
、for
這樣的語句可以接受一個括在花括號中的代碼塊诽凌,也可以接受單行語句毡熏。單行語句雖然可以節(jié)約2個字節(jié),但是它模糊了程序的結(jié)構(gòu)侣诵,會給以后帶來隱患痢法,所以不建議使用。
- ++ --
++ --會使得程序變得擁擠杜顺、復(fù)雜和隱晦财搁,所以不建議使用。
JavaScript中只有雙精度浮點整數(shù)躬络。
- 位運算符
位運算符接近硬件處理尖奔,所以非常快,但是JavaScript的執(zhí)行環(huán)境一般接觸不到硬件提茁,所以非常慢淹禾,JavaScript不建議唄用來執(zhí)行未操作。
寫在后面
GitHub上集大家之力搞了一個前端面試題的項目茴扁,里面都是大家面試時所遇到的題以及一些學(xué)習(xí)資料铃岔,有興趣的話可以關(guān)注一下。如果你也有興趣加入我們的話峭火,請在項目中留言毁习。項目同時也可以在gitbook上查看。