解構
解構賦值的規則是,只要等號右邊的值不是對象,就先將其轉為對象。由于undefined和null無法轉為對象,所以對它們進行解構賦值,都會報錯。
解構函數的用途
1 交換變量值
[x,y] = [y,x]
2 從函數返回多個值
var {foo,bar} = example( );
3 函數參數的定義
4 提取Json數據
var jsonData = { id: 42, status: "OK", data: [867, 5309]};
let { id, status, data: number } = jsonData;
console.log(id, status, number);// 42, "OK", [867, 5309]
5 函數參數的默認值
6 遍歷map結構
var map = new Map( );
map.set('first','hello');
map.set('second','hello');
map.set('third','hello');
map.set('fourth','hello');
for(let[key,value] of map){
//獲取到鍵值對
}
for(let [key] of map){
//獲得鍵名
}
for(let [,value] of map){
//獲得鍵值
}
7 輸入模塊的指定方法
const { SourceMapConsumer, SourceNode } = require("source-map");
正則擴展
at相當于charAt() ,可以識別中文
normarize()
includes() , startsWith() , endsWith()
repeat(n) //n為重復次數
padStart, padEnd 字符串補全
數值擴展
二進制 0b, 八進制0o
Number.isInteger(25.0) // true
Number.EPSILON
function withinErrorMargin (left, right) {
return Math.abs(left - right) < Number.EPSILON;
}
withinErrorMargin(0.1 + 0.2, 0.3)
// true
withinErrorMargin(0.2 + 0.2, 0.3)
// false
Math.trunc(4.1) //去除小數部分
Math.sign() //判斷正負數/0
Math.cbrt() //立方根
Math.fround() //返回數值的單精度浮點數形式
...
還有一些關于對數方法,三角函數方法
指數運算符: a**=2; // a= a * a;
數組擴展
1 對象轉數組
//es5 對象轉數組:
var arr1 = [].slice.call(arrayLike);
//es6 對象轉數組,適用于數組對象和可遍歷對象Map,Set
let arr2 = Array.from(arrayLike);
2 Array.of(值1,值2,值3) 將一組值轉換為數組
等價于es5
var arr1 = [].slice.call(arguments);
3 copyWithin(target,start,end)
target(必需):從該位置開始替換數據。
start(可選):從該位置開始讀取數據,默認為0。如果為負值,表示倒數。
end(可選):到該位置前停止讀取數據,默認等于數組長度。如果為負值,表示倒數。
[1, 2, 3, 4, 5].copyWithin(0, 3) // [4, 5, 3, 4, 5]
4 find(回調函數)
//返回符合條件的值
[1, 4, -5, 10].find((n) => n < 0) // -5
findIndex
//返回符合條件的第一個索引
[1, 5, 10, 15].findIndex(function(value, index, arr) {
return value > 9;
})
// 2
5 fill( ) 使用給定值填充一個數組
6 entries(),keys()和values()——用于遍歷數組
7 includes() 數組是否包含給定的值
函數擴展
1 函數參數設置了默認值,length失效
2 rest參數 ...變量名 用于獲取函數多余的參數
3 ...替換apply
// ES5的寫法
function f(x, y, z) {
// ...
}
var args = [0, 1, 2];
f.apply(null, args);
// ES6的寫法
function f(x, y, z) {
// ...
}
var args = [0, 1, 2];
f(...args);
//字符串轉數組
[...'hello'] // ["h","e","l","l","o"]
4 函數的name屬性
5 箭頭函數
箭頭函數有幾個使用注意點。
(1)函數體內的this對象,就是定義時所在的對象,而不是使用時所在的對象。
(2)不可以當作構造函數,也就是說,不可以使用new命令,否則會拋出一個錯誤。
(3)不可以使用arguments對象,該對象在函數體內不存在。如果要用,可以用Rest參數代替。
(4)不可以使用yield命令,因此箭頭函數不能用作Generator函數。
上面四點中,第一點尤其值得注意。this對象的指向是可變的,但是在箭頭函數中,它是固定的。
6 函數綁定
obj::bind() 方法綁定在對象上
7 尾調用
function outter(x){
return inner(x);
}
8 尾遞歸
對象擴展
Object.is
就是部署這個算法的新方法。它用來比較兩個值是否嚴格相等,與嚴格比較運算符(===)的行為基本一致。
+0 === -0 //true
NaN === NaN // false
Object.is(+0, -0) // false
Object.is(NaN, NaN) // true
Object.assign
方法用于對象的合并,將源對象(source)的所有可枚舉屬性,復制到目標對象(target)。
淺拷貝
ES6一共有5種方法可以遍歷對象的屬性。
(1)for...in
for...in循環遍歷對象自身的和繼承的可枚舉屬性(不含Symbol屬性)。
(2)Object.keys(obj)
Object.keys返回一個數組,包括對象自身的(不含繼承的)所有可枚舉屬性(不含Symbol屬性)。
(3)Object.getOwnPropertyNames(obj)
Object.getOwnPropertyNames返回一個數組,包含對象自身的所有屬性(不含Symbol屬性,但是包括不可枚舉屬性)。
(4)Object.getOwnPropertySymbols(obj)
Object.getOwnPropertySymbols返回一個數組,包含對象自身的所有Symbol屬性。
(5)Reflect.ownKeys(obj)
Reflect.ownKeys返回一個數組,包含對象自身的所有屬性,不管是屬性名是Symbol或字符串,也不管是否可枚舉。
以上的5種方法遍歷對象的屬性,都遵守同樣的屬性遍歷的次序規則。
首先遍歷所有屬性名為數值的屬性,按照數字排序。
其次遍歷所有屬性名為字符串的屬性,按照生成時間排序。
最后遍歷所有屬性名為Symbol值的屬性,按照生成時間排序。
Symbol
Proxy和Reflect
Set和Map
Iterator和 for...of
Generator函數
function* generator(){
yield 1;
yield 2;
yield 3;
return 4;
}
generator.next() // { value: 1, done: false }
generator.next()// { value: 2, done: false }
generator.next()// { value: 3, done: false }
generator.next()// { value: 4, done: true }
Promise對象
一個用Promise對象實現的Ajax操作的例子。
var getJSON = function(url) {
var promise = new Promise(function(resolve, reject){
var client = new XMLHttpRequest();
client.open("GET", url);
client.onreadystatechange = handler;
client.responseType = "json";
client.setRequestHeader("Accept", "application/json");
client.send();
function handler() {
if (this.readyState !== 4) {
return;
}
if (this.status === 200) {
resolve(this.response);
} else {
reject(new Error(this.statusText));
} }; });
return promise
;};
getJSON("/posts.json")
.then(function(json) {
console.log('Contents: ' + json);
}, function(error) {
console.error('出錯了', error);
});
getJSON是對XMLHttpRequest對象的封裝,用于發出一個針對JSON數據的HTTP請求,并且返回一個Promise對象。需要注意的是,在getJSON內部,resolve函數和reject函數調用時,都帶有參數。