字符串扩展的方法
- includes
- startWith
-
对象
Object.assign()合并多个对象,第一个参数就是最终返回的值
let obj1 = {a: 'aa',b: 'bb'}let obj2 = {b: 'dd',c: 'ee'}let result = Object.assign({}, obj1, obj2)result.a = 'cc'console.log(obj1, result) //{a: "aa", b: "bb"} {a: "cc", b: "dd", c: "ee"}
Object.is() 判断两个值是否相等,返回布尔值
es5中,对于0的判断不区分正负值,-0 == +0返回true,NaN == NaN返回 返回false;
Object.is()规避了这些问题Object.is(+0, -0)//falseObject.is(NaN, NaN) //true
Proxy
const person={name:'heisehuoyan',age:18}const personProxy = new Proxy(person, {get(target, key) {return target[key] ? target[key] : 'default'},set(target, key, value) {target[key] = value % 2 ? value : 99}})
var obj = {test:"hello"}//对象已有的属性添加特性描述Object.defineProperty(obj,"test",{configurable:true | false,enumerable:true | false,value:任意类型的值,writable:true | false});//对象新添加的属性的特性描述Object.defineProperty(obj,"newKey",{configurable:true | false,enumerable:true | false,value:任意类型的值,writable:true | false});
Object.defineProperty:
兼容性好,而Proxy 是新出的 API,兼容性还不够好,不支持 IE 全系列。
- 拦截方式少,Proxy 提供了13种拦截方法,包括拦截 constructor、apply、deleteProperty 等等,而 Object.defineProperty 只有 get 和 set
不能一次性监听对象所有属性,需要通过递归和遍历来实现;但是proxy一次性监听
let person = {name: "marry",age: 22}/* Proxy 一次性监听整个对象*/newPerson = new Proxy(person, {get() {}set() {}})/* Object.defineProperty */Object.keys(person).forEach(key => {Object.defineProperty(person, key, {set() {},get() {}})})
无法监听对象新增的属性,需要手动再去做一次监听,在vue中一般用vue.set(person,’newkey’,’我是新加的属性’),但proxy可以
let girl = {name: "marry",age: 22}/* Proxy 监听整个对象*/girl = new Proxy(girl, {get() {}set() {}})/* Object.defineProperty */Object.keys(girl).forEach(key => {Object.defineProperty(girl, key, {set() {},get() {}})});/* Proxy 生效,Object.defineProperty 不生效 */girl.hobby = "game";
无法响应push、pop、shift等数组操作
Object.defineProperty 可以监听数组的变化,Object.defineProperty 无法对 push、shift、pop、unshift 等方法进行响应
const arr = [1, 2, 3];/* Proxy 监听数组*/arr = new Proxy(arr, {get() {},set() {}})/* Object.defineProperty */arr.forEach((item, index) => {Object.defineProperty(arr, `${index}`, {set() {},get() {}})})arr[0] = 10; // 都生效arr[3] = 10; // 只有 Proxy 生效arr.push(10); // 只有 Proxy 生效
let arr = []let arrProperty = new Proxy(arr, {set (target, key, value) {console.log(target, key, value) //[1] "length" 1target[key] = valuereturn true}})arrProperty.push(1)console.log(arrProperty) //[1]
Reflect 封装操作对象的统一API
在之前的es5中,操作对象有很多种方式
const obj = {name: '111',age: '22'}// 判断对象某个属性是否存在console.log('name' in obj)// 删除某个属性console.log(delete obj['name'])// 获取对象keyconsole.log(Object.keys(obj))
对于不同的操作行为,使用的方式却不同,Reflect的目的是使用同一套方式去操作对象
const obj = {name: '111',age: '22'}// 判断对象某个属性是否存在console.log(Reflect.has(obj,'name'))// 删除某个属性console.log(Reflect.deleteProperty(obj, 'name'))// 获取对象keyconsole.log(Reflect.ownKeys(obj))
