《Javascript語言精粹》筆記

語法

1.數字

a. javascript只有一種數字類型,表示64位的浮點數,避免了短整型的溢出問題。1和1.0是相等的

b. 一個數字字面量有指數部分,那么字面量的值等于e之前的數字與10的e之后的數字的次方相等。所以100===1e2

c. NaN是一個數值,不等于任何值,包括他自己。可用isNaN(number)檢測NaN。

d. Infinity無窮大

2.字符串

a. 用單引號或者雙引號,\(反斜線)是轉義字符,由于Unicode是一個16位的字符集,所以javascript的字符串也是16位的。

b. \u指定數字字符編碼,如 “A” === "\u0041"

c. 字符串有length屬性

d. 字符串是不可變的,但是可以通過+運算創建新的字符串

3.語句

a. switch、while、for和do語句允許有一個可選的前置標簽,配合break使用。

b. false,null,undefined,空字符串' ? ',數字0,數字 NaN都是假,其他所有值都是真,包括true,字符串“false”,以及所有的對象。

c. for in語句。通常需要檢測object.hasOwnProperty(variable)來確定這個屬性名是該對象的成員,還是來自于原型鏈。

for(myvar in obj){

if(obj.hasOwnProperty(myvar)){...}

}

4.表達式

a. typeof 運算符產生的值有 'number'、'string'、'boolean'、'undefined'、'function'和'object'。數組或者null,結果是'object'

對象

javascript的簡單數據類型包含數字、字符串、布爾值、null和undefined。其他所有的值都是對象。

一個對象字面量就是包圍在一對花括號中的零或多個“名/值”對。

對象是“名/值”對的集合并擁有一個連到原型對象的隱藏鏈接。

1.引用

對象通過引用來傳遞,永遠不會被復制。

2.原型

每個對象都連接到一個原型對象,并且它可以從中繼承屬性。所有通過對象字面量創建的對象都連接到Object.prototype。

原型鏈在更新時是不起作用的。當我們對某個對象作出改變是,不會觸及該對象的原型,原型鏈只有在檢索值的時候才會被用到。

原型關系是一種動態的關系。如果我們添加一個新的屬性到原型中,該屬性會立即對所有寄語該原型創建的對象可見。

function F(){}

F.prototype.a=[1,2];

var f = new F();

f.a.push(3);

F.prototype.a;//[1,2,3]原型被修改

f.a = null;

F.prototype.a;//[1,2,3]原型不變

3.刪除

delete運算符可以用來殺喊出對象的屬性。如果對象包含該屬性,那么該屬性就會被移除。它不會觸及原型鏈中的任何對象。刪除對象的屬性可能會讓來自原型鏈中的屬性透視出來。

4.減少全局變量污染

方法一、只創建一個唯一的全局變量。var MYAPP = {};

方法二、閉包

函數

1.函數對象

對象字面量產生的對象連接到Object.prototype。函數對象連接到Function.prototype(該源性對象本身連接到Object.prototype)。每個函數在創建的時候會附加兩個隱藏屬性:函數的上下文和實現函數行為的代碼。

一切對象都是Object的實例,一切函數都是Function的實例。Object是Function的實例,而Function.prototype是Object的實例。


可見,Object作為構造函數,它有prototype屬性指向Object.prototype, 作為實例對象, 它有Object.__proto__指向Function.prototype。Function是構造函數,它有prototype屬性指向Function.prototype,而Function是函數,從而也是Function的實例,所以它有Function.__proto__指向Function.prototype,從而Function.__proto__ === Function.prototype為true。

2.調用

每個函數在調用是都會接受兩個附加參數,this和arguments

4種調用模式:方法調用模式,函數調用模式,構造器調用模式和apply調用模式。

方法調用模式:函數保存為對象的一個屬性,我們稱它為一個方法。當一個方法被調用時,this被綁定到該對象

函數調用模式:當函數并非是一個對象的屬性時,那么他就被當做一個函數來調用,此時this綁定到全局對象

構造器調用模式:一個函數,如果創建的目的就是希望結合new前綴來調用,就稱它為構造器函數,首字母大寫。調用之后,實例對象的__proto__會鏈接到構造函數prototype的,this會被綁定到新對象上。

Apply調用模式:apply方法讓我們構建一個參數數組傳遞給調用函數。它允許我們選擇this的值。apply接收兩個參數,要綁定給this的值和參數數組。call,bind

function Qua(string){this.status = string}

Qua.prototype.get_status = function(){

return this.status;
}

//構造一個包含status的對象

var statusObject = {status:'A-OK'};

//statusObject并沒有繼承Qua.prototype,但是可以調用get_status

var status = Qua.prototype.get_status.apply(statusObject);//傳入this,this指statusObject。結果是A-OK

3.參數

arguments并不是一個真正的數組,它只是一個類似數組的對象,擁有length屬性,但沒有任何數組的方法。

4.閉包

函數可以訪問它被創建時的所處的上下文環境。內部函數能訪問外部函數的實際變量而無需復制。

//錯誤示例

var add_the_handlers = function(nodes){

? ?var i;

for(i=0;i<nodes.length;i++){

nodes[i].onclick = function(){

alert(i);

}

}

}

//該函數的本意是想傳遞給每個事件處理器一個唯一的i,但是事件處理器函數綁定了變量i本身,而不是函數在構造是的變量i的值

//改良版

var add_the_handlers = function(nodes){

var helper = function(i){

return function(e){alert(i)}

}

var i;

for(i=0;i<nodes.length;i++){

nodes[i].onclock=helper(i);//返回當前的i值

}

}

方法

1.Array

concat(item,...):如果參數item是數組,那么他的每一個元素會被分別添加

join(separator):默認的separator是逗號。

pop():移除數組中的最后一個元素并返回該元素。如果數組是empty,那么返回undefined

push(item...):把一個或多個參數item附加到數組尾部,如果item是數組,會把item座位整體添加到數組尾部,并返回這個array的新長度值。

reverse():反轉數組中的元素順序,并返回數組本身[數組被改變了]。

shift():移除數組中的第一個元素并返回該元素,如果是空數組,返回undefined。shift通常比pop慢的多。

slice(start,end):對數組中的一段做淺復制。

sort(comparefn):對數組中的元素進行排序,不能正確地給一組數字排序。因為javascript默認的比較函數會把被排序的元素都視為字符串。

splice(start,deleteCount,item...):從數組中移除一個或多個元素,并用新的item替換他們。

unshift(item...):和push類似,只是他是把item插入到數組的開始部分,并返回數組心得length。

2.Function

apply(thisArg,argArray):傳遞一個綁定到this上的對象和一個可選的數組作為參數。

3.Number

toExponential(fractionDigits):傳換成一個指數形式的字符串,可選參數是控制小數點后的數字位數,值必須在0-20.

toFixed(fractionDigits):轉換成一個十進制形式的字符串,可選參數是控制小數點后的數字位數,值必須在0-20,默認值是0

toPrecision(precision):轉換成一個十進制數形式的字符串??蛇x參數是控制數字的精度[和控制小數點位數是不一樣的,從整數部分算起],值必須在0-21

toString(radix):轉成字符串??蛇x參數radix控制基數,值在2-36之間,常用的是整數,但是可以用任意的數字。在最普通的情況下number.toString()可以簡單寫成String(number)。

4.Object

hasOwnProperty(name):如果一個object包含一個名為name的屬性,那么hasOwnproperty返回true。原型鏈中的同名屬性是不會被檢查的。

var a = {member:true};
var b = Object.create(a);

a.hasOwnproperty('member');//true

b.hasOwnproperty('member');//false

b.member;//true

5.RegExp

regexp.exec(string):是使用正則表達式最強大(和最慢)的方法。匹配成功會返回一個數組。下標為0的是包含正則表達式regexp匹配的子字符串,下標為1的元素是分組1捕獲的文本...以此類推,如果匹配失敗,返回null。

regexp.test(string):最近單和最快的方法。盡量不要對這個方法使用g標識。返回true或false

6.String

string.charAt(pos):返回string中pos位置的字符。如果pos小于0或大于等于字符串的長度,返回空字符串。

string.charCodeAt(pos):返回string中pos位置處的字符的字符碼位。如果pos小于0或大于等于字符串的長度,返回空NaN

string.concat(string...)

string.indexOf(searchString,position):查找子串的位置

string.lastIndexOf(searchString,position):從末尾開始查找,但是position是從前往后數

var text = 'Mississippi';

text.lastIndexOf('ss');//5

text.lastIndexOf('ss',3);//原始string變成Miss ? 結果是2

text.lastIndexOf('ss',6);//原始串變成Mississ ?結果是5

string.localeCompare(that):

string.match(regexp):

string.replace(searchValue,replaceValue):只會替換第一次出現的,所以一般searchValue是一個帶有g標識的正則,這樣可以替換所有的匹配,如果不帶g,則只會替換第一個匹配。

string.search(regexp):參數是正則表達式,且會忽略g標識

string.slice(start,end):復制string的一部分出來構造一個新的字符串。如果start/end是負數,會與string.length相加

string.split(separator,limit):separator可以是字符串也可以是正則,limit顯示切片數量

string.substring(start,end):沒有任何理由去使用substring方法,用slice代替

string.toLocaleLowerCase():返回一個新的字符串,使用本地化的規則把string中的所有字幕轉換為小寫格式。此方法主要永在土耳其語上,因為在土耳其語中‘I’轉換為‘l’,而不是‘i’。

string.toLocaleUpperCase():轉換大寫格式,解釋參照toLocaleLowerCase()

string.toLowerCase():

string.toUpperCase():

String.fromCharCode(char...):根據一串數字編碼返回一個字符串 ?

var a = String.fromCharCode(67,97,116);//a是Cat

毒瘤

1.判斷數字:var isNumber = function(num){return typeof num === 'number' && isFinite(num);}

2.判斷是數組的可靠方法:

Object.prototype.toString.apply(arr) === '[object Array]'

Object.prototype.toString.apply(arguments) === '[object Arguments]'//可以判斷arguments數組不是真正的數組,只是含有length屬性而已,要通過Array.prototype.slice.apply(arguments)轉成數組

3.對象:

可以看到,constructor卻是一個字符串,原因在于count對象繼承自Object.prototype,而Object.prototype包含著一個名為constructor的成員對象它的值是一個Object,所以相加就變成了字符串拼接。解決辦法是添加一個判斷typeof count[word] == 'number'

JSON

json有6種類型的值,對象,數組,字符串,數字,布爾值和null。空白(空格,制表,回車,換行符)可被插入到任意值的前后。

使用JSON.parse可以代替evel帶來的風險

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 第5章 引用類型(返回首頁) 本章內容 使用對象 創建并操作數組 理解基本的JavaScript類型 使用基本類型...
    大學一百閱讀 3,270評論 0 4
  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法,內部類的語法,繼承相關的語法,異常的語法,線程的語...
    子非魚_t_閱讀 31,778評論 18 399
  • 首發于:segmentfault《JavaScript語言精粹 修訂版》 讀書筆記 之前看到這篇文章,前端網老姚淺...
    若川i閱讀 898評論 0 3
  • 《紅樓夢》中賈政喜歡和清客在一起,只要在家里,身前身后總有一幫人圍繞著。在《紅樓夢》的第十六回作者通過大觀園的興建...
    桃花月球閱讀 2,465評論 4 8
  • ?時光 不經意間 偷走你的記憶 讓你不由自主地 用想象去填補那個空缺 而你也不會對此感到懷疑 記憶的模樣 就像星辰...
    瘦子的逆襲閱讀 179評論 0 1