跳至主要內容

Object

Yang大约 12 分钟

【MDN文档】open in new window


在JavaScript中,几乎所有的对象都是Object类型的实例,它们都会从Objet.prototype继承属性和方法。Object 构造函数为给定值创建一个对象包装器,当以非构造函数形式被调用时,Object 的行为等同于 new Object()

  • Object 构造函数,会根据给定的参数创建对象
    • 如果给定值是 nullundefined,将会创建并返回一个空对象
    • 如果传进去的是一个基本类型的值,则会构造其包装类型的对象
    • 如果传进去的是引用类型的值,仍然会返回这个值,经他们复制的变量保有和源对象相同的引用地址

Object.create()open in new window

  • 描述:创建一个新对象,使用现有的对象来提供新创建的对象的 __proto__
  • 语法:Object.create(proto[, propertiesObject])
  • 参数
    • proto:新创建对象的原型对象
    • propertiesObject:如果没有指定为 undefined,则是要添加到新创建对象的不可枚举(默认)属性(即其自身定义的属性,而不是其原型链上的枚举属性)对象的属性描述符以及相应的属性名称。这些属性对应Object.defineProperties()的第二个参数。
  • 返回值:一个新对象,带着指定的原型对象和属性
  • 注意
    • 如果propertiesObject参数是 null 或非原始包装对象,则抛出一个 TypeError 异常

Object.assign()open in new window

  • 描述:用于将所有可枚举属性的值从一个或多个源对象复制到目标对象

  • 语法:Object.assign(target, ...sources)

  • 参数

    • target:目标对象
    • sources:源对象
  • 返回值:目标对象

  • 注意

    • 如果目标对象中的属性具有相同的键,则属性将被源对象中的属性覆盖
    • 后面的源对象的属性将类似地覆盖前面的源对象的属性
    • 只会拷贝源对象自身的并且可枚举的属性到目标对象(浅拷贝

Object.defineProperty()open in new window

  • 描述:直接在一个对象上定义一个新属性,或者修改一个对象的现有属性,并返回此对象
  • 语法:Object.defineProperty(obj, prop, descriptor)
  • 参数
    • obj:在其上定义或修改属性的对象
    • props:要定义或修改的属性的名称或 Symbol
    • descriptor:要定义或修改的属性描述符
      • 共享
        • configurable:当且仅当该属性的 configurable 键值为 true 时,该属性的描述符才能够被改变,同时该属性也能从对应的对象上被删除 默认为 false
        • enumerable:当且仅当该属性的 enumerable 键值为 true 时,该属性才会出现在对象的枚举属性中 默认为 false
      • 数据描述符(数据属性)
        • value:该属性对应的值。可以是任何有效的 JavaScript 值(数值,对象,函数等)默认为 undefined
        • writable:当且仅当该属性的 writable 键值为 true 时,属性的值,也就是上面的 value,才能被赋值运算符改变 默认为 false
      • 存取描述符(访问器属性)
        • get:属性的 getter 函数
          • 如果没有 getter,则为 undefined。当访问该属性时,会调用此函数。
          • 执行时不传入任何参数,但是会传入 this 对象(由于继承关系,这里的this并不一定是定义该属性的对象)。该函数的返回值会被用作属性的值 默认为 undefined
        • set:属性的 setter 函数
          • 如果没有 setter,则为 undefined。当属性值被修改时,会调用此函数
          • 该方法接受一个参数(也就是被赋予的新值),会传入赋值时的 this 对象。
            默认为 undefined
  • 返回值:被传递给函数的对象

Object.defineProperties()open in new window

  • 描述:直接在一个对象上定义新的属性或修改现有属性,并返回该对象
  • 语法:Object.defineProperties(obj, props)
  • 参数
    • obj:在其上定义或修改属性的对象
    • props:源要定义其可枚举属性或修改的属性描述符的对象,参阅上方 Object.defineProperty()
  • 返回值:传递给函数的对象

Object.getOwnPropertyDescriptor()open in new window

  • 描述:返回指定对象上一个自有属性对应的属性描述符。(自有属性指的是直接赋予该对象的属性,不需要从原型链上进行查找的属性)
  • 语法:Object.getOwnPropertyDescriptor(obj, prop)
  • 参数
    • obj:需要查找的目标对象
    • props:目标对象内属性名称
  • 返回值:如果指定的属性存在于对象上,则返回其属性描述符对象,否则返回 undefined。

Object.getOwnPropertyDescriptors()open in new window

  • 描述:获取一个对象的所有自身属性的描述符
  • 语法:Object.getOwnPropertyDescriptors(obj)
  • 参数
    • obj:需要查找的目标对象
  • 返回值:所指定对象的所有自身属性的描述符,如果没有任何自身属性,则返回空对象

Object.getOwnPropertyNames()open in new window

  • 描述:返回一个由指定对象的所有自身属性的属性名(包括不可枚举属性但不包括Symbol值作为名称的属性)组成的数组
  • 语法:Object.getOwnPropertyNames(obj)
  • 参数
    • obj:一个对象,其自身的可枚举和不可枚举属性的名称被返回
  • 返回值:在给定对象上找到的自身属性对应的字符串数组

Object.getOwnPropertySymbols()open in new window

  • 描述:返回一个给定对象自身的所有 Symbol 属性的数组
  • 语法:Object.getOwnPropertySymbols(obj)
  • 参数
    • obj:要返回 Symbol 属性的对象
  • 返回值:在给定对象自身上找到的所有 Symbol 属性的数组

Object.getPrototypeOf()open in new window

  • 描述:返回指定对象的原型(内部 [[Prototype]] 属性的值)
  • 语法:Object.getPrototypeOf(object)
  • 参数
    • obj:要返回其原型的对象
  • 返回值:给定对象的原型。如果没有继承属性,则返回 null

Object.entries()open in new window

  • 描述:返回一个给定对象自身可枚举属性的键值对数组,其排列与使用 for...in 循环遍历该对象时返回的顺序一致(区别在于 for-in 循环还会枚举原型链中的属性)
  • 语法:Object.entries(obj)
  • 参数
    • obj:可以返回其可枚举属性的键值对的对象
  • 返回值:给定对象自身可枚举属性的键值对数组,若没有这返回空数组

Object.keys()open in new window

  • 描述:返回一个由一个给定对象的自身可枚举属性组成的数组,数组中属性名的排列顺序和正常循环遍历该对象时返回的顺序一致
  • 语法:Object.keys(obj)
  • 参数
    • obj:要返回其枚举自身属性的对象
  • 返回值:一个表示给定对象的所有可枚举属性的字符串数组

Object.values()open in new window

  • 描述:返回一个给定对象自身的所有可枚举属性值的数组,值的顺序与使用for...in循环的顺序相同 ( 区别在于 for-in 循环枚举原型链中的属性 )
  • 语法:Object.values(obj)
  • 参数
    • obj:要返回其枚举自身属性的对象
  • 返回值:一个表示给定对象的所有可枚举属性的字符串数组

Object.fromEntries()open in new window

  • 描述:把键值对列表转换为一个对象
  • 语法:Object.fromEntries(iterable)
  • 参数
    • iterable:类似 Array 、 Map 或者其它实现了可迭代协议的可迭代对象
  • 返回值:一个由该迭代对象条目提供对应属性的新对象

Object.is()open in new window

  • 描述:判断两个值是否为同一个值

    • 都是 undefined
    • 都是 null
    • 都是 true 或 false
    • 都是相同长度的字符串且相同字符按相同顺序排列
    • 都是相同对象(意味着每个对象有同一个引用)
    • 都是数字且
      • 都是 +0
      • 都是 -0
      • 都是 NaN
      • 或都是非零而且非 NaN 且为同一个值
  • 语法:Object.is(value1, value2)

  • 参数

    • value1:被比较的第一个值
    • value2:被比较的第二个值
  • 返回值:一个 Boolean 类型标示两个参数是否是同一个值

  • 注意

    • 与== 运算不同。 == 运算符在判断相等前对两边的变量(如果它们不是同一类型) 进行强制转换 (这种行为的结果会将 "" == false 判断为 true), 而 Object.is不会强制转换两边的值
    • 与=== 运算也不相同。 === 运算符 (也包括 == 运算符) 将数字 -0 和 +0 视为相等 ,而将Number.NaN 与NaN视为不相等

Object.preventExtensions()open in new window

  • 描述:让一个对象变的不可扩展,也就是永远不能再添加新的属性
  • 语法:Object.preventExtensions(obj)
  • 参数
    • obj:将要变得不可扩展的对象
  • 返回值:已经不可扩展的对象
  • 注意
    • 不可扩展对象的属性可能仍然可被删除。尝试将新属性添加到不可扩展对象将静默失败或抛出TypeError
    • 仅阻止添加自身的属性。但其对象类型的原型依然可以添加新的属性
    • 一旦将对象变为不可扩展的对象,就再也不能使其可扩展

Object.isExtensible()open in new window

  • 描述:判断一个对象是否是可扩展的(是否可以在它上面添加新的属性)
  • 语法:Object.isExtensible(obj)
  • 参数
    • obj:需要检测的对象
  • 返回值:表示给定对象是否可扩展的一个Boolean
  • 注意:Object.preventExtensionsObject.sealObject.freeze 方法都可以标记一个对象为不可扩展

Object.freeze()open in new window

  • 描述:冻结一个对象
    • 不能向这个对象添加新的属性
    • 不能删除已有属性
    • 不能修改该对象已有属性的可枚举性、可配置性、可写性,以及不能修改已有属性的值
    • 冻结一个对象后该对象的原型也不能被修改
    • 如果一个属性的值是个对象,则这个对象中的属性是可以修改的,除非它也是个冻结对象
    • 数组作为一种对象,被冻结,其元素不能被修改。没有数组元素可以被添加或移除
  • 语法:Object.freeze(obj)
  • 参数
    • obj:要被冻结的对象
  • 返回值:返回传递的对象,而不是创建一个被冻结的副本

Object.isFrozen()open in new window

  • 描述:判断一个对象是否被冻结
  • 语法:Object.isFrozen(obj)
  • 参数
    • obj:需要检测的对象
  • 返回值:表示给定对象是否被冻结的Boolean
  • 注意:一个对象是冻结的是指它不可扩展,所有属性都是不可配置的,且所有数据属性(即没有getter或setter组件的访问器的属性)都是不可写的

Object.seal()open in new window

  • 描述:封闭一个对象,阻止添加新属性并将所有现有属性标记为不可配置。当前属性的值只要原来是可写的就可以改变
  • 语法:Object.seal(obj)
  • 参数
    • obj:将要被密封的对
  • 返回值:如果这个对象是密封的,则返回 true,否则返回 false
  • 注意:密封对象是指那些不可 扩展 的,且所有自身属性都不可配置且因此不可删除(但不一定是不可写)的对象

Object.isSealed()open in new window

  • 描述:判断一个对象是否被密封
  • 语法:Object.isSealed(obj)
  • 参数
    • obj:需要检测的对象的引用
  • 返回值:被密封的对象
  • 注意
    • 密封一个对象会让这个对象变的不能添加新属性,且所有已有属性会变的不可配置
    • 属性不可配置的效果就是属性变的不可删除,以及一个数据属性不能被重新定义成为访问器属性,或者反之。但属性的值仍然可以修改
    • 尝试删除一个密封对象的属性或者将某个密封对象的属性从数据属性转换成访问器属性,结果会静默失败或抛出TypeError
    • 不会影响从原型链上继承的属性。但__proto__()属性的值也会不能修改

Object.prototype.hasOwnProperty()open in new window

  • 描述:会返回一个布尔值,指示对象自身属性中是否具有指定的属性(也就是,是否有指定的键)
  • 语法:obj.hasOwnProperty(prop)
  • 参数
    • prop:要检测的属性的 String 字符串形式表示的名称,或者 Symbol
  • 返回值:用来判断某个对象是否含有指定的属性的布尔值 Boolean
  • 注意
    • 和 in 运算符不同,该方法会忽略掉那些从原型链上继承到的属性
    • 即使属性的值是 nullundefined,只要属性存在,hasOwnProperty 依旧会返回 true

Object.prototype.isPrototypeOf()open in new window

  • 描述:测试一个对象是否存在于另一个对象的原型链上
  • 语法:prototypeObj.isPrototypeOf(object)
  • 参数
    • object:在该对象的原型链上搜寻
  • 返回值:Boolean,表示调用对象是否在另一个对象的原型链上
  • 注意:如果 prototypeObj 为 undefined 或 null,会抛出 TypeError

Object.prototype.propertyIsEnumerable()open in new window

  • 描述:返回一个布尔值,表示指定的属性是否可枚举
  • 语法:obj.propertyIsEnumerable(prop)
  • 参数
    • prop:需要测试的属性名
  • 返回值:用来表示指定的属性名是否可枚举的布尔值
  • 注意
    • 如果 prototypeObj 为 undefined 或 null,会抛出 TypeError
    • 此方法可以确定对象中指定的属性是否可以被 for...in 循环枚举,但是通过原型链继承的属性除外。如果对象没有指定的属性,则此方法返回 false。

Object.prototype.toString()open in new window

  • 描述:返回一个表示该对象的字符串
    • 每个对象都有一个 toString() 方法,当该对象被表示为一个文本值时,或者一个对象以预期的字符串方式引用时自动调用
    • 默认情况下,toString() 方法被每个 Object 对象继承
    • 如果此方法在自定义对象中未被覆盖,toString() 返回 "[object type]",其中 type 是对象的类型
  • 语法:obj.toString()
  • 返回值:一个表示该对象的字符串
上次编辑于:
贡献者: sunzhenyang