zoukankan      html  css  js  c++  java
  • Javascript Object 常用方法大全

    Javascript Object 常用方法大全

    Object.assign:

    将所有可枚举属性的值从一个或多个对象复制到目标对象,并返回目标对象

    const obj1 = { a: 1, b: 3}
    const obj2 = { a: 5, c: 6}
    const obj3 = Object.assign(obj1, obj2)
    
    console.log(obj1) // { a: 5, b: 3, c: 6}
    console.log(obj2) // { a: 5, c: 6}
    console.log(obj3) // { a: 5, b: 3, c: 6}
    const obj1 = { a: 1, b: 3}
    const obj2 = { a: 5, c: 6}
    const obj3 = Object.assign({}, obj1, obj2)
    
    console.log(obj1) // { a: 1, b: 3}
    console.log(obj2) // { a: 5, c: 6}
    console.log(obj3) // { a: 5, b: 3, c: 6}
    
    

    Object.defineProperty

    定义或修改一个对象中的属性

    Object.defineProperties

    定义或修改一个对象中的多个属性

    Object.getOwnPropertyDescriptor

    获取一个对象中的一个属性描述

    Object.getOwnPropertyDescriptors

    获取一个对象中的所有属性描述

    /*
     * 数据属性
     * [[Configurable]]: 能否通过delete删除此属性,能否修改属性的特征
     * [[Enumerable]]: 该属性是否可枚举,即是否可通过for-in或Object.keys()返回属性
     * [[Writable]]: 能否修改属性的值
     * [[Value]]: 该属性的值,默认为undefined
     *
     * 访问器属性
     * [[Configurable]]、[[Enumerable]] 和数据属性一致
     * [[Get]]: 提供一个 getter 方法,访问对象属性时会调用该方法
     * [[Set]]: 提供一个 setter 方法,读取对象属性时会调用该方法
     */
    
    // defineProperty
    const obj = new Object()
    Object.defineProperty(obj, 'name', {
      configurable: false,
      writable: false,
      enumerable: true,
      value: '一个不能被修改的名字'
    })
    console.log(obj.name) // '一个不能被修改的名字'
    
    
    // defineProperties
    const obj2 = new Object()
    Object.defineProperties(obj2, {
      name: {
        writable: true,
        value: '张三'
      },
      Name: {
        get: function() {
          return `${this.name}先生`
        },
        set: function(value) {
          this.name = value || '未知'
        }
      }
    })
    console.log(obj2.name)  // 张三
    console.log(obj2.Name)  // 张三先生
    obj2.Name = ''
    console.log(obj2.name)  // 未知
    
    // getOwnPropertyDescriptor
    Object.getOwnPropertyDescriptor(obj2, 'name')  // ...
    Object.getOwnPropertyDescriptor(obj2)  // ...
    Object.entries: 返回一个对象自身可枚举属性的键值对,顺序与for-in循环时的顺序一致
    const obj = { foo: 'bar', baz: 42 }
    Object.entries(obj) // [["foo", "bar"],["baz", 42]]
    Object.freeze: 冻结一个对象(只有一层),不能修改任何信息,包括新增属性、删除属性、修改属性值
    Object.isFrozen: 判断一个对象是否已经被冻结
    const obj = {
      a: 1,
      b: {
        c: 2
      }
    }
    console.log(obj.a)    // 1
    console.log(obj.b.c)  // 2
    
    obj.a = 3
    obj.b.c = 4
    console.log(obj.a)    // 3
    console.log(obj.b.c)  // 4
    
    Object.isFrozen(obj)  // false
    Object.freeze(obj)
    Object.isFrozen(obj)  // true
    obj.a = 5
    obj.b.c = 6
    console.log(obj.a)    // 3
    console.log(obj.b.c)  // 6
    

    Object.keys

    获取一个对象中所有的key值(不包括不可枚举属性和Symbol属性)

    Object.values

    获取一个对象中所有的value值(不包括不可枚举属性和Symbol属性)

    const obj = {}
    Object.defineProperty(obj, 'a', {Enumerable: false, value: 1})
    obj[Symbol()] = 2
    obj['b'] = 3
    
    console.log(Object.keys(obj)) // ['b']
    console.log(Object.values(obj)) // ['3']
    console.log(Object.getOwnPropertyNames(obj)) // ['a', 'b']
    console.log(Object.getOwnPropertySymbols(obj)) // [Symbol()]
    

    Object.getOwnPropertyNames

    获取一个对象所有属性的key值(包括不可枚举属性,不包括Symbol属性)

    const obj = {
      foo: 'bar',
      baz: 43
    }
    Object.getOwnPropertyNames(obj) // ['foo', 'baz']
    Object.getOwnPropertySymbols: 获取一个对象所有Symbol属性
    const obj = {}
    obj[Symbol('a')] = 'localSymbol'
    obj[Symbol.for('b')] = 'globalSymbol'
    Object.getOwnPropertySymbols(obj) // [Symbol(a), Symbol(b)]
    拓展:Symbol是为了保证对象属性的一致性
    const sy = Symbol('a')
    const obj = {}
    obj[Symbol('a')] = 3  // {Symbol(a): 3}
    obj[sy] = 4  // {Symbol(a): 3, Symbol(a): 4}
    
    console.log(obj[Symbol('a')]) // undefined
    console.log(obj[sy])  // 4
    
    

    Object.preventExtensions

    使一个对象不再具有拓展性(不能添加新属性)

    Object.isExtensible

    判断一个对象是否具有拓展性

    const obj = {v1: 1} // {v1:1}
    obj.v2 = 2  // {v1:1, v2:2}
    Object.preventExtensions(obj)
    obj.v3 = 3  // {v1:1, v2:2}
    obj.v2 = 3  // {v1:1, v2:3}
    Object.isExtensible(obj)  // false
    

    hasOwnProperty

    判断一个对象是否包含某个属性(不包括原型链上的属性)

    const obj = { a: 2 }
    obj.hasOwnProperty('a') // true
    obj.hasOwnProperty('b') //false
    isPrototypeOf: 判断一个对象是否在某个对象的原型链上
    function fn() {}
    _fn1 = new fn() // fn {}
    _fn2 = fn()     // undefined
    console.log(fn.isPrototypeOf(_fn1)) // false
    console.log(fn.prototype.isPrototypeOf(_fn1)) // true
    console.log(fn.prototype.isPrototypeOf(_fn2)) // false
    console.log(Object.prototype.isPrototypeOf(_fn1)) // true
    console.log(Object.prototype.isPrototypeOf(_fn2)) // false
    
  • 相关阅读:
    POJ3783Balls[DP 最坏情况最优解]
    openjudge2989糖果[DP 01背包可行性]
    POJ1160 Post Office[序列DP]
    石子合并[DP-N3]
    POJ1065Wooden Sticks[DP LIS]
    POJ3636Nested Dolls[DP LIS]
    LCIS(最长公共上升子序列)Vijos1264神秘的咒语
    Vijos1680距离/openjudge2988计算字符串的距离[DP]
    Vijos1392拼拼图的小衫[背包DP|二维信息DP]
    NOIP2000方格取数[DP]
  • 原文地址:https://www.cnblogs.com/justyouadmin/p/12205559.html
Copyright © 2011-2022 走看看