1. 程式人生 > >ES5,ES6的簡要說明及瀏覽器支援性總結

ES5,ES6的簡要說明及瀏覽器支援性總結

前端開發離不開javascript語言,而與之密切聯絡的就是ECMAScript。

1.什麼是ECMAScript?

摘自百度百科:ECMAScript是一種由Ecma國際(前身為歐洲計算機制造商協會,英文名稱是European Computer Manufacturers Association)通過ECMA-262標準化的指令碼程式設計語言。下文中就以ES和JS來簡稱。簡單說,ES是JS的一種語言標準。ES正在不斷髮展,目前我們接觸比較多的就是ES5和ES6(ES6也叫ES2015)了。

2.ES5的簡單介紹

2.1 首先說一下相容性問題

從caniuse上面可以查詢到,ES的相容性概覽。 
這裡寫圖片描述


下面就主要瀏覽器進行說明: 
IE:可以看到IE6,IE7是完全不支援的。而IE8是隻支援一些內容,參考引用4,IE9是大部分支援,支援度參考引用2。 
Chrome:Chrome 23版本之後就是完全支援的了。19~22版本有不相容的地方,參考引用1。 
Firefox:Firefox 21版本之後就是完全支援的了。4~20版本有不相容的地方,參考引用1。 
其他瀏覽器參考caniuse: 
【1】Does not support parseInt() ignoring leading zeros. 
【2】Does not support Strict mode. 
【3】Does not support zero-width chars in identifiers & Immutable undefined. 
【4】IE8 has virtually no ES5 support, but does support Object.defineProperty, Object.getOwnPropertyDescriptor, JSON parsing & Property access on strings.

2.2 ES5有哪些新特性呢?

2.2.1 嚴格模式

嚴格模式是ECMAScript 5的新特性,它允許你把整個程式,或者某個函式,放置在“嚴格”的操作語境中。使用方法是在作用域開頭加上這樣一條語句。

"use strict";
  • 1

2.2.2 Object新增方法

(1)Object.create() 建立一個具有指定原型且可選擇性地包含指定屬性的物件

Object.create(__proto__, [ propertiesObject ])
  • 1

(2)Object.getPrototypeOf() 返回該物件的原型

Object.getPrototypeOf(object)
  • 1

(3)Object.getOwnPropertyNames() 返回一個由指定物件的所有自身屬性的屬性名(包括不可列舉屬性)組成的陣列

Object.getOwnPropertyNames(object)
  • 1

(4)Object.keys() 返回一個由給定物件的自身可列舉屬性組成的陣列。而使用for-in 迴圈時,還會列舉其原型鏈上的屬性。

Object.keys(object)
  • 1

(5)Object.defineProperty() 在一個物件上定義一個新屬性,或者修改一個已經存在的屬性, 並返回這個物件

Object.defineProperty(object, property, descriptor)
  • 1

(6)Object.defineProperties() 在一個物件上新增或修改一個或者多個自有屬性,並返回該物件

Object.defineProperties(object, properties)
  • 1

(7)Object.getOwnPropertyDescriptor() 返回物件上一個自有屬性對應的屬性描述符(不需要從原型鏈上進行查詢的屬性)。如果指定的屬性存在於物件上,則返回其屬性描述符(property descriptor),否則返回 undefined

Object.getOwnPropertyDescriptor(object, property)
  • 1

(8)Object.seal() 密封一個物件,並返回被密封后的物件。密封物件不能新增新的屬性,不能刪除已有屬性,以及不能修改已有屬性的enumerable、configurable、writable,但可以修改已有屬性的value

Object.seal(object)
  • 1

(9)Object.isSealed() 判斷一個物件是否是密封的

Object.isSealed(object)
  • 1

(10)Object.freeze() 凍結一個物件,比seal更嚴格,連value都不能修改

Object.freeze(object)
  • 1

(11)Object.isFrozen() 判斷一個物件是否凍結

Object.isFrozen(object)
  • 1

(12)Object.preventExtensions() 讓一個物件變成不可擴充套件的,也就是永遠不能再新增新的屬性

Object.preventExtensions(object)
  • 1

(13)Object.isExtrensible() 判斷一個物件是否是可擴充套件的

Object.isExtrensible(object)
  • 1

(14)prototype.isPrototypeOf(object) 確定一個物件是否存在於另一個物件的原型鏈中

function Rectangle() {
}
var rec = new Rectangle();
document.write(Rectangle.prototype.isPrototypeOf(rec));
  • 1
  • 2
  • 3
  • 4

(15)object.propertyIsEnumerable(propertyName) 確定指定的屬性是否可列舉

var a = {};
a.b = 3;
console.log(a.propertyIsEnumerable('b'));
// 輸出是true
  • 1
  • 2
  • 3
  • 4

2.2.3 Array新增方法

(1)Array.isArray() 用於確定傳遞的值是否是一個 Array

Array.isArray([1, 2, 3]);  
// true
  • 1
  • 2

(2)Array.prototype.every(callback[, thisArg]) 測試陣列的所有元素是否都通過了指定函式的測試。 
callback:用來測試陣列的每個元素的函式。呼叫時使用引數 (element, index, array)。返回true表示保留該元素(通過測試),false則不保留 
thisArg:可選。執行 callback 時的用於 this 的值。

function isBigEnough(element, index, array) {
  return (element >= 10);
}
var passed = [12, 5, 8, 130, 44].every(isBigEnough);
// passed is false
passed = [12, 54, 18, 130, 44].every(isBigEnough);
// passed is true
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

(3)Array.prototype.filter(callback[, thisArg]) 建立一個新陣列, 其包含通過所提供函式實現的測試的所有元素。即是過濾函式。

var a = [1, 2, 3];
var b = a.filter(function(element) {
    return element > 2;
});
console.log(b);
//輸出 [3]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

(4)Array.prototype.forEach(callback[, thisArg]) 對陣列的每個元素執行一次提供的函式。

const arr = ['a', 'b', 'c'];
arr.forEach(function(element) {
    console.log(element);
});
  • 1
  • 2
  • 3
  • 4

(5)Array.prototype.indexOf(searchElement, fromIndex) 返回在陣列中可以找到一個給定元素的第一個索引,如果不存在,則返回-1

let a = [2, 9, 7, 8, 9]; 
a.indexOf(2); // 0 
  • 1
  • 2

(6)Array.prototype.lastIndexOf() 返回指定元素(也即有效的 JavaScript 值或變數)在陣列中的最後一個的索引,如果不存在則返回 -1。從陣列的後面向前查詢,從 fromIndex 處開始。

var array = [2, 5, 9, 2];
var index = array.lastIndexOf(2);
// index is 3
  • 1
  • 2
  • 3

(7)Array.prototype.map() 建立一個新陣列,其結果是該陣列中的每個元素都呼叫一個提供的函式後返回的結果。

var numbers = [1, 4, 9];
var roots = numbers.map(Math.sqrt);
// roots的值為[1, 2, 3], numbers的值仍為[1, 4, 9]
  • 1
  • 2
  • 3

(8)Array.prototype.reduce() 從左到右為陣列中的每一個元素依次執行callback函式,返回累計處理的結果。

var total = [0, 1, 2, 3].reduce(function(sum, value) {
  return sum + value;
}, 0);
// total is 6
  • 1
  • 2
  • 3
  • 4

(9)Array.prototype.reduceRight() 與Array.prototype.reduce() 的執行方向相反。 
(10)Array.prototype.some() 測試陣列中的某些元素是否通過由提供的函式實現的測試。every()是全部元素滿足條件,some()只要任意一個元素滿足條件。

2.2.4 String新增方法

(1)String.prototype.trim() 會從一個字串的兩端刪除空白字元。在這個上下文中的空白字元是所有的空白字元 (space, tab, no-break space 等) 以及所有行終止符字元(如 LF,CR)。

var orig = '   foo  ';
console.log(orig.trim()); // 'foo'
  • 1
  • 2

2.2.5 Date新增方法

(1)Date.now() 返回自1970年1月1日 00:00:00 UTC到當前時間的毫秒數。

2.2.6 JSON物件

(1)JSON.parse() 用來解析JSON字串,構造由字串描述的JavaScript值或物件。

let a = '{"b": 3}';
let c = JSON.parse(a);
console.log(c);
// {b: 3}
  • 1
  • 2
  • 3
  • 4

(2)JSON.stringify() 將一個JavaScript值(物件或者陣列)轉換為一個 JSON字串。

let dd = {bb: 3};
let cc = JSON.stringify(dd);
console.log(cc);
// '{"bb":3}'
  • 1
  • 2
  • 3
  • 4

上述就是ES5的主要新特性概括,下面我們再看看ES6有哪些新特性。

3. ES6(ES2015)的簡要說明

ES6各個特性的支援情況比較細,可根據具體特性查詢caniuse

3.1 ES6新特性

參考文件:http://es6.ruanyifeng.com/#docs/intro(ECMAScript 6 入門) 
下面簡單說一些比較常見的ES6用法 
(1)let 用來宣告變數。它的用法類似於var,但是所宣告的變數,只在let命令所在的程式碼塊內有效。實際上為 JavaScript 新增了塊級作用域。

{
  let a = 10;
  var b = 1;
}
a; // ReferenceError: a is not defined.
b; // 1
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

(2)const宣告一個只讀的常量。一旦宣告,常量的值就不能改變。

const PI = 3.1415;
PI // 3.1415

PI = 3;
// TypeError: Assignment to constant variable.
  • 1
  • 2
  • 3
  • 4
  • 5

(3)陣列的解構賦值

let [a, b, c] = [1, 2, 3];
// let a=1,b=2,c=3;
  • 1
  • 2

(4)物件的解構賦值

let { foo, bar } = { foo: "aaa", bar: "bbb" };
foo // "aaa"
bar // "bbb"
  • 1
  • 2
  • 3

(5)箭頭函式 =>

var f = v => v;
  • 1

等效於

var f = function(v) {
  return v;
};
  • 1
  • 2
  • 3

(6)Promise物件是非同步程式設計的一種解決方案。Promise物件代表一個非同步操作,有三種狀態:pending(進行中)、fulfilled(已成功)和rejected(已失敗)。 
基本用法是,建立一個Promise例項,

const promise = new Promise(function(resolve, reject) {
  // ... some code

  if (/* 非同步操作成功 */){
    resolve(value);
  } else {
    reject(error);
  }
});
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

Promise例項生成以後,可以用then方法分別指定resolved狀態和rejected狀態的回撥函式。

promise.then(function(value) {
  // success
}, function(error) {
  // failure
});
  • 1
  • 2
  • 3
  • 4
  • 5

(7)Class語法: 
包括constructor,get,set等經典函式方法。 
(8)Module語法: 
包括import,export等經典模組引入和匯出寫法。