对象扩展
简写
const name = 'zhangsan'
const age = 18
const s = 'school'
const obj = {
name, // 属性简写
[s]: '清华', // 变量key - school: '清华大学',
getName() { // 函数简写
return this.name
}
}
静态方法
Object.is
:和 === 相似,属于严格相等,但有一些区别:
console.log(Object.is(NaN, NaN)) // true
console.log(NaN === NaN) // false
console.log(Object.is(+0, -0)) // false
console.log(+0 === -0) // true
Object.assign
:合并,属于浅拷贝,后者覆盖前者相同属性
Object.assign({}, obj1, obj2, obj3, obj4)
in
: 判断对象是否存在某个属性,数组是判断下标是否有值
console.log(3 in [1, 2, 3]) // false
keys
以数组形式返回键值对(可枚举)getOwnPropertyNames
功能和 Object.keys 一样,但不可枚举的对象依然可以
const obj = {
name: 'zhangsan',
age: 18
}
Object.defineProperty(obj, 'name', {
enumerable: false
})
console.log(Object.getOwnPropertyNames(obj)) // ['name', 'age']
console.log(Object.keys(obj)) // ['age']
- Object.values 以数组形式返回值(必须是可枚举的对象,即属性修饰符 enumerable 为 false)
- Object.entries:将对象形式转换为
[key,value]
二维数组形式的数据结构
const obj = {
name: 'zs'
}
console.log(Object.entries(obj)) // [ ['name', 'zs'] ['age', 18] ]
// [key, val] 相当于解构
for (let [key, val] of Object.entries(obj)) {}
- Object.fromEntries entries 类型或者Map类型数据结构转换成对象形式
const arr = [
['name', 'zhangsan'],
['age', '18']
]
const fromEntries = Object.fromEntries(arr) // { name: 'zhangsan', age: '18' }
const course = {
math: 80,
english: 85,
chinese: 90,
// ... 若干
}
const flatCourse = Object.entries(course)
const filterCourse = Object.fromEntries(
flatCourse.filter(([key, val], index) => {
return val > 80
})
)
console.log(filterCourse) // { english: 85, chinese: 90 }
Object.defineProperty
可在对象上定义一个新属性,或者修改一个对象的现有描述符
configurable
配置(可删除、可更改属性描述符、可读取值、可设置值)enumerable
枚举writable
更改值value
默认值- get 读取值
- set 设置值
Object.getOwnPropertyDescriptors(obj)
: 获取对象所有属性的描述符;Object.getOwnPropertyDescriptor(obj, props)
: 获取对象某个属性的描述符;Object.freeze
: 冻结 (本质 configurable、writable 为 false)、Object.isFrozen
:是否冻结Object.seal
:密封 (本质 configurable 为 false)、Object.isSealed
:是否密封
const obj = {}
Object.defineProperty(obj, 'name', {
value: 'zhangsan',
writable: true, // 更改
enumerable: true, // 枚举
configurable: true // 配置
})
const obj = {
name: 'zs'
}
function defineReactive(target, key, value) {
Object.defineProperty(target, key, {
get() {
return value
},
set(newVal) {
value = newVal + ' hello'
}
})
}
defineReactive(obj, 'name', obj.name)