ES6-learning-数组扩展

1.方法的name属性
函数的name属性,返回函数名,对象方法也是函数,因此也有name属性
如果对象的方法使用了getter和setter,则name属性不是在该方法上面,而是该方法的属性的描述对象的get和set属性上面,返回值使方法名前加上get和set。

2.Object.is()方法判断是否完全相等

Object.is('foo','foo');//true
  Object.is({},{});//false
  Object.is(+0,-0);false;
  Object.is(NaN,NaN);//true

3.Object.assign方法的第一个参数是目标对象,后面的参数都是源对象(浅拷贝:如果源对象某个属性的值是对象,那么目标对象拷贝得到的是这个对象的引用)
    1).null,undefined不能作为目标对象
    2)作为源对象的参数,无论是否是对象,若不是,就直接跳过,即null与undefined不在首参数,就不会报错
    3)布尔值和数值作为目标对象时,只有字符串的包装对象会产生枚举效果,其它都会被忽略

        Object(true) // {[[PrimitiveValue]]: true}
	Object(10)  //  {[[PrimitiveValue]]: 10}
	Object('abc') // {0: "a", 1: "b", 2: "c", length: 3, [[PrimitiveValue]]: "abc"}

  4)拷贝的属性是有限制的,只拷贝源对象的自身属性(不拷贝继承属性,也不拷贝不可枚举属性)
  5)遇见同名属性,Object.assign的处理方法是替换

const target = { a: { b: 'c', d: 'e' } }
const source = { a: { b: 'hello' } }
Object.assign(target, source)
// { a: { b: 'hello' } }
	

6)只进行值的复制,如果是取值函数,就先取完值再去复制

    原始值都在包装对象的内部属性[[PrimitiveValue]]上面,这个属性时不会被Object.assign拷贝的

PS:如果目标对象与源对象有同名属性,或多个源对象有同名属性,则后面的属性会覆盖前面的属性

用处:1)添加对象属性
          2)添加对象方法
          3)克隆对象
        保持继承链,克隆对象自身的值以及继承的值

function clone(origin){
	let originProto=Object.getPrototypeOf(origin);
        return Object.assign(Object.create(origninProto),origin);
		}

       4)合并多个对象
       5)为属性指定默认值(浅拷贝,尽量属性值都用简单类型)

4.属性的可枚举性和遍历

Object.getOwnPropertyDescriptor方法可以获取该属性的描述对象
let obj = { foo: 123 };
Object.getOwnPropertyDescriptor(obj, 'foo')
//  {
//    value: 123,
//    writable: true,
//    enumerable: true,//可枚举性,如果为false,就表示某些操作会忽略当前属性
//    configurable: true
//  }

目前,有四个操作会忽略enumerable为false的属性
·for...in循环:只遍历对象自身和继承的可枚举属性

·Object.keys():返回对象自身的所有可枚举的属性的键名

·JSON.stringify()只串行化对象自身的可枚举的属性
·Object.assign忽略enumerable为false的属性,只拷贝对象自身的可枚举的属性

5.Object.getOwnpropertyDescriptors方法 返回某个对象属性的描述对象

  1)解决Object.assign()无法正确拷贝get属性和set属性的问题

const shallowMerge = (target, source) => Object.defineProperties(
  target,
  Object.getOwnPropertyDescriptors(source)
);

2)实现一个对象继承另一个对象

const obj = Object.create(
  prot,
  Object.getOwnPropertyDescriptors({
  foo: 123,
 })
);

 3)实现Mixin(混入)模式

6.super关键字
this关键字总是指向函数所在的当前对象。
super:指向当前对象的原型对象(super表示原型对象时,只能用在对象的方法中,用在其他地方都会报错)

const obj = {
  foo: 'world',
  find() {//正确
    return super.foo;
  }
};

// 报错
const obj = {
  foo: super.foo
}

// 报错
const obj = {
  foo: () => super.foo
}

7.Object.keys()反hi对象自身的所有的可遍历属性的键名----会排序,键值按键名返回
ES7引入了跟Object.keys配套的Object.values(属性的键值)和Object.enteries(键值对)--------(for...of)


// 报错
const obj = {
  foo: function () {
    return super.foo
  }
}

8.对象的解构赋值用于从一个对象取值,相当于将目标对象自身所有可遍历的,但尚 被读取的属性,分配到指定的对象上面。
所有的键和值都会拷贝到新对象上面(null,undefined报错)

1)扩展运算符可用于合并俩个对象

let ab={...a,...b}====let ab=Object.assign({},a,b);

2)如果用户自定义的属性,放在扩展运算符后面,则扩展运算符内部的同名属性会被覆盖掉
3)扩展运算符后面可以跟表达式
4)如果扩展运算符后面时i一个空对象,则没有任何效果
5)如果扩展运算符的参数是null和undefined,这两个值会被忽略,不会报错
6)扩展运算符的参数对象中,如果有取值函数get.这个函数是执行的

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值