美文网首页
对象遍历

对象遍历

作者: zhang463291046 | 来源:发表于2021-02-03 00:21 被阅读0次

    遍历规则

    let obj = { b: 0, 10: 0, 2: 0, a: 0 };
    let keys = Object.keys(obj);
    console.log(keys);
    

    执行结果


    image.png

    属性遍历的次序规则:

    1.首先遍历所有数值键,按照数值升序排列。
    2.其次遍历所有字符串键,按照加入时间升序排列。
    3.最后遍历所有 Symbol 键,按照加入时间升序排列。

    问题:以下创建对象方式,有什么区别?

        let obj = {};
        let createObj = Object.create({});
        let createNull = Object.create(null);
        console.log(obj);
        console.log(createObj);
        console.log(createNull);
    

    执行结果


    image.png

    思考:你们怎么理解空对象的,那么怎么判断一个空对象{}?

    方式一:想想是否有问题?
        let obj = {};
        let result = true;
        for (let key in obj) {
          result = false;
        }
        console.log(result);
    
    方式二:想想是否有问题?
        let obj = {};
        Object.keys(obj).length === 0
    
    方式三:想想是否有问题?
        let obj = {};
        JSON.stringify(obj) === '{}'
    

    构建对象B

    方式一:

        let A = {
          nameA: "张三",
          ageA: 30,
          [Symbol("A")]: "A",
        };
        let B = Object.create(A, {
          nameB: { value: "李四", enumerable: true },
          ageB: { value: 20 },
          [Symbol("B")]: { value: "B", enumerable: true }
        });
        console.log("A", A);
        console.log("B", B);
    

    问题:请采用一个其他方式构建结构对象B?

    方式二:

        let A = {
          nameA: "张三",
          ageA: 30,
          [Symbol("A")]: "A",
        };
        let B = {
          nameB: "李四",
          ageB: 20,
          [Symbol("B")]: "B",
        };
        Object.defineProperty(B, "nameB", {
          enumerable: false,
        });
        Object.setPrototypeOf(B, A);
        //B.__proto__ = A;
        console.log("A", A);
        console.log("B", B);
    

    五种遍历方式

    for...in

        for(let key in B){
          console.log(key, B[key]);
        }
    

    执行结果


    image.png

    Object.keys()

        let keys = Object.keys(B);
        console.log(keys);
    

    执行结果


    image.png

    Object.getOwnPropertyNames()

        let ownNames = Object.getOwnPropertyNames(B);
        console.log(ownNames);
    

    执行结果


    image.png

    问题:Object.getOwnPropertyNames()只能入参对象吗?那数组呢?

        let arr = [1, 2, 3, 4];
        let names = Object.getOwnPropertyNames(arr);
        console.log(names);
    

    执行结果


    image.png

    Object.getOwnPropertySymbols()

        let ownSymbols = Object.getOwnPropertySymbols(B);
        console.log(ownSymbols);
    

    执行结果


    image.png

    Reflect.ownKeys()

        let ownKeys = Reflect.ownKeys(B);
        console.log(ownKeys);
    

    执行结果


    image.png

    结论总结:

    (1)for...in:循环遍历对象自身的和继承的可枚举属性(不含 Symbol 属性)。
    (2)Object.keys():返回一个数组,包括对象自身的(不含继承的)所有可枚举属性(不含 Symbol 属性)的键名。
    (3)Object.getOwnPropertyNames():返回一个数组,包含对象自身的所有属性(不含 Symbol 属性,但是包括不可枚举属性)的键名。
    (4)Object.getOwnPropertySymbols():返回一个数组,包含对象自身的所有 Symbol 属性的键名。
    (5)Reflect.ownKeys():返回一个数组,包含对象自身的(不含继承的)所有键名,不管键名是 Symbol 或字符串,也不管是否可枚举。

    课外思考:怎么通过prototype知道哪些是实例方法,哪些是静态方法?

    相关文章

      网友评论

          本文标题:对象遍历

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