${}
)取代以往字串形式,可以儲存空格、換行符等let [a,b,c] = [1,2,3]
形式進行賦值let args = [...arguments]
,輕鬆實現陣列結構複製新增 find
,且修復 [NaN].indexOf(NaN) === -1
的bug
arr.find(item => isNaN(item))
copyWithin(target , start 【, end 預設length】)
,將陣列 (s,end] 的內容複製到 target開始的地方,end為負數則就取start處的資料
includes()
:可以用來改寫 條件1 && 條件2 && 條件3
fill()
: new Array(10).fill(1)
flat()
: [1,2,[2,3]].flat()
,只能展開一層
Number.isNaN
:更為嚴格安全,isNaN()
會將字串先往Number型別轉換,再判斷Number.isFinite()
: Infinity、字串、物件返回 false
,全域性isFinite()
同上Number.isInteger(1.0) // true
,判斷是否是整數Math
:
Math.cbrt(8) === 2
,計算立方根Math.hypot(3:,4) === 25
,計算所有引數的平方的和的平方根Math.sign()
:正數返回1,負數返回-1,非數位返回NaNMath.trunc()
:先轉換為Number型別,正數、負數取整 / 非數位返回NaN// 屬性名與對應value的變數名相同時可縮寫
let [apple, orange] = ['red appe', 'yellow orange'];
let myFruits = {apple, orange};
// let myFruits = {apple: 'red appe', orange: 'yellow orange'};
物件解構賦值
物件的擴充套件運運算元(...)
:let {...obj} = {'a' : 1 , 'b' : 2}
super
關鍵字:同this總是指向當前函數所在的物件不同
當前函數所在物件的原型物件
Object.is
:做兩個目標物件的相等比較,修復NaN === NaN //false
,Object.is(NaN,NaN) // true
Object.assign(onlyTarget , source1 ,...)
:合併覆蓋到onlyTarget
中
自身屬性
會被合併繼承屬性
、不可列舉的屬性
不會被合併
getOwnPropertyDescriptors(obj)
:獲取物件所有的自身屬性(配合defineProperties
使用),ES5中getOwnPropertyDescriptor(obj,屬性名)
只能單個獲取(配合defineProperty
使用)
defineProperties( obj , {屬性1 : {組態檔} , 屬性2 :{組態檔} ... } )
defineProperty( obj , 屬性名 , {組態檔} )
getPropertypeOf()
與setProperTypeOf()
:獲取或設定當前物件的prototype物件
__proto__
屬性只是各大瀏覽器私加過於廣泛而默許的屬性
keys() / values() / entries()
:分別獲取物件 鍵 / 值 / 鍵值對
的 陣列
this 指向函數定義時所在的物件
,而不是函數執行時所在的物件
建構函式
,因為沒有自己的this,在new重定向this指向時,沒有屬於自己的this的可供繫結
arguments
物件,不過物件擴充套件符獲取
var fn = (...arguments)=>{console.log(arguments)} ; fn(1,2,3) // [1,2,3]
預設賦值
,ES6之前無法通過形參給出預設賦值雙冒號運運算元
,用來取代bind、call和apply(瀏覽器暫不支援,Babel已經支援轉碼)
foo::bar;
// 等同於
bar.bind(foo);
foo::bar(...arguments);
// 等同於
bar.apply(foo, arguments);
Symbol()生成的值都是獨一無二的
Symbol作物件屬性名
無法被for in
、for of
、Object.keys()
、Object.getOwnPropertyNames()
、JSON.stringify()
遍歷到
其它物件也可以使用它作屬性
let a = Symbol('a');
let obj = {} ;
obj[a] = 'xxx';
// obj = {a : 'xxx'} 的屬性名不是Symbol('a'),而是預設使用字元'a' 作屬性名
Array.from(new Set([1,2,3,3,3,4]))
NaN
被Set認為是相同的,+0
與-0
也是相同的,undefined
也會被儲存.size()
、.add()
、.clear()
、.delete()
、.has()
.keys()
、.values()
、.entries()
、.forEach()
new Map() | new Map([['key1' , 'v1'] , ['key2', 'v2']])
Object的key侷限於字串
,可以是函數、物件、任意基本型別(甚至是NaN)
.size()
、.clear()
、delete()
、entries()
、get(key)
、has(key)
、keys()
、set(key,value)
、values()
entries()
返回迭代物件(遍歷:for...of... / next())for (let [key, value] of myMap)
、myMap.forEach(function(value, key){}
const handler = {
get: function(obj, prop) {
return prop in obj ? obj[prop] : 37;
}
};
const p = new Proxy({}, handler);
統一整合到Reflect上
Reflect.apply(target, thisArgument, argumentsList)
整合 apply方法Reflect.defineProperty(target, propertyKey, attributes)
整合defineProperty方法回撥地獄
問題
是一種標準、解決方案,Set、Map都不能用for迴圈遍歷
就好像JavaScript是ECMAScript標準的一種具體實現一樣,Iterator標準的具體實現是Iterator遍歷器
//obj.[Symbol.iterator]() 就是Iterator遍歷器
let obj = {
data: [ 'hello', 'world' ],
[Symbol.iterator]() {
const self = this;
let index = 0;
return {
next() {
if (index < self.data.length) {
return {
value: self.data[index++],
done: false
};
} else {
return { value: undefined, done: true };
}
}
};
}
};
ES6規定,所有部署了Iterator介面的物件(可遍歷物件)都可以用for...of遍歷
//Array
let array = ['red', 'green', 'blue'];
array[Symbol.iterator]() //Iterator遍歷器
array[Symbol.iterator]().next() //{value: "red", done: false}
//String
let string = '1122334455';
string[Symbol.iterator]() //Iterator遍歷器
string[Symbol.iterator]().next() //{value: "1", done: false}
//set
let set = new Set(['red', 'green', 'blue']);
set[Symbol.iterator]() //Iterator遍歷器
set[Symbol.iterator]().next() //{value: "red", done: false}
//Map
let map = new Map();
let obj= {map: 'map'};
map.set(obj, 'mapValue');
map[Symbol.iterator]().next() {value: Array(2), done: false}
ES6規定,所有部署了Iterator介面的物件(可遍歷物件)都可以用for...of遍歷
// 注意 * 貼著function
function* generator(){
yeild 1;
yeild 2;
}
內建自動執行器
的Generator函數語法糖,它配合ES6的Promise近乎完美的實現了非同步程式設計解決方案語法糖
,使物件範例化的過程更像物件導向程式設計// ES5 玩法
function MyClass(data , props){
this.data = data
this.props = props
return this
}
MyClass.prototype.toString = function(){
return this.data + ',' + this.props
}
var mc = new MyClass('a','b')
// ES6 玩法
class MyClass{
constructor(data,props){
this.data = data
this.props = props
}
toString(){
return this.data + ',' + this.props
}
}
Object.keys(MyClass.prototype) // []
new
,ES5不使用new也可以執行Class不存在變數提升
,必須先宣告Class才能使用,ES5中可以先範例化、再宣告// ES5方法
function Parent(){ }
function Child(){ }
// 方法1
var child1 = new Child()
child1.prototype = new Parent() // 這樣 child1 就可以存取 Parent 上的方法了
// 方法2
function Child(){
Parent.call(this , arguments)
}
// ES6方法
class Child extends Parent{
constructor(props){
super(props) // 可以在父類別中列印資料
this.props = props
}
}
靜態載入(編譯階段載入)
而不是動態載入(執行時載入)
引入宏(macro)
和型別檢驗(type system)
var self = this
let
取代var
解構賦值
來命名變數
let { name , age } = { ...{name:'lhx' , age : 12 } }
function fn(str1 : string , num1 : number)
function fn(str1 : string = 'default' , num1 : number = 12)
function fn(s1 : string . s2 : string , arr : string[] )
呼叫=> fn('a','b','c','d','e')
function fn(s1 : string , num1 ?: number )
函數名相同、接收不同引數
的函數宣告,再給出函數的定義
不同引數
定義:
function disp(s1:string):void;
function disp(n1:number,s1:string):void;
function disp(s1:string,n1:number):void;
// 引數型別不同,應設定為any
function disp(x: string | number,y?:string | number):void {
console.log(x);
console.log(y);
}
disp("abc")
disp(1,"xyz");
disp('a' , 100)