ES5特性


  寫該博客的原因主要是為了讓自己再鞏固所學知識與記錄,方便以后查閱。更勉勵未來的自己每周堅持更新至少寫兩篇博客(去轉載也好啊,嘿嘿嘿)!

  最近很多框架或者說git上的一些項目介紹都會介紹說使用了ES5、ES6的語法,甚至今年開始有的還介紹說用了ES7了,那我們就來看下這些ES5、6、7系列都需要掌握哪些知識點。今天我們就先來掌握下ES5與我們寫的常規的js的特性。

  ES5通過對現有JavaScript方法添加語句和原生ECMAScript對象做合並實現標准化。ES5還引入了一個語法的嚴格變種,被稱為”嚴格模式(strict mode)”。

  關於完整列表:請參考官方ECMAScript語言規范

  關於兼容性問題:目前五大瀏覽器都對ES5兼容,具體可以查看Juriy Zaytsev很贊的 ECMAScript 5 兼容性表

  ES5總結來說,新的特性就是如下5點:

  1、嚴格模式——use strict

  嚴格模式(“use strict”)是一種限制性更強語言變種的方式,簡單點講就是嚴格檢查語法、拼寫等規則,比如你少了結束符分號(;)就會報錯或者直接使用未聲明的變量(在非嚴格模式中,js使用為使用未聲明變量,系統會將其創建成一個全局變量)也會報錯。使用的方法很簡單,在JS文件或是函數的頂部添加"use strict"即可啟用嚴格模式。因為"use strict"就是個字符串,因此其會被舊版瀏覽器安全地忽視。我們來舉個栗子:

"use strict";
function strict(){
  "use strict";
  //...
}

  2、提供全局JSON對象——JSON.stringify/JSON.parse;

  大家經常使用的序列化(JSON.stringify)和反序列化(JSON.parse)對象為JSON格式。其實也是ES5提供一個全局的JSON對象。(對於老的瀏覽器可以考慮使用json2.js插件來實現相同的功能)。

JSON.parse(text [, reviver])

  JSON.parse反序列化的方法接受文本(JSON格式)轉化為JSON對象,其中第二個參數是一個回調函數,主要是用來過濾返回值。

  如果我們要確保解析的值是個整數,我們可以使用reviver方法。來舉個栗子:

var result = JSON.parse('{"a": 1, "b": "2"}', function(key, value){
     if (typeof value == 'string'){
    return parseInt(value);
     } else {
        return value; 
    }
})

>> result.b
    2    

 

JSON.stringify(value [, replacer [, space]])

  如果我們需要改變值字符串化的方式,或是對我們選擇的提供過濾(說白了也是過濾返回值),我們可以將其傳給replacer函數。栗子,我們想過濾出即將被字符串化的對象中值大於18的值的屬性:

  

    var nums = {
      "first": 17,
      "second": 20,
      "third": 13
    }

    var luckyNums = JSON.stringify(nums, function(key, value){
      if (value > 18) {
        return undefined;
      } else {
        return value;
      }
    });

    >> luckyNums
    '{"first": 17, "third": 13}'

  上面的代碼中你會發現滿足條件時給的是“undefined”的值,那為何結果里面沒有undefined呢??其實是這樣子的,如果replacer方法返回undefined, 則鍵值對就不會包含在最終的JSON中。最后的那個space參數個人感覺比較雞肋,只是用來作返回結果的可讀性幫助(縮進方式)。space參數可以是個數字,表明了作縮進的JSON字符串或字符串每個水平上縮進的空格數。如果參數是個超過10的數值,或是超過10個字符的字符串,將導致取數值10或是截取前10個字符。

var luckyNums = JSON.stringify(nums, function(key, value) {
  if (value> 20) {
    return undefined;
  } else {
    return value;
  }
}, 2);

>> luckyNums
'{
  "first":7,
  "third":14
}'

  3、附加對象——添加到Object上的構造器

Object.getPrototypeOf
Object.getOwnPropertyDescriptor
Object.getOwnPropertyNames    //幾乎相同Object.keys但返回對象的所有屬性名稱(不只是可枚舉的)
Object.create    //創建一個新對象,其原型等於proto的值
Object.defineProperty
Object.defineProperties
Object.seal     //密封對象可防止其他代碼刪除或更改任何對象屬性的描述符,以及添加新屬性
Object.isSealed        //密封對象可防止其他代碼刪除或更改任何對象屬性的描述符,以及添加新屬性
Object.freeze
Object.preventExtensions //關閉可擴展性可能會阻止新屬性添加到對象,鎖定一個對象,防止屬性增加。返回對象
Object.isFrozen     //凍結物體幾乎與密封物體相同,但是添加了不可修改的屬性
Object.isExtensible  //關閉可擴展性可能會阻止新屬性添加到對象,確定對象當前可擴展性的一種方法,返回bool
Object.keys     //返回表示對象的所有可枚舉屬性名稱的字符串數組
Object.hasOwnProperty  //判斷是否擁有某個屬性

  這些新增的好處之一是對象的屬性有了更多控制,例如哪些是允許被修改的,哪些是可以枚舉的,哪些是可以刪除的等。要用的時候直接拿起來用就行了。

  4、額外的數組——添加到Arrayprototype對象上

Array.prototype.indexOf     //測試一個元素是否存在於一個集合中 Array.prototype.lastIndexOf     //類似indexOf,除了它從數組的末尾開始搜索元素
Array.prototype.every    //集合中的所有項目是否滿足指定的條件
Array.prototype.some    //集合中的某些或所有項目是否滿足指定的條件
Array.prototype.forEach(function(item,index,Array)) 
Array.prototype.map     //原始數組的轉換或映射
Array.prototype.filter  //過濾
Array.prototype.reduce     //將一個數組減少為一個值 reduce(function (previous, current, index, array),回調函數接受四個參數:上一個值,當前值,索引,以及數組本身
Array.prototype.reduceRight  //將一個數組減少為一個值,工作方式與以下相同reduce,除了它從最后處理數組之外
Array.isArray    //直接將方法寫在了構造器上,判斷數組

  同上,要用的時候直接拿來用就行

  5、Function.prototype.bind(thisArg [, arg1 [, arg2, …]])

  Function.prototype.bind返回一個新的函數對象,該函數對象的this綁定到了thisArg參數上。其實就是改變this對象的綁定,這個bind與apply功能比較近,也是很多公司喜歡拿來筆試或面試的題目。下次我們專門寫一篇比較介紹下吧!

參考學習張大佬的博客:http://www.zhangxinxu.com/wordpress/2012/01/introducing-ecmascript-5-1/

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM