• js Object 复习


    Object 对象
    1.1 Object 对象创建方式
    const obj = new Object() 
    const foo = {}
    
    1.2 Object.keys() ,Object.getOwnPropertyNames()
    //Object.keys方法的参数是一个对象,返回一个数组。该数组的成员都是该对象自身的(而不是继承的)所有属性名。
    //Object.getOwnPropertyNames方法与Object.keys类似,也是接受一个对象作为参数,返回一个数组,包含了该对象自身的所有属性名,还返回不可枚举的属性名(Symbol)
    const obj = {
        name: 'james',
        age: 22
    }
    console.log(Object.keys(obj)) // ['name', 'age']
    console.log(Object.getOwnPropertyNames(obj)) //['name', 'age']
    
    //以下代码结果大不相同
    const obj = {
            name: "james",
            age: 22,
          };
          Object.defineProperty(obj, "height", {
            configurable: true,
            value: 18,
            writable: true,
            enumerable: false
          })
          console.log(Object.keys(obj)) // ['name', 'age']
          console.log(Object.getOwnPropertyNames(obj)) // ['name', 'age', 'height']
    
    //获取对象属性值可以采用length
     console.log(Object.keys(obj).length) //2
    console.log(Object.getOwnPropertyNames(obj).length) //3
    
    1.3 Object.defineProperty()
    //通过描述对象,定义某个属性 (对象属性是否遍历 可以删除 能否赋值)
    //Object.defineProperty(对象, 对象属性key, 属性描述)
    const obj = {}
    Object.defineProperty(obj, "name", {
            configurable: true, //true 表示属性可以被删除  默认为false
            value: "james" ,//属性值  默认为undefined
            writable: true, //值是否可以被修改 默认为false
            enumerable: true, //是否可以遍历 枚举 默认false
          })
    
    1.4 Object.defineProperties()
    //通过描述对象,定义多个属性。
    const obj = {}
          Object.defineProperties(obj, {
            name: {
              configurable: true,
              value: "james",
              writable: true,
              enumerable: true
            },
            age: {
              configurable: true,
              value: 22,
              writable: true,
              enumerable: false
            }
          })
          console.log(obj)// {name: 'james', age: 22}
          console.log(Object.keys(obj)) //['name']
    
    1.5 Object.getOwnPropertyDescriptor()
    //获取对象某个属性的描述对象
    const obj = {
            name: "james",
            age: 22,
          };
        console.log(Object.getOwnPropertyDescriptor(obj, "name"))
    /*
    *{
        configurable: true
        enumerable: true
        value: "james"
        writable: true
    }
    */
    
    1.6 Object.getOwnPropertyDescriptors(obj)
    //方法用来获取一个对象的所有自身属性的描述符。 和 Object.defineProperties() 是不是刚好相反啊
    const obj = {
            name: "james",
            age: 22,
          };
    console.log(Object.getOwnPropertyDescriptors(obj))//自己打印看看吧
    
    
    2 控制对象状态的方法**
    2.1 Object.preventExtensions()
    //让一个对象变的不可扩展,也就是永远不能再添加新的属性。 其规则不可以增加新的属性,但是可以对原有属性进行重新赋值,删除
    const obj = {
              name: "james",
              age: 22
            }
     Object.preventExtensions(obj)
     obj.height = 1.98
     obj.sno = 0x100
    console.log(obj) //  {name: 'james', age: 22}
    
    //Object.preventExtensions()仅阻止添加自身的属性。但其对象类型的原型依然可以添加新的属性。
    obj.__proto__.height = 1.98
    console.log(obj.__proto__) //可自行打印
    
    2.2 Object.seal()
    //阻止添加新属性并将所有现有属性标记为不可配置。当前属性的值只要原来是可写的就可以改变
    //等于调用 Object.preventExtensions() ,之后将configurable设置为false
    //即: 不能增加新属性 不能删除属性 只能修改现有属性值
    
    const obj = {
              name: "james",
              age: 22
            }
            Object.seal(obj)
            obj.height = 1.98
            obj.sno = 0x100
            delete obj.name
            delete obj.age
            obj.name = "lilei"
            console.log(obj) //{name: 'lilei', age: 22}
    
    2.3 Object.freeze()
    //被冻结对象自身的所有属性都不可能以任何方式被修改 
    //等于调用 Object.preventExtensions() ,之后将configurable设置为false, writable设置为false
     const obj = {
              name: "james",
              age: 22
            }
    Object.freeze(obj)
    //改不了了
    
    2.4 Object.isFrozen()
    //判断一个对象是否被冻结
    const obj = {
              name: "james",
              age: 22
            }
    console.log(Object.isFrozen(obj)) //false
    console.log(Object.isFrozen(Object.preventExtensions({}))) //true
    //或者
    
    const o = {}
            Object.defineProperties(o, {
              name: {
                configurable: false, //必须的
                value: "james",
                writable: false, //必须的
                enumerable: true
              },
              age: {
                configurable: false, //必须的
                value: 28,
                writable: false, //必须的
                enumerable: true
              },
            })
            Object.preventExtensions(o) //必须的
            console.log(Object.isFrozen(o)) //true
    
    2.5 Object.isSealed()
    // 方法判断一个对象是否被密封。 如果这个对象是密封的,则返回 true,否则返回 false。密封对象是指那些不可 扩展 的,且所有自身属性都不可配置且因此不可删除(但不一定是不可写)的对象。
    //即: Object.preventExtensions()  和configurable为false
    const obj = {
              name: "james",
              age: 22
            }
     Object.preventExtensions(obj)
    console.log(Object.isSealed(obj)) //false
    Object.seal(obj)
    console.log(Object.isSealed(obj)) //true
    Object.freeze(obj)
     console.log(Object.isSealed(obj)) //true
    
    2.6 Object.isExtensible()
    // 判断一个对象是否是可扩展的(是否可以在它上面添加新的属性)
    // 新对象默认是可扩展的.
     const obj = {}
            Object.preventExtensions(obj)
            Object.seal(obj)
            Object.freeze(obj)
            console.log(Object.isExtensible(obj)) //false
    
    3.Object 的实例方法
    3.1 Object.prototype.valueOf()
    //回指定对象的原始值
    //引入MDN https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/valueOf
    
    // Object:返回对象本身
    var obj = {name: "张三", age: 18};
    console.log( obj.valueOf() === obj );   // true
    
    // Array:返回数组对象本身
    var array = ["ABC", true, 12, -5];
    console.log(array.valueOf() === array);   // true
    
    // Date:当前时间距1970年1月1日午夜的毫秒数
    var date = new Date(2013, 7, 18, 23, 11, 59, 230);
    console.log(date.valueOf());   // 1376838719230
    
    // Number:返回数字值
    var num =  15.26540;
    console.log(num.valueOf());   // 15.2654
    
    // 布尔:返回布尔值true或false
    var bool = true;
    console.log(bool.valueOf() === bool);   // true
    
    var obj = new Object();
    obj.valueOf = function () {
      return 2;
    };
    
    1 + obj // 3
    
    3.2 Object.prototype.toString()
    //MDN 
    每个对象都有一个 toString() 方法,当该对象被表示为一个文本值时,或者一个对象以预期的字符串方式引用时自动调用。默认情况下,toString() 方法被每个 Object 对象继承。如果此方法在自定义对象中未被覆盖,toString() 返回 "[object type]",其中 type 是对象的类型。以下代码说明了这一点:
    var o = new Object();
    o.toString(); // 返回 [object Object]
    //常用类型检查对象
    var toString = Object.prototype.toString;
    
    toString.call(new Date); // [object Date]
    toString.call(new String); // [object String]
    toString.call(Math); // [object Math]
    
    //Since JavaScript 1.8.5
    toString.call(undefined); // [object Undefined]
    toString.call(null); // [object Null]
    toString.call([]) // [object Array]
    
    //上面代码调用空对象的toString方法,结果返回一个字符串object Object,其中第二个Object表示该值的构造函数
    
    数值:返回[object Number]。
    字符串:返回[object String]。
    布尔值:返回[object Boolean]。
    undefined:返回[object Undefined]。
    null:返回[object Null]。
    数组:返回[object Array]。
    arguments 对象:返回[object Arguments]。
    函数:返回[object Function]。
    Error 对象:返回[object Error]。
    Date 对象:返回[object Date]。
    RegExp 对象:返回[object RegExp]。
    其他对象:返回[object Object]。
    
    3.3 Object.prototype.toLocaleString()
    //Object.prototype.toLocaleString方法与toString的返回结果相同,也是返回一个值的字符串形式。
    
    3.4 Object.prototype.hasOwnProperty()
    // 回一个布尔值,指示对象自身属性中是否具有指定的属性(也就是,是否有指定的键)
    //自身属性和继承属性的区别:
    const obj = {
          name: "james",
          age: 20
     }
     obj.__proto__.height = 1.98
     console.log(obj.hasOwnProperty("name")) //true
     console.log(obj.hasOwnProperty("height")) //false
    
    //例如
    var foo = {
      hasOwnProperty: function() {
        return false;
      },
      bar: 'Here be dragons'
    };
    
    foo.hasOwnProperty('bar'); // 始终返回 false 
    
    / 如果担心这种情况,
    // 可以直接使用原型链上真正的 hasOwnProperty 方法
    ({}).hasOwnProperty.call(foo, 'bar'); // true
    
    // 也可以使用 Object 原型上的 hasOwnProperty 属性
    Object.prototype.hasOwnProperty.call(foo, 'bar'); // true
    //MDN 链接https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/hasOwnProperty
    
    3.5 Object.values()
    //方法返回一个给定对象自身的所有可枚举属性值的数组,值的顺序与使用for...in循环的顺序相同 ( 区别在于 for-in 循环枚举原型链中的属性 )
    const obj = {
              name: "james",
              age: 20
            }
    obj.__proto__.height = 1.98
    console.log(Object.values(obj)) // ['james', 20]
    
    3.6 Object.entries()
    //返回一个数组,成员是参数对象自身的(不含继承的)所有可遍历(enumerable)属性的键值对数组
    //Symbol除外
    const s1 = Symbol("sym")
    const obj = {
      name: "james",
      age: 20,
      [s1]: "我是symbol"
     }
    obj.__proto__.height = 1.98
    console.log(Object.entries(obj)) //[ ["name", "james"], ["age", 20] ]
    
    //Object.entries方法的另一个用处是,将对象转为真正的Map结构。
    const map = new Map(Object.entries(obj))
    console.log(map) //  Map(2) {'name' => 'james', 'age' => 20}
    
    3.7 Object.fromEntries()
    //是Object.entries()的逆操作,用于将一个键值对数组转为对象。
    //该方法的主要目的,是将键值对的数据结构还原为对象,因此特别适合将 Map 结构转为对象。
    const obj = {
      name: "james",
      age: 20,
      [s1]: "我是symbol"
     }
    console.log( Object.fromEntries(Object.entries(obj)))
    console.log( Object.fromEntries(map))
    
    3.8 Object.assign()
    //用于对象的合并,将源对象(source)的所有可枚举属性,复制到目标对象(target)。 浅拷贝
    // 属性名为 Symbol 值的属性,也会被Object.assign()拷贝。
    // 只拷贝源对象的自身属性(不拷贝继承属性),也不拷贝不可枚举的属性(enumerable: false)
    // 同名属性的替换
    const s1 = Symbol("sym");
          const obj = {
            name: "james",
            age: 20,
            [s1]: "我是symbol",
          };
          obj.__proto__.height = 1.98;
    
          const foo = Object.assign(obj, { color: "red" },{ color: "blue"});
          console.log(foo);// {name: 'james', age: 20, color: 'blue', Symbol(sym): '我是symbol'}
    
    3.9 Object.is()
    //ES6 提出“Same-value equality”(同值相等)算法,用来解决这个问题。 
    // 判断两个值是否为同一个值。 对象和NaN 可以很好判断了
    console.log(Object.is(null, null)) //true
    console.log(Object.is({}, {})) //false
    
    const a = {}
    const b = Object.assign(a, {})
    console.log(Object.is(a, b)) //true
    console.log(Object.is(NaN, NaN)) //true
    
    3.10 Object.setPrototypeOf()
    // 用来设置一个对象的原型对象(prototype),返回参数对象本身
    const obj = {
            name: "james"
          }
    const foo = Object.setPrototypeOf({}, obj)
    console.log(foo.name) //james
    
    3.11 Object.getPrototypeOf()
    //用于读取一个对象的原型对象
    console.log(Object.getPrototypeOf(foo)) //{name: 'james'}
    
    3.12 Object.create()
    //创建一个新对象,使用现有的对象来提供新创建的对象的__proto__
    const obj = {
            name: "james"
          }
          const foo = Object.create(obj, {
            age: {
              configurable: true,
              value: 22,
              writable: true,
              enumerable: true
            }
          })
          console.log(foo) // {age: 22}
          console.log(foo.name) //james
    
    3.13 Object.prototype.isPrototypeOf()
    // 用来判断该对象是否为参数对象的原型
    const obj = {
            name: "james"
          }
          const foo = Object.create(obj, {
            age: {
              configurable: true,
              value: 22,
              writable: true,
              enumerable: true
            }
          })
    console.log(obj.isPrototypeOf(foo)) //true
    
    3.14 Object.getOwnPropertySymbols()
    // 方法返回一个给定对象自身的所有 Symbol 属性的数组
    const s1 = Symbol("s1")
          const obj = {
            name: "james",
            [s1]: "symbol"
          }
     console.log(Object.getOwnPropertySymbols(obj))// [Symbol(s1)]
     console.log(Object.getOwnPropertyNames(obj))//['name']
    
  • 相关阅读:
    MySQL-MMM方案
    MySQL双主复制
    MySQL主从复制
    Keepalived实现高可用
    CentOS7.2 部署Haproxy 1.7.2
    博客园写随笔时用数学公式
    Java中有三种移位运算符
    VS Code配置C/C++环境
    Visual Studio Code 如何编写运行 C、C++ 程序?
    头一次知道“原地算法”?!
  • 原文地址:https://www.cnblogs.com/doumian/p/16177002.html
Copyright © 2020-2023  润新知