面试官:说说Object有哪些常用的静态方法?
Object有哪些常用的静态方法?
文章目录
前言
Object() 构造函数将输入转换为一个对象。它的行为取决于输入的类型。
一、Object.assign() 浅拷贝
用于复制一个对象
let obj = { name: '孙悟空', age: 520, address: '花果山' }
let newObj = {}
Object.assign(newObj, obj)
console.log(newObj === obj); // false
二、Object.defineProperty()
给对象添加单个属性,并指定该属性的配置属性
let obj = { name: '孙悟空' }
// 需要添加属性的属性值
let teacherName = '菩提老祖';
Object.defineProperty(obj, 'teacher', {
get: () => {
return teacherName
},
set: (val) => {
teacherName = val
},
// get和value/writable均不能混用,会有提示
configurable: true,
enumerable: true
})
Object.defineProperty(obj, 'student', {
value: '小猴子', // 与属性相关联的值
writable: false, // 是否可重写
configurable: false, // 是否可删除
enumerable: true //是否可枚举
})
obj.teacher = '唐僧' // 可改
obj.student = '我' // 不可改
console.log(obj)
// {"name": "孙悟空","teacher": "唐僧","student": "小猴子"}
三、Object.defineProperties()
可同时设置多个属性
let obj = { name: '孙悟空' }
Object.defineProperties(obj, {
name: {
value: 'Jake'
},
age: {
get: () => {
return this.value || 22
},
set: () => {
this.value = value
}
}
})
console.log(obj); // { "name": "Jake" } 此时age属性为不可枚举
四、Object.entries() /Object.fromEntries()
Object.entries() 转对象为二维数组
Object.fromEntries() 二维数组转对象
let obj = { name: '孙悟空', age: 520, address: '花果山' }
let newObj = Object.entries(obj)
console.log(newObj); // [['name','孙悟空'], ['age',520], ['address', '花果山']]
let oldObj = Object.fromEntries(newObj)
console.log(oldObj); // { name: '孙悟空', age: 520, address: '花果山' }
五、Object.freeze() 浅冻结/Object.isFrozen()
Object.freeze() 冻结对象,浅冻结只冻结第一层,冻结后对象不会添加get和set属性,实现双向绑定
Object.isFrozen()判断是否为冻结对象
let obj = { name: '孙悟空', age: 520, address: '花果山' }
let freeze = Object.freeze(obj)
obj.name = '嘻嘻'
console.log('freeze', obj); // {"name": "孙悟空","age": 520,"address": "花果山"}
let isFrozen = Object.isFrozen(obj)
console.log('isFrozen', isFrozen); // true
六、Object.hasOwn()
判断该对象是否有某个属性,返回值为true or false
let hasOwn = Object.hasOwn(obj, 'nini')
console.log('hasOwn', hasOwn);
//用for in 也可以进行判断的
七、Object.groupBy()
用某个属性进行分组,得到一个以属性分组的对象
MDN提示,这是一项实验性技术,在将其用于生产之前,请仔细检查浏览器兼容性表格
let peoples = [
{ name: '宝玉', age: 12 },
{ name: '黛玉', age: 11 },
{ name: '宝钗', age: 15 },
{ name: '香菱', age: 15 },
]
// 以年纪分组,对象属性值以升序排列
const peopleByAge = Object.groupBy(peoples, (person) => person.age);
console.log('peopleByAge', peopleByAge);
// {
// "11": [{"name": "黛玉","age": 11 }],
// "12": [{"name": "宝玉","age": 12 }],
// "15": [{"name": "宝钗","age": 15 },{"name": "香菱","age": 15 }]
// }
八、Object.keys()/Object.values
Object.keys() 获取对象的所有属性名的数组
Object.values()获取对象的所有属性值的数组
// 获取对象的所有属性名的数组
let obj = { name: '孙悟空', age: 520, address: '花果山' }
let newArr = Object.keys(obj)
console.log(newArr) // ['name', 'age', 'address']
// 获取对象的所有属性值的数组
let obj = { name: '孙悟空', age: 520, address: '花果山' }
let newArr = Object.values(obj)
console.log(newArr) // ['孙悟空', 520, '花果山']
做个记录,如有不足,欢迎指正。
积跬步,至千里。感谢前进路上的每个小困难,冲!!