解構(gòu)
解構(gòu)賦值的規(guī)則是,只要等號(hào)右邊的值不是對(duì)象,就先將其轉(zhuǎn)為對(duì)象茴厉。由于undefined和null無(wú)法轉(zhuǎn)為對(duì)象,所以對(duì)它們進(jìn)行解構(gòu)賦值什荣,都會(huì)報(bào)錯(cuò)矾缓。
解構(gòu)函數(shù)的用途
1 交換變量值
[x,y] = [y,x]
2 從函數(shù)返回多個(gè)值
var {foo,bar} = example( );
3 函數(shù)參數(shù)的定義
4 提取Json數(shù)據(jù)
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 函數(shù)參數(shù)的默認(rèn)值
6 遍歷map結(jié)構(gòu)
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){
//獲取到鍵值對(duì)
}
for(let [key] of map){
//獲得鍵名
}
for(let [,value] of map){
//獲得鍵值
}
7 輸入模塊的指定方法
const { SourceMapConsumer, SourceNode } = require("source-map");
正則擴(kuò)展
at相當(dāng)于charAt() ,可以識(shí)別中文
normarize()
includes() , startsWith() , endsWith()
repeat(n) //n為重復(fù)次數(shù)
padStart, padEnd 字符串補(bǔ)全
數(shù)值擴(kuò)展
二進(jìn)制 0b, 八進(jìn)制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) //去除小數(shù)部分
Math.sign() //判斷正負(fù)數(shù)/0
Math.cbrt() //立方根
Math.fround() //返回?cái)?shù)值的單精度浮點(diǎn)數(shù)形式
...
還有一些關(guān)于對(duì)數(shù)方法稻爬,三角函數(shù)方法
指數(shù)運(yùn)算符: a**=2; // a= a * a;
數(shù)組擴(kuò)展
1 對(duì)象轉(zhuǎn)數(shù)組
//es5 對(duì)象轉(zhuǎn)數(shù)組:
var arr1 = [].slice.call(arrayLike);
//es6 對(duì)象轉(zhuǎn)數(shù)組,適用于數(shù)組對(duì)象和可遍歷對(duì)象Map嗜闻,Set
let arr2 = Array.from(arrayLike);
2 Array.of(值1,值2,值3) 將一組值轉(zhuǎn)換為數(shù)組
等價(jià)于es5
var arr1 = [].slice.call(arguments);
3 copyWithin(target,start,end)
target(必需):從該位置開(kāi)始替換數(shù)據(jù)。
start(可選):從該位置開(kāi)始讀取數(shù)據(jù)桅锄,默認(rèn)為0琉雳。如果為負(fù)值样眠,表示倒數(shù)。
end(可選):到該位置前停止讀取數(shù)據(jù)翠肘,默認(rèn)等于數(shù)組長(zhǎng)度檐束。如果為負(fù)值,表示倒數(shù)束倍。
[1, 2, 3, 4, 5].copyWithin(0, 3) // [4, 5, 3, 4, 5]
4 find(回調(diào)函數(shù))
//返回符合條件的值
[1, 4, -5, 10].find((n) => n < 0) // -5
findIndex
//返回符合條件的第一個(gè)索引
[1, 5, 10, 15].findIndex(function(value, index, arr) {
return value > 9;
})
// 2
5 fill( ) 使用給定值填充一個(gè)數(shù)組
6 entries()被丧,keys()和values()——用于遍歷數(shù)組
7 includes() 數(shù)組是否包含給定的值
函數(shù)擴(kuò)展
1 函數(shù)參數(shù)設(shè)置了默認(rèn)值,length失效
2 rest參數(shù) ...變量名 用于獲取函數(shù)多余的參數(shù)
3 ...替換apply
// ES5的寫(xiě)法
function f(x, y, z) {
// ...
}
var args = [0, 1, 2];
f.apply(null, args);
// ES6的寫(xiě)法
function f(x, y, z) {
// ...
}
var args = [0, 1, 2];
f(...args);
//字符串轉(zhuǎn)數(shù)組
[...'hello'] // ["h","e","l","l","o"]
4 函數(shù)的name屬性
5 箭頭函數(shù)
箭頭函數(shù)有幾個(gè)使用注意點(diǎn)肌幽。
(1)函數(shù)體內(nèi)的this對(duì)象晚碾,就是定義時(shí)所在的對(duì)象,而不是使用時(shí)所在的對(duì)象喂急。
(2)不可以當(dāng)作構(gòu)造函數(shù)格嘁,也就是說(shuō),不可以使用new命令廊移,否則會(huì)拋出一個(gè)錯(cuò)誤糕簿。
(3)不可以使用arguments對(duì)象,該對(duì)象在函數(shù)體內(nèi)不存在狡孔。如果要用懂诗,可以用Rest參數(shù)代替。
(4)不可以使用yield命令苗膝,因此箭頭函數(shù)不能用作Generator函數(shù)殃恒。
上面四點(diǎn)中,第一點(diǎn)尤其值得注意辱揭。this對(duì)象的指向是可變的离唐,但是在箭頭函數(shù)中,它是固定的问窃。
6 函數(shù)綁定
obj::bind() 方法綁定在對(duì)象上
7 尾調(diào)用
function outter(x){
return inner(x);
}
8 尾遞歸
對(duì)象擴(kuò)展
Object.is
就是部署這個(gè)算法的新方法亥鬓。它用來(lái)比較兩個(gè)值是否嚴(yán)格相等,與嚴(yán)格比較運(yùn)算符(===)的行為基本一致域庇。
+0 === -0 //true
NaN === NaN // false
Object.is(+0, -0) // false
Object.is(NaN, NaN) // true
Object.assign
方法用于對(duì)象的合并嵌戈,將源對(duì)象(source)的所有可枚舉屬性,復(fù)制到目標(biāo)對(duì)象(target)听皿。
淺拷貝
ES6一共有5種方法可以遍歷對(duì)象的屬性熟呛。
(1)for...in
for...in循環(huán)遍歷對(duì)象自身的和繼承的可枚舉屬性(不含Symbol屬性)。
(2)Object.keys(obj)
Object.keys返回一個(gè)數(shù)組尉姨,包括對(duì)象自身的(不含繼承的)所有可枚舉屬性(不含Symbol屬性)庵朝。
(3)Object.getOwnPropertyNames(obj)
Object.getOwnPropertyNames返回一個(gè)數(shù)組,包含對(duì)象自身的所有屬性(不含Symbol屬性,但是包括不可枚舉屬性)偿短。
(4)Object.getOwnPropertySymbols(obj)
Object.getOwnPropertySymbols返回一個(gè)數(shù)組,包含對(duì)象自身的所有Symbol屬性馋没。
(5)Reflect.ownKeys(obj)
Reflect.ownKeys返回一個(gè)數(shù)組昔逗,包含對(duì)象自身的所有屬性,不管是屬性名是Symbol或字符串篷朵,也不管是否可枚舉勾怒。
以上的5種方法遍歷對(duì)象的屬性,都遵守同樣的屬性遍歷的次序規(guī)則声旺。
首先遍歷所有屬性名為數(shù)值的屬性笔链,按照數(shù)字排序。
其次遍歷所有屬性名為字符串的屬性腮猖,按照生成時(shí)間排序鉴扫。
最后遍歷所有屬性名為Symbol值的屬性,按照生成時(shí)間排序澈缺。
Symbol
Proxy和Reflect
Set和Map
Iterator和 for...of
Generator函數(shù)
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對(duì)象
一個(gè)用Promise對(duì)象實(shí)現(xiàn)的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('出錯(cuò)了', error);
});
getJSON是對(duì)XMLHttpRequest對(duì)象的封裝,用于發(fā)出一個(gè)針對(duì)JSON數(shù)據(jù)的HTTP請(qǐng)求姐赡,并且返回一個(gè)Promise對(duì)象莱预。需要注意的是,在getJSON內(nèi)部项滑,resolve函數(shù)和reject函數(shù)調(diào)用時(shí)依沮,都帶有參數(shù)。