讀《javascript語法精粹》知識點總結

  昨天泡了大半天的讀書館,一口氣看完了《javascript語法精粹》這本書,整體來講這本書仍是寫的不錯,難怪那麼多的推薦。《javascript語法精粹》主要是概括與總結了javascript中的重點知識,下面我把我看玩後以爲比較重要的知識點分享出來。javascript

  《javascript語言精粹》重要知識點html

1、比較有意思的遞歸函數

  1.一個有意思的遞歸,造成數據結構,0,1,1,2,3,5,8,13……(其實在個人《javascript經常使用知識點集》中也寫過這個遞歸,在不厭其煩的提一下)java

  ①方法一:git

var fibonacci = function (n){
    //return n<2 ? n : arguments.callee(n-1) + arguments.callee(n-2);
    return n<2 ? n :fibonacci(n-1)+fibonacci(n-2);
}

  ②閉包方法實現:正則表達式

var fibonacci = function(){
    var memo = [0,1];
    var fib = function(){
        var result = memo[n];
        if(typeof result !== 'number' ){
            result = fib(n-1) + fib(n-2);
            memo[n] = result;
        }
        return result;
    }
    return fib;
}()

2、正則部分RegExp

  (...)捕獲型分組,又能夠叫字表達式,捕獲型分組會複製它所匹配的文本,並將其放到result數組裏,每一個捕獲分組都會被指定一個編號。
  (?:)非捕獲性分組,僅作簡單的匹配,並不會捕獲所匹配的文本,性能比捕獲性分組效率高,非捕獲性分組不會干擾捕獲型分組的編號。
  正則轉義,若是對特殊字符轉義拿捏不許時,能夠給任何特殊字符都添加一個\前綴來使其字面化,注意\前綴不能使字母或數字字面化。常見的須要轉義的字符 - / [ \ ] ^ {}等數組

3、javascript中的標準方法集

  ①Array數據結構

  array.concat(item...)
  contcat方法產生一個數組,它包含一份array的淺複製並把一個或多個參數item附加在其後。

  array.join(separator)
  join方法把一個array構形成一個字符串。它先把array中的每一個元素構形成一個字符串,接着用一個separator分隔符串把他們鏈接在一塊兒。

  array.pop()
  pop和push方法使得數組array能夠像堆棧(stack)同樣工做。pop方法移除array中的最後一個元素並返回該元素。

  array.push(item...)
  push方法把一個或多個參數item附加到一個數組的尾部,返回這個array的新長度值。

  array.reverse()
  reseverse方法反轉array裏的元素的順序,並返回array自己。

  array.shift()
  shift方法移除數組array中的第一個元素並返回該元素。若是這個數組array爲空的,它就會返回undefined。一般shift比pop慢。

  array.slice(start,end)
  slice方法對array中的一段作淺複製。首先複製array[start],一直複製到array[end]爲止。

  array.sort(comparefn)
  sort方法對array中的內容進行排序。排序原理爲哈希表,sort方法排序不穩定,排序的穩定性是指排序後數組中的相等值得相對位置沒有發生改變,而不穩定性排序則會改變相等值得相對位置。

  array.splice(start,deleteCount,item,……)
  splice方法從array中移除一個或多個元素,並用新的item替換它們。

  array.unshift(item...)
  unshift方法像push方法同樣,用於把元素添加到數組中,但它是把item插入到array的開始部分而不是層部。閉包

  

  ②Functionapp

  function.apply(thisArg , argArray)
  apply方法調用function,傳遞一個會綁定到this上的對象和一個可選的數組做爲參數。apply方法被用在apply調用模式中。函數

  例arg.concat(slice.apply(arguments,[0]));
  function.call(this)

 

  ③Number

  number.toExponential(fractionDigits)
  toExponential方法把這個number轉換成一個指數形式的字符串。可選參數fractionDigits控制其小數點後的數字位數。它的值必須在0~20:

document.writeln(Math.PI.toExponential(0)); //3e+0
document.writeln(Math.PI.toExponential(2)); //3.14e+0
document.writeln(Math.PI.toExponential(7)); //3.1415927e+0

  number.toFixed(fractionDigits)
  toFixed方法把這個number轉換成爲一個十進制數形式的字符串。可選參數fractionDigits控制其小數點後的數字位數

Math.PI.toFixed(7) //3.1415927

  number.toPrecision(precision)
  toPrecision方法把這個number轉換成爲一個十進制數形式的字符串。可選參數precision,控制數字精度。它的值必須在0~21

Math.PI.toPrecision(7) //3.141593  

  number.toString(radix)
  toString方法把這個number轉換成爲一個字符串。可選參數radix控制基數。它的指必須在2~36.

Math.PI.toString(8) //3.110375724102643

 

  ④Object

  Object.hasOwnProperty(name)
  若是這個object包含一個名爲name的屬性,那麼hasOwnProperty方法返回true。原型鏈中的同名屬性是不會被檢查的。這個方法name就是"hasOwnPerperty"時不起做用,此時會返回false:

    var a = {member:true};
    var b = object.create(a);
    var t = a.hasOwnProperty('member');     //t是true
    var u = b.hasOwnProperty('member');        //u是false
    var v = b.member;                       //true

  

  ⑤RegExp

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

  若是regexp帶有一個g標識,事情會變得更加複雜。查找不是從這個字符串的起始位置開始,而是從regexp.lastIndex(初始值爲0)位置開始。若是匹配成功,那麼regexp.lastIndex將被設置爲該匹配後第一個字符的位置。不成功的匹配會重置regexp.lastIndex爲0。

  RegExp.test(string)
  test方法是使用正則表達式的最簡單和最快的方法。若是該regexp匹配string,它返回true;不然,它返回false。

 

  ⑥String

  string.charAt(pos)
  charAt方法返回在string中pos位置處的字符。若是pos小於0或大於等於字符串的長度string.length,它會返回空字符串。javascript沒有字符類型。

var name = 'Curly';
        var initial = name.charAt(0)  //initial是 'C'

 

   string.charCodeAt(pos)

   chartCodeAt方法同charAt同樣,只不過它返回的不是一個字符串,而是以整數形式表示的在string中的pos位置處的字符的字符碼位。若是pos小於0或大於等於字符串的長度,則返回NaN。 

var name = 'Curly';
        var initial = name.charCodeAt(0);  //initial是67

 

  string.concat(string...)

  concat方法把其餘的字符串鏈接在一塊兒構造一個新的字符串。它不多被使用,由於用+運算符更方便。  

var s='C'.concat('a','t');      //s是cat

  

  string.indexOf(searchString,position)

  indexOf方法在string內查找另外一個字符串searchString。若是它被找到,返回第1個匹配字符的位置,不然返回-1.可選參數position可設置從String的某個指定的位置開始查找:

var text = 'Mississippi',p = text.indexOf('ss',3);

   string.lastIndexOf(search,position)

   lastIndexOf方法和indexof相似,只不過它是從該字符串的末尾開始查找而不是從開頭。

  string.localeCompare(that)
  localeCompare方法比較兩個字符串。

  strng.match(regexp)
  match方法讓字符串和一個正則表達式進行匹配。它依據g標識來決定如何進行匹配。若是沒有g標識,那麼調用string.match(regexp)的結果與調用    regexp.exec(string)的結果相同。然而,若是帶有g標識,那麼它生成一個包含全部匹配(除捕獲組以外)的數組。

  string.replace(searchValue,replaceValue)
  replace方法對string進行查找和替換操做,並返回一個新的字符串。參數searchValue能夠是一個字符串或者一個正則表達式對象。

  string.search(regexp)
  search方法和indexOf方法相似,只是它接收一個正則表達式對象做爲參數而不是一個字符串。若是找到匹配,它返回第1個匹配的首字符位置,若是沒有找到匹配,則返回-1。此方法會忽略g標識,且沒有position參數。

    例var text = 'and in it he says "Any damn fool could';
        var pos = text.search(/["']/)

  string.slice(start,end)

  slice方法複製string的一部分來構造一個新的字符串。若是start參數是負數,它將與sting.length相加。end參數是可選的,且默認值是string.length.若是end參數是負數,那麼它將與string.length相加。end參數等於你要取的最後一個字符的位置值加1.要想獲得從位置p開始的n個字符,就用string.slice(p,p+n).

  string.split(separator,limit)

  split方法把這個string分割成片斷來建立一個字符串數組。可選參數limit能夠限制被分割的片斷數量。separator參數能夠是一個字符串或者一個正則表達式。

var digits = '0123456789';
        var a = digits.split('',5);  //a是['0,'1','2','3','4','5'];

  string.substring(start,end)
  substring的用法和slice方法同樣,只是它不能處理負數參數。沒有理由去使用substring方法。請使用slice替代它。


  string.toLocaleLowerCase()
  toLocaleLowerCase方法返回一個新字符串,它使用本地化的規則把這個string中的全部字母轉換爲小寫格式。

  string.toLocaleUpperCase()
  toLocaleUpperCase()方法返回一個新字符串,它使用本地化規則把這個string中的全部字母轉換爲大寫格式。

  string.toLowerCase()
  toLowerCase方法返回一個新的字符串,這個string中的全部字母都被轉換爲小寫格式。

  string.toUpperCase()
  toUpperCase方法返回一個新的字符串,這個string中的全部字母都被轉換爲大寫格式。

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

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

4、類型檢測與轉換的一些問題

  typeof
  typeof運算符返回一個用於識別其運算數類型的字符串。
  typeof null 檢測出來的不是null,而是'object'
  typeof /a/ 一般檢測結果爲'object',可是safari 3.x版本系列中,返回爲'function'
  一種經過typeof檢測Array的方法,雖然不穩定,可是值得參考學習:

    if(my_value && typeof my_value === 'object' && my_value.constructor === Array){
        //my_value是一個數組
    }

  

  NaN 
  NaN是一個特殊的數值量,它表示的不是一個數字,可是咱們用typeof檢測時發現一個奇怪的現象:
  typeof NaN === 'Number'; //結果爲true
  typeof不能辨別數字和NaN,並且NaN也不等同於它本身
  NaN === NaN //false
  NaN !== NaN //true
  javascript提供了一個isNaN函數,能夠辨別數字與NaN,經過isNaN()方法檢測會對傳入的參數作強類型轉換:
  isNaN(NaN) //true
  isNaN(0) //false
  isNaN('oops') //true 強類型轉換
  isNaN('0') //false 強類型轉換
  判斷是否爲數字的isNumber函數:

  var isNumber = function(value){
    return typeof value === 'Number' && isFinite(value);
  }

  

  僞數組
  javascript沒有真正的數組。javascript的數組確實很是容易使用。咱們一般所使用的數組地底層是有Object產生的。
  檢測數組

if(Object.prototype.toString.call(my_value) === '[object Array]'){
// my_value確實是一個數組
}

  

  假值
  javascript擁有一組數量奇大的假值
  值               類型
  0              Number
  NaN(非數字)      Number
  ''(空字符串)       String
  false         Boolean
  null          Object
  undefined        Undefined
  這些值所有都等同於假,但不可互換。

 

5、==和!=, ===和!==,同類型==沒有轉換(注意)

  '' == '0'         //false
  0 == ''            //true
  0 == '0'            //true
  
  false == 'false'    //false
  false == '0'        //true
  
  false == undefined    //false
  false == null            //false
  null == undefined        //true
  
  '\t\r\n' == false     //true

   「==」的操做的規則:

  1.若是兩個操做數的類型相同,則按照嚴格相等的比較規則。若是嚴格相等,那麼比較結果爲相等。若是它們不嚴格相等,則比較結果爲不相等。

  2.若是兩個操做數類型不一樣,"=="相等操做符也可能會認爲它們相等。檢測相等將會遵循以下規則和類型轉換:

    -若是一個是null,另外一個爲undefined,則它們相等。

    -若是一個值是數字,另外一個是字符串,先將字符串轉換爲數字,而後使用轉換後的值進行比較。

    -若是其中一個值爲true,則將其轉換爲1再進行比較。若是其中一個值是false,則將其轉換爲0再進行比較。

    -若是一個值是對象,另外一個值是數字或字符串。將對象轉換爲原始值,而後再進行比較。對象經過toString()方法或者valueOf()方法轉換爲原始值。javascript語言核心的內置類首先嚐試使用valueOf(),再嘗試使用toString(),除了日期類,日期類只使用toString()轉換。那些不是javascript語言核心中的對象則經過各自的實現中定義轉換爲原始值。

    -其餘不一樣類型之間的比較均不相等。

  最後一個疑問,就是js sort()的排序原理問題,好像是哈希表,但也看到是Bubble,但願哪位大神幫我解答,謝謝!

 

  常見問題:社區亂燉

      學習js比較好的網站

相關文章
相關標籤/搜索