[toc]
## 數組的擴展
### Array.from()
Array.from()將類數組括可迭代對象(包括set和map)轉為真正的數組
```
let arrayLike={
"0":"a",
"1":"b",
"2":"c",
length:3
}
ES5:
var arr1 = [].slice.call(arrayLike); //["a","b","c"]
ES6:
var arr2 = Array.from(arrayLike); //["a","b","c"]
```
Array.from()還接受第二個參數,第二個參數是一個方法,類似map一樣對每個元素進行處理:
```
Array.from([1,2,3],x=>x*x); //[1,4,9]
```
### Array.of()
Array.of()用于將一組值轉換為數組
```
Array.of(3,11,8); //[3,11,8]
```
### 數組實例的copyWithin()
copyWithin()方法用以將指定位置的成員負值到其他位置,覆蓋目標位置的值,會修改原數組
Array.prototype.copyWithin(target,source=0,end=this.length):
- target,必須,目標位置
- start,可選,從該位置開始讀取
- end,可選,到當前位置結束,默認等于數組的長度
```
[1,2,3,4,5].copyWithin(0,3);
//原數組變為[4,2,3,4,5]
```
### 數組實例的find()和findIndex()
- find()方法用來找出第一個符合條件的數組成員
- findIndex()用來找出第一個符合條件的成員索引
```
[1,5,10,15].find(function(value,index,arr){
return value>9;
}); //10
[1,5,10,15].findIndex(function(value,index,arr){
return value>9;
}); //2
```
### 數組實例的fill()
使用給定的值填充數組,初始化數組時很方便
```
["a","b","c"].fill(7); //[7,7,7]
new Array(3).fill(0); //[0,0,0]
```
### 數組實例的entries(),keys()和values()
都用于遍歷數組,都返回一個遍歷器對象。可以使用for...of循環
```
for(let index of ["a","b"].keys(){
console.log(index);
})
//0,1
for(let values of ["a","b"].values(){
console.log(values)
})
//"a","b"
for(let [index,value] of ["a","b"].entries(){
console.log(index+" "+value);
})
//"0 a","1 b"
```
### 數組實例的includes()方法
是否包含某個值,可以指定第二個參數用以表示開始搜索的位置
## 對象的擴展
### 屬性的簡潔表達
```
var foo = "bar";
var baz = {foo};
//baz:{foo:"bar"}
function f(x,y){
return {x,y}
}
等價于:
function f(x,y){
retrn {x:x,y:y}
}
var o = {
method(){
return "hello"
}
}
等價于:
var o = {
method function(){
reutrn "hello"
}
}
```
CommonJS規范的簡寫:
```
var ms{};
function f1(key){
return key in ms?ms[key]:null
}
function f2(key,value){
ms[key] = value
}
function f3(){
ms = {};
}
modules.exports = {f1,f2,f3}
等價于:
modules.exports = {
f1:f1,
f2:f2,
f3:f3
}
```
### 屬性名表達式
ES6允許將表達式作為屬性名:
```
let propKey = "foo";
let obj={
[propKey]:"true",
["a"+"bc"]:123
}
//obj:{foo:true,"abc":123}
```
### 方法的name屬性
函數的name屬性返回函數名
```
var p ={
sayHi:function(){
console.log("hi");
}
}
p.sayHi.name; //sayHi
```
### Object.is()
用來比較兩個值是否嚴格相等,與嚴格比較符(===)基本一致
### Object.assign()
Object.assign(target,source1,source2,...)將源對象的所有可枚舉屬性復制到目標對象
如果源對象與目標對象有相同的屬性,或者多個源對象有相同的屬性,則后面的覆蓋前面的。
對于嵌套的對象,Object.assign會直接替換:
```
var target = {
a:{
b:"c",
d:"e"
}
}
var source = {
a:{
b:"hello"
}
}
Object.assign(target,source);
//{a:{b:"hello"}}
```
Object.assign方法可以用來為對象添加屬性和方法,也可以用來克隆對象和合并多個對象
### 屬性的可枚舉性
每個屬性都有一個屬性描述符(Descriptor)用以控制該屬性的行為,可以使用Object.getOwnPropertyDescriptor()來獲取對象的描述。
ES5中有以下3個方法會忽略enumerable為false的屬性:
- for...in
- Object.keys()
- JSON.stringify()
ES6新增了兩個操作,也會忽略enumerable為false的屬性:
- Object.assign()
- Reflect.enumerable():返回所有for...in會遍歷到的屬性
### 屬性的遍歷
ES6有6種方法可以遍歷屬性:
- for...in
- Object.keys(obj)
- Object.getOwnPropertyNames(obj)
- Object.getOwnPropertySymbols(obj)
- Reflect.ownKeys(obj)
- Reflect.enumerable(obj)
### __proto__屬性,Object.setPropertyOf(),Object.getPrototypeOf()
__proto__屬性用來讀取或設置對象的prototype對象
Object.setPropertyOf()用來設置屬性的prototype對象
Object.getPropertyOf()用來獲取屬性的prototype對象