字符串扩展的方法
- 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)//false
Object.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" 1
target[key] = value
return 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'])
// 获取对象key
console.log(Object.keys(obj))
对于不同的操作行为,使用的方式却不同,Reflect的目的是使用同一套方式去操作对象
const obj = {
name: '111',
age: '22'
}
// 判断对象某个属性是否存在
console.log(Reflect.has(obj,'name'))
// 删除某个属性
console.log(Reflect.deleteProperty(obj, 'name'))
// 获取对象key
console.log(Reflect.ownKeys(obj))