尤其在物件解構賦值(見優化部分b.)或者模組輸出變數時,這種寫法的好處體現的最為明顯:
let = object;
let myownmethods = ; // let myownmethods =
可以看到屬性變數式宣告屬性看起來更加簡潔明瞭。方法也可以採用簡潔寫法:
let es5fun =
}; let es6fun =
}
// otherfruits
// 注意: 物件的擴充套件運算子用在解構賦值時,擴充套件運算子只能用在最有乙個引數(otherfruits後面不能再跟其他引數)
let morefruits = ;
d. super 關鍵字。es6在class類裡新增了類似this的關鍵字super。同this總是指向當前函式所在的物件不同,super關鍵字總是指向當前函式所在物件的原型物件。
2、公升級部分:
a. es6在object原型上新增了is()方法,做兩個目標物件的相等比較,用來完善』=『方法。』='方法中nan === nan //false其實是不合理的,object.is修復了這個小bug。(object.is(nan, nan) // true)
b. es6在object原型上新增了assign()方法,用於物件新增屬性或者多個物件合併。
const target = ;
const source1 = ;
const source2 = ;
object.assign(target, source1, source2);
target //
注意: assign合併的物件target只能合併source1、source2中的自身屬性,並不會合併source1、source2中的繼承屬性,也不會合併不可列舉的屬性,且無法正確複製get和set屬性(會直接執行get/set函式,取return的值)。
c. es6在object原型上新增了getownpropertydescriptors()方法,此方法增強了es5中getownpropertydescriptor()方法,可以獲取指定物件所有自身屬性的描述物件。結合defineproperties()方法,可以完美複製物件,包括複製get和set屬性。
d. es6在object原型上新增了getprototypeof()和setprototypeof()方法,用來獲取或設定當前物件的prototype物件。這個方法存在的意義在於,es5中獲取設定prototype對像是通過__proto__屬性來實現的,然而__proto__屬性並不是es規範中的明文規定的屬性,只是瀏覽器各大產商「私自」加上去的屬性,只不過因為適用範圍廣而被預設使用了,再非瀏覽器環境中並不一定就可以使用,所以為了穩妥起見,獲取或設定當前物件的prototype物件時,都應該採用es6新增的標準用法。
d. es6在object原型上還新增了object.keys(),object.values(),object.entries()方法,用來獲取物件的所有鍵、所有值和所有鍵值對陣列。
九、問:舉一些es6對function函式型別做的常用公升級優化?(重要)
答:1、優化部分:
a. 箭頭函式(核心)。箭頭函式是es6核心的公升級項之一,箭頭函式裡沒有自己的this,這改變了以往js函式中最讓人難以理解的this執行機制。主要優化點:
ⅰ. 箭頭函式內的this指向的是函式定義時所在的物件,而不是函式執行時所在的物件。es5函式裡的this總是指向函式執行時所在的物件,這使得在很多情況下this的指向變得很難理解,尤其是非嚴格模式情況下,this有時候會指向全域性物件,這甚至也可以歸結為語言層面的bug之一。es6的箭頭函式優化了這一點,它的內部沒有自己的this,這也就導致了this總是指向上一層的this,如果上一層還是箭頭函式,則繼續向上指,直到指向到有自己this的函式為止,並作為自己的this。
ⅱ. 箭頭函式不能用作建構函式,因為它沒有自己的this,無法例項化。
ⅲ. 也是因為箭頭函式沒有自己的this,所以箭頭函式 內也不存在arguments物件。(可以用擴充套件運算子代替)
b. 函式預設賦值。es6之前,函式的形參是無法給預設值得,只能在函式內部通過變通方法實現。es6以更簡潔更明確的方式進行函式預設賦值。
function es6fuc (x, y = 'default')
es6fuc(4) // 4, default
foo::bar;
// 等同於
bar.bind(foo);
foo::bar(...arguments);
// 等同於
function createmyownobj() , 運氣不錯,成功了`;
resolve(message);
} else 運氣不行,失敗了`;
reject(message);
}}, 1000);
});} });
}let myownobj = createmyownobj();
myownobj.hahaha.then(result => ).catch(error => )
myownobj.wuwuwu.then(result => ).catch(error => )
//obj就是可遍歷的,因為它遵循了iterator標準,且包含[symbol.iterator]方法,方法函式也符合標準的iterator介面規範。
//obj.[symbol.iterator]() 就是iterator遍歷器
let obj = ;
} else ;}}
};}};
es6給set、map、array、string都加上了[symbol.iterator]方法,且[symbol.iterator]方法函式也符合標準的iterator介面規範,所以set、map、array、string預設都是可以遍歷的。
//array
let array = ['red', 'green', 'blue'];
array[symbol.iterator]() //iterator遍歷器
array[symbol.iterator]().next() //
//string
let string = '1122334455';
string[symbol.iterator]() //iterator遍歷器
string[symbol.iterator]().next() //
//set
let set = new set(['red', 'green', 'blue']);
set[symbol.iterator]() //iterator遍歷器
set[symbol.iterator]().next() //
//map
let map = new map();
let obj= ;
map.set(obj, 'mapvalue');
map[symbol.iterator]().next()
///es5
function es5fun (x, y)
es5fun.prototype.tostring = function ()
var p = new es5fun(1, 3);
p.tostring();
object.keys(es5fun.prototype); //['tostring']
//es6
class es6fun
tostring ()
}object.keys(es6fun.prototype); //
b.es6的class類必須用new命令操作,而es5的建構函式不用new也可以執行。
c.es6的class類不存在變數提公升,必須先定義class之後才能例項化,不像es5中可以將建構函式寫在例項化之後。
d.es5 的繼承,實質是先創造子類的例項物件this,然後再將父類的方法新增到this上面。es6 的繼承機制完全不同,實質是先將父類例項物件的屬性和方法,加到this上面(所以必須先呼叫super方法),然後再用子類的建構函式修改this。
ES6 知識點彙總 1 10
es6是新一代的語言標準,es6規範了js使用標準,新增了js原生方法,更適合大型應用開發。babel是乙個es6轉碼器,可以把es6 轉化成es5 以便相容尚未支援es5的專案 es5沒有塊級作用域的概念 es6新增塊級作用域的概念 變數提公升 在使用var申明變數的時候,會提到當前作用域的頂端,...
ES6知識點總結
面向過程和物件導向的對比 面向過程 物件導向 物件 物件是由屬性和方法組成的 類 class 在 es6 中新增加了類的概念,可以使用 class 關鍵字宣告乙個類,之後以這個類來例項化物件 物件導向的思維特點 抽取 抽象 物件共用的屬性和行為組織 封裝 成乙個類 模板 對類進行例項化,獲取類的物件...
ES6知識點簡單總結
let宣告的變數只能在所處遇到的快級有效。不存在變數提公升。暫時性死區,不受外部 影響。在乙個大括號中使用let關鍵字宣告的變數才具有塊級作用域,var關鍵字不具有這個特點 具有塊級作用域。使用const關鍵字宣告的常量必須賦值。常量賦值後值不能更改。varletconst 函式級作用域 塊級作用域...