美文网首页
【JS ES6】Object

【JS ES6】Object

作者: 大Q本Q | 来源:发表于2019-06-19 17:29 被阅读0次

    获取对象数值

    let obj = {k1:'v1',k2:'v2'}
    Object.keys(obj);   // 返回key数组:['k1','k2']
    Object.values(obj); // 返回value数组:['v1','v2']
    Object.entries(obj);// 返回key、value数组:[['k1','v1'],['k2','v2']]
    Object.fromEntries(); // entries的逆操作,数组转成对象
    

    判断是否相同

    Object.is(1,1); // true
    Object.is('a','a'); // true
    Object.is(NaN,Nan); // true
    
    
    Object.is({},{}); // false
    Object.is(-0,+0); // false
    
    

    获取对象长度

    Object.keys(Obj).length;
    

    Symbol

    // 新的数据类型,独一无二的值,自己和自己也不一样
    let s1 = Symbol('s')
    let s2 = Symbol('s')
    s1 != s2
    
    // 用于防止变量名冲突
    // 在别人的对象中,加入自己要的属性key,容易冲突
    let obj = {a:'aaa'}
    let key = Symbol('a')
    obj[key] = 'bbb'
    obj.a // 输出aaa
    obj[key] // 输出bbb
    
    // 示例:如果type不是Symbol类型,调用doIt时,容易误传rect
    let type = Symbol('rect')
    function doIt(_type){
        switch(_type){
            case type:break;
        }
    }
    doIt(type)
    
    `Symbol.for(), Symbol.keyFor`
    // 创建相同的Symbol值
    // symbol.for在创建时,会登记在全局供搜索;在创建前,先会搜索全局,若已存在,直接返回,否则新建
    let s1 = Symbol('s')
    let s2 = Symbol('s')
    s1 != s2
    
    let t1 = Symbol.for('t1')
    let t2 = Symbol.for('t1')
    t1 == t2
    
    // Symbol.keyFor返回已全局登记的key
    let s1 = Symbol.for('s')
    Symbol.keyFor(s1) // 返回: 's'
    
    
    `Object.getOwnPropertySymbols(obj)`
    // 获取obj中所有的symbol属性名
    /* 
        // 只获取Symbols属性名:
        Object.getOwnPropertySymbols(obj)
        
        可以获取所有类型属性名:
        Reflect.ownKeys(obj)
        
        无法获取symbol属性名:
        for in
        for of
        Object.keys
        Object.getOwnPropertyNames
        JSON.stringfy
     */ 
    
    
    `Object.getPrototypeOf(obj)`
    // 读取实例对象的原型prototype
    function PERSON = {name:'caiquan'}
    let man = new PERSON();
    
    Object.getPrototypeOf(man) // 等于 PERSON.prototype
    
    
    `Object.setPrototypeOf(obj1,obj2)`
    // 将原型prototype指向obj2
    
    // 示例一:
    let proto = {}
    let obj = {name:'caiquan'}
    Object.setPrototypeOf(obj,proto); // 将原型指向proto,所以proto属性改变,obj也会改变
    proto.age = 32;
    
    obj.name // 'caiquan'
    obj.age // 32
    
    
    // 示例二:将super指向其他对象,this不变
    const PERSON = {
        _sex:'default',
        sex(){return this._sex;}
    }
    const MAN = {
        _sex:'male',
        getSex(){ return super.sex();}  // super指向PERSON,但sex中的this依旧是MAN
    }
    Object.setPrototypeOf(MAN,PERSON)
    MAN.getSex(); // 输出:male
    
    
    `Object.create`
    /**
     创建原型是{age:32}的对象,用于继承
     {
        __proto__:{
            age:32
        }
     }
     */
    Object.create({age:32}); 
    
    Object.assign(); // 合并对象
    Object.getOwnPropertyDescriptors();  // 获取对象属性的描述
    
    
    
    `属性是否存在`
    
    // 1. 无法区分自身和原型链上的属性
    'name' in test       //true
    
    // 2. 只判断自身属性的场景。
    test.hasOwnProperty('name')//true   自身属性
    
    // 3. 
    // 创建对象
    let test = {name : 'lei'} // 获取对象的自身的属性
    test.name            //"lei"
    test["name"]         //"lei"
    
    // 获取不存在的属性
    test.age             //undefined
    
    // 获取原型上的属性
    test["toString"]     //toString() { [native code] }
    
    // 新增一个值为undefined的属性
    test.un = undefined
    
    test.un              //undefined    不能用在属性值存在,但可能为 undefined的场景
    

    相关文章

      网友评论

          本文标题:【JS ES6】Object

          本文链接:https://www.haomeiwen.com/subject/zxtlqctx.html