爲了避免誤導,造成錯誤印象,文中 ‘錯誤設計‘ 寫成 ‘現有設計’,’正確設計‘ 寫成 ’期待設計‘。然而期待只能是期待,由於他已經被使用的太普遍了。。。不能說改就改了javascript
1.js中this指向:java
函數調用有四種模式,方法調用、函數調用、構造器調用和apply調用模式。數組
現有設計:其中函數調用模式與其餘不一樣,this被綁定到全局對象。瀏覽器
期待設計:綁到外部函數的this。app
2.參數arguments並非一個真正的數組函數
(ps:就像一個男人被閹割了同樣---有心無力---有心無力,它只是一個擁有length屬性的array-like對象,並無數組方法)oop
3.做用域this
js木有塊級做用域,,,因此最好在函數開頭部分聲明全部用到的變量。spa
4.全局變量設計
糟糕之中的戰鬥雞!若是全局變量名稱碰巧和子程序中的變量名相同,那他們將會相互衝突致使程序沒法運行,一般還難以調試。
全局變量聲明有三種方式:①不在任何函數內 var foo = value;②全局對象window下 window.foo = value;③直接使用未聲明變量 foo = value;
5.自動插入分號
哎,,,原本一片好心卻變成多此一舉了。。。你若是這樣寫代碼:
return { status: true //會在行末加一個分號; }
注意啊,爲了不,只能這樣寫了:囧~
return { status: true }
6.保留字
佔着茅坑不拉屎,搞了那麼多保留字但大多數並無在語言中使用,保留字不能命名變量、參數。當其被用做對象的鍵值時,他們必須被括號引發來,因此只能用[]表示法。
var class; //非法 object = {case: value}; //非法 object['case'] = value; //ok object.case = value; //非法
7.Unicode
設計javascript的時候,做者預計 Unicode 最多隻會有 65536 個字符,他沒想到人們這麼有情趣,從那之後它的容量慢慢增加到了1百萬個字符~
8.typeof(識別運算數類型,返回類型字符串)
typeof null //返回 'object' 而不是 'null'
value === null //檢測null的好方法
另外檢測對象的值時,null可能混淆,typeof不能分辨,因此利用null爲假,對象爲真來實現:
if (value && typeof value === 'object') { //value 值爲對象或者數組。 } typeof /a/ //正則在最新瀏覽器下返回 'object' ,舊版可能返回'function'
9.parseInt 將字符轉爲整數。
parseInt('16'); > 16 parseInt('16df'); > 16 parseInt('011'); //0開頭的字符串按,十進制 > 11 parseInt(011); //0開頭的數字按,八進制了 > 9 parseInt('0x11'); //0x開頭的字符串和數字都按16進制 > 17 parseInt(0x11); > 17 //有木有亂了啊,,,因此第一個帶上引號,再帶上基數參數就不用怕了,默認爲10進制 parseInt('011', 8); > 9 parseInt('0x11', 16); > 17
10. +
書中說‘+’ 號也是糟粕,緣由以下
1 + 2 + '' "3" 1 + '' + 2 + 4 + '' "124"
11. 浮點數
這是遵循浮點數算數標準(IEEE 754)而有意致使的結果,浮點數中整數運算是正確的,因此小數表現出來的錯誤能夠經過指定精度來避免。我只知道有個toFixed()函數。你還能夠乘以100,運算完畢再降結果除以100,就至關於精確到了兩位。。。同理
0.1 + 0.2 !== 0.3
0.1 + 0.2 0.30000000000000004 .1 + .2 0.30000000000000004
12. NaN 一個特殊的數量值,並非一個數字。
typeof NaN > "number" //即便返回 'number' ,它也不是個數字 + '1' > 1 //即便試圖把非數字轉爲數字,它還不是個數字 + 'oops' > NaN //即便。。。它不是數字
這樣一來也就有個定理:若是產生了NaN的結果,你至少有一個輸入項爲NaN或者某個地方產生了NaN
NaN === NaN false NaN !== NaN true //只分辨數字和NaN isNaN(NaN) > true isNaN('a') > true isNaN(1) > false
可是當你但願判斷一個值是否爲數字時,怎麼能讓NaN不混淆你呢?
//完美了。 function isNumber(val) { return typeof val === 'number' && isFinite(val); } //世界上最短的。。剛看到一篇博客來補充下 function isNumber(val) { return val === +val; //不能被轉爲數字的val爲false,其他爲數字。。。 } isNumber(1) > true isNumber(NaN) > false isNumber('1') > false
13.僞數組