JavaScript包含一種原型鏈的特性,容許對象繼承另外一個對象的屬性。正確的使用它能減小對象初始化時消耗的時間和內存。正則表達式
檢索JavaScript對象屬性的時候,可以使用」||「運算符來填充默認值;當參試從undefined值中獲取值時會致使TypeError異常,可使用「&&」運算符來避免錯誤。數組
var name = person.name || "vivo" person.address // undefined person.address.city // throw "TypeError" person.address && person.address.city // undefined 複製代碼
原型關係是一種動態關係,若是咱們添加一個新的屬性到原型中,該屬性會當即對全部基於該原型建立的對象可見。bash
若是對象擁有獨有的屬性,將返回true。hasOwnProperty方法不會檢查原型鏈上的屬性。閉包
person.hasOwnProperty('name') // true person.hasOwnProperty('constructor') // false 複製代碼
delete運算符能夠用來刪除對象的屬性,它不會觸及原型鏈中的任何對象。刪除對象的屬性可能會讓來自原型鏈中的屬性透視出來。app
JavaScript中的函數就是對象。對象是「名/值」對的集合並擁有一個連到原型對象的隱藏鏈接。對象字面量產生的對象鏈接到Object.prototype。函數對象鏈接到Function.prototype(該原型對象自己鏈接到Object.prototype)。
每一個函數對象在建立時也隨配有一個prototype屬性。它的值是一個擁有constructor屬性且值即爲該函數對象。函數
每一個函數會接受到2個額外附件的參數,this與arguments。 arguments數組保存的是函數被調用時傳遞的參數列表。
this的值取決與調用模式:ui
- 方法調用模式:當一個函數被保存爲對象的一個屬性時,稱它爲一個方法;方法被調用時,this被綁定到該對象。
- 函數調用模式:當一個函數並不是一個對象的屬性,它被看成一個函數調用,this被綁定到全局對象。
- 構造器調用模式:一個函數前面帶上new來調用,就會建立一個鏈接到該函數的prototypr成員的新對象,this被綁定到這個新對象上。
- apply調用模式:apply方法接受兩個參數,第一個爲綁定給this的值,第二個爲參數數組。
myObject.double = function () { var that = this var helper = function () { that.value = add(that.value,that.value) } helper() // 函數形式調用 } myObject.double() // 方法形式調用 複製代碼
在一個代碼塊中(括在一對花括號中的一組語句)定義的全部變量在代碼塊的外部是不可見的。定義在代碼塊中的變量在代碼塊執行結束後會被釋放掉。
在函數中的參數和變量在函數外部是不可見的,而在一個函數內部任何位置定義的變量,在該函數內部任何地方均可見。this
使用函數和閉包來構造模塊。模塊是一個提供接口卻隱藏狀態和實現的函數或對象。
模塊模式的通常形式是:一個定義了私有變量和函數的函數;利用閉包建立能夠訪問私有變量和函數的特權函數;最後返回這個特權函數,或者把它們保存到一個可訪問到的地方。spaString.method('deentityify',function () { // 字符實體表,它映射字符實體的名字到對應的字符 var entity = { quot:'"', lt:'<', gt:'>' } // 返回deentityify方法 return function () { // 這個纔是deentityify方法所執行的程序 return this.replace(/&([^&;]+);/g), function (a,b) { var r = entity[b] return typeof r === 'string'? r : a; }) } }()) 複製代碼
對於沒有返回值的方法,咱們可讓這些方法返回this而不是undefined,這樣就是可以使用級聯。咱們能夠在一條語句中依次調用同一個對象的不少方法。prototype
getEle('div').move(200,300).width(100).height(100) 複製代碼
函數能夠將先前操做的結果記錄在某個對象裏,從而避免無謂的重複計算。
var fibonacci = function () { var memo = [0,1] var fid = function (n) { var result = memo[n] if (typeof result !== 'number') { result = fib(n-1) + fib(n-2) memo[n] = result } return result } return fid }() 複製代碼
var Cat = function (name) {
this.name = name
}
Cat.prototype = new Animal()
複製代碼
在大多數語言中,一個數組的全部元素都要求是相同的類型。JavaScript容許數組包含任意混合類型的值。
length屬性的值是這個數組的最大整數屬性名加上1.它不必定等一數組中屬性的個數。
var demo = [] demo.length //0 demo[100] = 1 demo.length //101 複製代碼
使用delete關鍵字刪除數組元素,會在數組在原先的位置上留下一個undefined。使用數組方法splice可以避免這個問題
var demo = [1,2,3,4,5] delete demo[2] // [1,2,undefined,4,5] demo = [1,2,3,4,5] demo.splice(2,1) // [1,2,4,5] 複製代碼
一、能夠直接經過字面量建立正則表達式.
var regexp = ‘/^\d+&/i’ 標示含義: g:全局的(匹配屢次;不一樣的方法對g標示的處理各不相同) i:大小寫不敏感(忽略字符大小寫) m:多行(^和&能匹配行結束符) 複製代碼
二、使用RegExp構造器。第一個參數爲正則表達式,第二個參數爲指定的標示。
本章主要介紹了JS中Array、Function、Number、Object、RegExp、String類型擴展的方法介紹和部分方法的內部實現方式。
本章主要介紹了提醒咱們要注意代碼風格,一個好的代碼規範可以有效的提高程序的可擴展性與健壯性。