TIP
这是一个提示
- https://www.runoob.com/js/js-objects.html
- https://es6.ruanyifeng.com/#docs/object#属性的简洁表示法
- https://zhuanlan.zhihu.com/p/556955018
参考: [https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object]
Object
是JavaScript的一种数据类型。它用于存储各种键值集合和更复杂的实体。Objects可以通过Object()构造函数或者使用对象字面量的方式创建。
构造函数
属性
方法
Object.defineProperty()
该方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性,并返回此对象。
备注: 应当直接在
Object构造器对象上调用此方法,而不是在任意一个Object类型的实例上调用。
语法
js
Object.defineProperty(obj, prop, descriptor)
参数
- obj: 要定义属性的对象。
- prop: 要定义或修改的属性的名称或 Symbol
- descriptor: 要定义或修改的属性描述符。
- configurable: 当且仅当该属性的
configurable键值为true时,该属性的描述符才能够被改变,同时该属性也能从对应的对象上被删除。默认值false。 - enumerable: 当且仅当该属性的
enumerable键值为true时,该属性才会出现在对象的枚举属性中。默认为false。 - value: 该属性对应的值。可以是任何有效的JavaScript值(数值,对象,函数等)。默认为
undefined。 - writable: 当且仅当该属性的
writable键值为true时,属性的值,也就是上面的value,才能被赋值运算符 (en-US)改变。默认为false。 - get: 属性的
getter函数,如果没有getter,则为undefined。当访问该属性时,会调用此函数。执行时不传入任何参数,但是会传入this对象(由于继承关系,这里的this并不一定是定义该属性的对象)。该函数的返回值会被用作属性的值。默认为undefined。 - set: 属性的
setter函数,如果没有setter,则为undefined。当属性值被修改时,会调用此函数。该方法接受一个参数(也就是被赋予的新值),会传入赋值时的this对象。 默认为undefined。
- configurable: 当且仅当该属性的
返回值
被传递给函数的对象。
示例
writable示例
js
var o = {}
Object.defineProperty(o, 'name', {
writable: false,
value: '张三'
})
console.log(o) // {name: '张三'}
o.name = '李四' // 不会报错,严格模式会报错:Uncaught TypeError: Cannot assign to read only property 'name' of object
console.log(o) // {name: '张三'}
enumerable示例
js
var o = {};
Object.defineProperty(o, "a", { value : 1, enumerable: true });
Object.defineProperty(o, "b", { value : 2, enumerable: false });
for (let key in o) {
console.log(key) // a
}
console.log(Object.keys(o)) // ['a']
console.log(Object.getOwnPropertyNames(o)) // ['a', 'b']
Configurable示例
js
var obj = {};
Object.defineProperty(obj, 'name', {
value : '张三',
configurable: false
})
// 测试更新配置 configurable
Object.defineProperty(obj, 'name', {
configurable: true // Uncaught TypeError: Cannot redefine property: name
})
// 测试更新配置 enumerable
Object.defineProperty(obj, 'name', {
enumerable: true // Uncaught TypeError: Cannot redefine property: name
})
// 测试更新配置 value
Object.defineProperty(obj, 'name', {
value: '李四' // Uncaught TypeError: Cannot redefine property: name
})
// 测试更新配置 set
Object.defineProperty(obj, 'name', {
set: () => { // Uncaught TypeError: Cannot redefine property: name
}
})
// 测试更新配置 get
Object.defineProperty(obj, 'name', {
get: () => { // Uncaught TypeError: Cannot redefine property: name
return '李四'
}
})
// 测试删除
console.log(obj.name); // 张三
delete obj.name // 正常模式不会报错,严格模式会报错Uncaught TypeError: Cannot delete property 'name'
console.log(obj.name); // 张三
getter/setter示例
js
var obj = {};
let val = '张三'
Object.defineProperty(obj, 'name', {
enumerable: true,
configurable: true,
get () {
console.log('name属性被读取')
return val
},
set (newVal) {
console.log('name属性被修改')
val = newVal
}
})
console.log(obj.name) // name属性被读取 张三
obj.name = '李四' // name属性被修改
console.log(obj.name) // name属性被读取 李四
Object.defineProperties()
Object.assign()
Object.create()
Object.freeze()
Object.keys()
Object.values()
Object.entries()
Object.getPrototypeOf()
Object.setPrototypeOf()
Object.getOwnPropertyNames()
Object.hasOwn()
Object.fromEntries()
Object.preventExtensions()
Object.seal()
Object.is()
Object.is()方法判断两个值是否为同一个值。
- 语法js
Object.is(value1, value2); - 参数
- value1: 被比较的第一个值。
- value2: 被比较的第二个值。
- 返回值: 一个布尔值,表示两个参数是否是同一个值。
- 规则,只要满足一下任意条件则说明两个值相等
- 都是
undefined - 都是
null - 都是
true或都是false - 都是相同长度、相同字符、按相同顺序排列的字符串
- 都是相同对象(意味着都是同一个对象的值引用)
- 都是数字且
- 都是
+0 - 都是
-0 - 都是
NaN - 都是同一个值,非零且都不是
NaN
- 都是
- 都是
js
// Case 1: Evaluation result is the same as using ===
Object.is(25, 25); // true
Object.is('foo', 'foo'); // true
Object.is('foo', 'bar'); // false
Object.is(null, null); // true
Object.is(undefined, undefined); // true
Object.is(window, window); // true
Object.is([], []); // false
var foo = { a: 1 };
var bar = { a: 1 };
Object.is(foo, foo); // true
Object.is(foo, bar); // false
// Case 2: Signed zero
Object.is(0, -0); // false
Object.is(+0, -0); // false
Object.is(-0, -0); // true
Object.is(0n, -0n); // true
// Case 3: NaN
Object.is(NaN, 0/0); // true
Object.is(NaN, Number.NaN) // true
前端知识库