ES6 标准入门 - 阮一峰
Object.assign()
const a = {name: '小华', age: 19, sex: '女'}
const b = {name: '小华', age: 20}
const c = Object.assign(a, b)
console.log(a)
console.log(b)
console.log(c)
// {name: '小华', age: 20, sex: '女'}
// {name: '小华', age: 20}
// {name: '小华', age: 20, sex: '女'}
通过上方代码可以看出,通过Object.assign()方法,会修改原对象a,并且返回的c对象和a对象一样,b对象不会修改被对象,Object.assign()第一个对象为目标对象,后边的无论多少都是源对象,目标对象是合并后,要返回的对象,在时机使用过程中一般第一个对象写成一个空对象,这样才不会对其他对象造成影响。
const a = {name: '小华', age: 19, sex: '女'}
const b = {name: '小华', age: 20}
Object.assign({}, a, b);
new set()
去重
这里用到了Rest参数
let arr = [1,1,2,2,2,2,2,3,3,3,4,4,4]
let item = [...new Set(arr)] // 这里放在数组里面使用Rest参数将去重后的数值一个一个存放到item数组中
console.log(item)
// [1,2,3,4]
新增方法
Array.from()
将伪数组转化为真正的数组
- 转化后数组会根据伪数组中的
length: 2属性进行,也就是如果length的值为2,只会转化伪数组的前两个值
let likeArr = {
0:'React',
1:'Vue',
2:'Angular',
3:'Node',
4:'Vant',
'length':2
}
let arr = Array.from(likeArr);
console.log(arr); // (2) ['React', 'Vue']
Object.freeze()
const foo = {name: '小明'}
foo.name = '小华'
console.log(foo); // {name: '小华'}
如上代码,虽然const声明的为常量,其foo指向的内存地址不可改变,但其内部的属性可以改变,也就是上述代码可以正确执行。
如果使用Object.freeze()方法,则会把对象冻结,则表示不仅foo指向的内存地址不可改变,其内部的属性也不会被改变。如下代码,在使用了Object.freeze()方法之后,更改foo的属性将不起作用。
const foo = {name: '小明'}
Object.freeze(foo)
foo.name = '小华'
console.log(foo); // {name: '小明'}
如果在使用了Object.freeze()方法后,再开启严格模式'use strict',代码更会报错。
'use strict'
const foo = {name: '小明'}
Object.freeze(foo)
foo.name = '小华'
console.log(foo); // (报错)
Object.keys()
冷知识
对象可以通过以下两种方式获取值。
let obj = {name1: '小强', name2: '小虎', name3: '小华', name4: '小明'}
console.log(obj['name1'], obj.name1); // 小强 小强
let obj = {name1: '小强', name2: '小虎', name3: '小华', name4: '小明'}
const objKeys = Object.keys(obj)
console.log(objKeys) // (4) ['name1', 'name2', 'name3', 'name4']
如上代码所示,Object.keys的主要作用就是将对象中的所有key打包成数组进行返回。然后可以通过forEach()对对象的值进行遍历,如下代码所示。
let obj = {name1: '小强', name2: '小虎', name3: '小华', name4: '小明'}
Object.keys(obj).forEach((key, index) => {
console.log(obj[key]) // 小强 小虎 小华 小明
})
注意:这里的取值采用obj[key]的方式,因为Object.keys(obj)返回的对象key为字符串,如果取值用obj.'name1'显然不对。
ES6 声明变量的六种方法
- var [ES5]
- function [ES5]
- let [ES6]
- const [ES6]
- import [ES6]
- class [ES6]
Generator
yield表达式只能用在Generator函数内,用在其他地方将报错。
function* f() {
let a = 0;
while(true){
yield a
a++
}
}
const [a, b, c, d, e, ff, g] = f()
console.log(a, b, c, d, e, ff, g)
作用域
因为在foo函数作用域中,新声明了一个x变量,而y()函数中的x其实是foo函数参数那里新声明的x,x=2也是改变的foo函数参数那里新声明的x,foo函数内到的打印x,遵循就近原则,先找自己作用域下的x,也就是x=3。在下面代码中声明了三个x变量,根据不同的作用域,改变不同的x变量
var x = 1;
function foo(x, y = function() { x = 2; }) {
let x = 3;
console.log('1',x); // 3
y();
console.log('2',x); // 3
}
console.log('3',x); // 1
foo()
console.log('4',x); // 1

浙公网安备 33010602011771号