js糟粕

正在看《javascript語言精粹》,遇到明顯的特色就記錄下來,以防看了白看(噗噗~)

爲了避免誤導,造成錯誤印象,文中 ‘錯誤設計‘ 寫成 ‘現有設計’,’正確設計‘ 寫成 ’期待設計‘。然而期待只能是期待,由於他已經被使用的太普遍了。。。不能說改就改了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.僞數組

相關文章
相關標籤/搜索