Skip to content
On this page

TIP

这是一个提示

参考: [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

返回值

被传递给函数的对象。

示例

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

Released under the MIT License.