6.数组的扩展
6.1Array.from()
其用于将两类对象转换为真正的数组:类似数组的对象和可遍历的对象
例:let ps = document.querySelectAll('p');
Array.from(ps).forEach(function(p){
console.log(p);
});
还可以接受第二个参数,用来对每个元素进行处理。
例:Array.from(arrayLike,x=>x*x);
6.2Array.of()
用于将一组值转换为数组。
Array.of(3,11,8); //[3, 11, 8]
6.3数组实例的find()和findIndex()
用于找出第一个符合条件的数组元素。参数为回调函数
例:[1,5,15,13].find(function(value,index,arr){
return > 9;
});
6.4数组实例的fill()
使用给定值填充一个数组。
例:['a','b','c'].fill(7); //[7,7,7]
6.5数组实例的entires(),keys(),values()
用于遍历数组。
keys()是对键名的遍历,values()是对键值的遍历,entires是对键值对的遍历。
例:for(let index of ['a','b'].keys(){
console.log(index);
}
// 0
// 1
6.6数组推导
例:var years = [1954,1974,1990,2006,2010,2014];
[for (year of years ) if (year ? 2000) year];//[2006,2010,2014]
6.7Array.observe(),Array.unobserve()
用于监听数组的变化,指定回调函数。
7.对象的扩展
7.1Object.is()
用来比较两个值是否严格相等。
例:Object.is(+0,-0); //false
Object.is(NaN,NaN); //true
7.2Object.assign()
用于将源对象的所有可枚举属性,复制到目标对象。
例:var target = { a:1 };
var source1 = {b:2};
var source2 = {c:3};
Object.assign(target,source1,source2);
target //{a:1,b:2,c:3}
//若属性有同名,则后面的会覆盖前面的
7.3__proto__属性,Object.setPrototypeOf(),Objcet.getPrototypeOf()
7.4增强的对象写法
例:var Person = {
name: '张三',
birth, //等同于birth:birth
hello(){ //等同于hello:function()...
console.log('我的名字是',)
}
}
7.5属性名表达式
ES6允许定义对象时用表达式作为对象的属性名。
例:var suffix = "word";
var a = {
["first" + suffix]:"hello",
["last" + suffix]: "world"
};
a["first word"]; //"hello"
a["last word"];//"world"
7.6Symbol
var mySymbol = Symbol('Test');
mySymbol.name //Test
typeof mySymbol //"symbol"
7.7Proxy
在目标对象之前,架设一层“拦截”,外界对该对象的访问,都必须先通过这层拦截,可以被过滤和改写。
例:var proxy = new Proxy({},{
get:function(target,property){
return 35;
}
});
proxy.time //35
proxy.name //35
proxy.title//35
7.8Object.observe(),Objec.unobserve();
用来监听对象的变化
例:var = {};
function observer(changes){
changes.forEach(function(change){
console.log('发生变动的属性:'+ change.name);
console.log('变动前的值:'+ change.oldValue);
console.log('变动后的值:'+ change.object[change.name]);
console.log('变动类型:'+ change.type);
});
}
Object.observe(o,observer);
8.函数的扩展
8.1函数参数的默认值
ES6允许为函数的参数设置默认值。
例:function Point(x=0, y = 0) {
this.x = x;
this.y = y;
}
var p = new Point();
// p = {x:0,y:0}
8.2rest参数
例:function add(...values){
let sum = 0;
for(var val of values){
sum +=val;
}
return sum;
}
add(2,5,3) //10
8.3 扩展运算符
扩展运算符是三个点(...)。
8.4箭头函数
ES6允许使用“箭头”(=>)定义函数。
var f = v =>v;
等同于
var f = function(v) {
return v;
}
9.Set和Map数据结构
9.1Set
类似于数组,只不过其成员值都是唯一的,没有重复的值。
例:var s = new Set();
[2,3,4,5,2,2].map(x=>s.add(x));
for(i of s) {console.log(i) }
// 2 3 4 5
9.2Map
类似于对象,也是键值对的集合,但“键”的范围不限于字符串,对象也可以当作键。
例:var m = new Map();
o = {p:"Hello World"};
m.set(o,"content");
console.log(m.get(o));
Map的属性和方法
size:返回成员总数。
set(key,value):设置一个键值对。
get(key):读取一个键。
has(key):返回一个布尔值,表示某个键是否在Map结构中。
delete(key):删除某个键。
clear():清除所有成员。
遍历
keys():返回键名的遍历器。
values():返回键值的
entires():返回所有成员的遍历器。
9.3WeakMap
结构与Map结构基本类似,唯一的区别是它只接受对象作为键名,不接受原始类型的值作为键名。
设计:当对象被回收后,WeakMap自动移除对应的键值对。此结构有助于防止内存泄漏。
10.lterator和for...of 循环
遍历器(Iteraor)是一种协议,任何对象只要部署这个协议,就可以完成遍历操作。
主要作用:为遍历对象的属性提供统一的接口;使对象的属性能够按次序排列。
例:function makeIterator(array){
var nextIndex = 9;
return {
next:function() {
return nextIndex < array.length ? {value: array[nextIndex++], done: false} : {value: undefined, done: true};
}
}
}
var it = makeIterator(['a','b']);
it.next().value // 'a'
it.next().value //'b'
it.next().done //true
10.2for... of 循环
一个对象只要部署了next方法,就被视为具有iterator接口,就可以用for...of 循环遍历它的值。
例:for(var n of it){
if(n >5){
break;
}
console.log(n);
}
//1 2 3 4 5