讀書筆記 --- JavaScript語言精粹

1、語法

  • 運算符優先級
. [] () 提取屬性與調用函數
delete new typeof + - 一元運算符
* / % 乘法、除法、求餘
+ - 加法/連結、減
>= <= > < 不等式運算符
=== !== 等式運算符
&& 邏輯與
?: 三元

:在js中,「%」不是一般數學意義上的模運算,而其實是「求餘」運算。兩個運算數都爲正數時,求模運算和求餘運算的值相同;兩個運算數存在負數時,求模運算和求餘運算的值則不相同。git

2、對象

  • js包含一種原型鏈的特性,容許對象繼承另外一個對象的屬性。正確地使用它能減小初始化時消耗的時間和內存。正則表達式

  • 若是屬性名是一個合法的js標識符且不是保留字,則不強制要求用引號括住屬性名。編程

  • 反射 --- 檢查對象有什麼屬性數組

只用typeof是不夠的,原型鏈中的任何屬性都會返回值,如:bash

typeof flight.toString  //fuuction
typeof flight.constructor  //function
複製代碼

有兩種方法能夠去處理這些不須要的屬性:數據結構

  1. 讓程序檢查並丟棄爲函數的屬性;
  2. 使用hasOwnProperty(不會檢查原型鏈)方法;
  • 減小全局變量的污染。全局變量削弱了程序的靈活性,應該避免使用。

3、函數

所謂編程,就是將一組需求分解成一組函數與數據結構的技能。閉包

每一個函數在建立時會附加連個隱藏屬性:函數的上下文和實現函數行爲的代碼; 函數在調用時,除了有聲明是的形式參數,每一個函數還接收連個附加的參數:thisarguments arguments 不是一個真正的數組,可使用一下方法來轉化爲真正數組:app

Array.prototype.slice.apply(arguments);
Array.prototype.concat(thisArg, arguments);
複製代碼
  • 函數的4種調用模式:
  1. 方法調用模式;
  2. 函數調用模式;
  3. 構造器調用模式 (new);
  4. apply調用模式;
  • 擴充類型的功能

舉例:函數

function.prototype.method = function(name, func){
    this.prototype[name] = func;
    return this;
}
複製代碼

經過給function.prototype增長一個method方法,咱們下次給對象增長方法的時候就沒必要鍵入prototype這幾個字符。省去一些麻煩。工具

  • 函數中聲明變量

最後的作法是在函數體的頂部聲明函數中可能用到的全部變量。

  • 模塊

可使用函數和閉包來構造模塊。模塊是一個提供接口卻隱藏狀態與實現的函數或對象。

模塊模式的通常形式 是:一個定義了私有變量和函數的函數; 利用閉包建立能夠訪問私有變量和函數的特權函數; 最後返回這個特權函數,或者把他們保存到一個可訪問的地方。模塊模式常常結合單例模式(Singleton Pattern)使用。

  • 級聯

  • 柯里化

把函數與傳遞給它的參數相結合, 產生出一個新的函數。

  • 記憶(加速程序計算的一種優化技術,如用閉包存儲結果)

4、繼承

在那些基於類的語言中,繼承(inheritance或extends)提供了兩個有用的服務。

  • 它是代碼重用的一種形式。
  • 引入了一套類型系統的規範。
  1. 實現 new 一個對象的內部實現機制
Function.method('new', function () {
    // 建立一個新對象,它繼承自構造器函數的原型對象
    var that = Object.create(this.prototype);
    // 調用構造器函數, 綁定 -this- 到新對象上
    var other = this.apply(that, arguments);
    // 若是它的返回值不是一個對象, 就返回該新對象
    return (typeof other === 'object' && other) || that
})
複製代碼
  1. 對象說明符
var myObject = maker(f, l, m, c, c);
複製代碼

==>

var myObject = maker({
    first: f,
    middle: m,
    last: l,
    state: s,
    city: c
})
複製代碼
  1. 利用原型進行差別化繼承

經過定製一個新的對象,咱們指明它與所基於的基本對象的區別。

  1. 函數化 --- 應用模塊模式

一個函數化構造器的僞代碼模塊:

var constructor = function (spec, my) {
    var that, 其餘的私有變量
    my = my || {};
    
    把共享的變量和函數添加到my中
    
    that = 一個新對象
    
    添加給that的特權方法
    
    return that;
}
複製代碼

5、 數組

  • JS容許數組包含任意混合類型的值
  • JS數組的length是沒有上界的, 把length設小將致使全部下標大於等於新length的屬性被刪除
  • 使用splice來刪除,儘可能少用delete
  • 當屬性名是小而連續的整數時,你應該使用數組;不然使用對象
  • 判斷一個對象是否爲數組
typeof [] //onject
var is_array = function (value) {
    return Object.prototype.toString.apply(value) === '[object Array]';
}
複製代碼
  • 方法的擴充
  • 指定初始值

6、 正則表達式(略)

7、 方法

  1. 數組方法
  • concat
  • join(比用「+」好拼接這些片斷要快)
  • pop
  • push
  • reverse
  • shift
  • slice(start, end)
  • sort
  • splice(start, deleteCount, item...)
  • unshift
  1. 函數方法
  • apply(thisArg, argArray)
  • toExponential(fractionDigits)
  • toFixed(fractionDigits)
  • toPrecision(precision)
  • toString(radix)
  1. 對象方法
  • hasOwnProperty(name)
  1. RegExp
  • exec(string)(正則表達式的最強大和最慢的方法)
  • test(string)返回true/false
  1. 字符串方法
  • charAt(pos)
  • charCodeAt(pos)
  • concat(string...)
  • indexOf(searchString, pos)
  • lastIndexOf(searchString, pos)
  • localeCompare(that)
  • match(regexp)
  • replace(searchValue, replaceValue)
  • search(regexp)與indexOf方法相似
  • slice(start, end)
  • split(separator, limit)
  • subString(不能處理負數,請用slice代替他)
  • toLocalLowerCase()/toLocalUpperCase()
  • toLowerCase()/toUpperCase()
  • fromCharCode(char...)

8、 代碼風格

有時候以爲註釋就像一個時間機器,我用它發送重要的信息給將來的我。

  • 對一個腳本應用或工具庫,我只用惟一一個全局變量。
  • 每一個對象都有它本身的命名空間,因此我很容易使用對象去管理代碼。
  • 使用閉包能提供進一步的信息隱藏,加強個人模塊的健壯性。

9、 優美的特性

精簡的JS --- 主要內容:

  • 函數是頂級對象

在精簡JS中,函數是有詞法做用域的閉包

  • 基於原型繼承的動態對象

對象是無類別的。咱們能夠經過普通的賦值給任何對象增長一個新成員的屬性。一個對象能夠從另外一個對象繼承成員屬性。

  • 對象字面量和數組字面量

這對建立新的對象和數組來講是一種很是方便的表示法。JS字面量是數據交換格式JSON的靈感

10、 毒瘤

  • 在JS全部的糟糕特性之中,最爲糟糕的一個就是它對全局變量的依賴。
  • typeof
  • parseInt
  • NaN (typeof NaN === 'number' //true;) 判斷一個值是否可用作數字的最佳方法是使用isFinite函數,應爲它會篩除NaN和Infinity,但isFinite會試圖把它的運算數轉換爲一個數字。自定義方法:
var isNumber = function isNumber(value){
    return typeof value === 'number' && isFinite(value);
}
複製代碼
  • 對象

JS的對象永遠不會是真的空對象,由於它們能夠從原型鏈中取得成員屬性。

寫在後面

本書在豆瓣評分很高,但整本書看下來,說實話,到沒感受有特別多的感悟,可能本身學藝不精,還接受不到的大師的深層次的教導。

但收穫仍是有的:

  1. 代碼習慣的糾正;
  2. 基礎知識的強化理解,如原型鏈,閉包等;
  3. 某些通常性bug來源;如typeof, NaN等
  4. 實現同一功能的最優解,需考慮全面。
相關文章
相關標籤/搜索