美文网首页
循环和迭代

循环和迭代

作者: skoll | 来源:发表于2022-06-16 14:46 被阅读0次

如何遍历一个对象的所有属性

方法1 for in 循环对象的所有枚举属性,调用hasOwnProperty来忽略继承属性

let bus={
    name:"101"
}

for(var name in bus){
    if(bus.hasOwnProperty(name)){
        console.log('真正的属性',name)
    }else{
        console.log('继承的属性',name)     
    }
}

1 .for in :可枚举的实例属性,继承属性

方法2 Object.keys()

1 .可枚举的,实例属性,不含继承

方法3 lodash里面的forEach方法

image.png

1 .如果是对象,,他的所有值是通过Object.keys(Object(obj)).那感觉遍历对象的时候我们可以这样操作
2 .返回一个所有元素为字符串的数组,其元素来自于从给定的 object 上面可直接枚举的属性。这些属性的顺序与手动遍历该对象属性时的一致

方法4 Object.getOwnPropertyNames().这个其实不算

1 .返回一个数组,包含对象的所有实例属性名称,包括可枚举的和不可枚举的
2 .Object.getOwnPropertyNames(Math) 返回Math的所有属性

方法5 Reflect.ownKeys()

1 .

属性的总类-一个对象上面可能有这么多的属性

1 .自身可枚举的属性
2 .自身不可枚举的属性
3 .自身的symbol键
4 .继承的symbol键
5 .继承的可枚举属性
6 .继承的不可枚举属性

in for...in Object.keys
自身可枚举 true true true
自身不可枚举 true false false
自身的symbol true false false
继承的symbol true false false
继承的可枚举 true true fasle
继承的不可枚举 true false fasle

总结1

1 .in可以遍历出全部的属性,强啊
2 .for ..in (自身可枚举和继承可枚举)
3 .Object.keys():只有自身可枚举

hasOwnProperty Reflect.OwnKeys() Obj.getOwnPropertyNames
自身可枚举 true true true
自身不可枚举 true true true
自身的symbol true true false
继承的symbol false false false
继承的可枚举 false false fasle
继承的不可枚举 false false fasle

总结2

1 .hasOwnProperty自己的全都能看到,继承的全都看不到.注意他的关键词Own 和Reflect.Ownkeys()完全一致,Object.getOwnPropertyDescriptors 获取自己的全部属性.
2 .Obj.getOwnPropertyNames获取自己的,除了symbol
3 .Object.propertyIsEnumerable:只能获取自己除了可枚举的属性,也就是正常的和symbol

全部总结

1 .有own相关的,一律不能获取继承有关的
2 .那就是说,继承不继承的属性,其实只是和in for..in这俩有关系,其余剩下的都歇菜了

1 .in还是全部都可以
2 .for .. in 只能检查到继承的可枚举属性.

3 .也就是继承的不可枚举属性以及继承的Symbol无论怎么都看不到,上面所有的迭代方法.
4 .遍历对象所有的可枚举属性(自有的+继承的属性),使用 for...in
5 .遍历对象自有的所有可枚举属性(非继承属性),使用 Object.keys() 或 for...in + Objec.hasOwnProperty()
6 .获取对象所有继承属性(非自有属性),可以使用 for...in + Object.keys()
7 .遍历对象自有的所有可枚举和不可枚举属性(非继承属性),使用 Object.getOwnPropertyNames()
8 .获取对象自有的所有可枚举、不可枚举属性和继承属性,使用 for...in + Object.getOwnPropertyNames(obj) 或 for...in + Object.keys() + Object.getOwnPropertyNames(obj)
9 .Object.getOwnPropertySymbols() 返回自身所有symbol属性的数组

测试代码

 let parent={
            name:'parent'
            //继承可枚举
       }
       Object.defineProperty(parent, "age", {
        value: 1,
        enumerable:false
      });

       let parentSymbol=Symbol('parentSymbol')
       //继承symbol
       parent[parentSymbol]='parentSymbol'

       console.log(parent)
       //正常我们能看到的

       //先看能不能遍历出自己的三种类型的属性
       //in
       if('name' in parent && "age" in parent && parentSymbol in parent){
        //自身的全都可以看到
        //console.log('in is ok')
       }

       //for in 
       for(key in parent){
        //只能看到自身可枚举属性:name
       // console.log(key)
       }

       //Object.keys()
       //console.log(Object.keys(parent))
       //也是自身可枚举属性

       //hasOwnProperty
       if(parent.hasOwnProperty('name')&&parent.hasOwnProperty(parentSymbol)&&parent.hasOwnProperty('age')){
        console.log('hasoWnProperty is ok')
        //全都可以看到
       }
       
       //Reflect.OwnKeys()
       //console.log(Reflect.ownKeys(parent))

       //Object.getOwnPropertyNames()
       console.log(Object.getOwnPropertyNames(parent))

相关文章

  • 循环和迭代

    如何遍历一个对象的所有属性 方法1 for in 循环对象的所有枚举属性,调用hasOwnProperty来忽略继...

  • 【控制流】26、迭代循环(for)

    目录一、什么是迭代循环二、range函数三、跳出和继续 一、什么是迭代循环 迭代循环语句Python语言中的for...

  • EXCEL动一下公式结果全变0

    回答:迭代计算没开。 迭代计算 和迭代结算有关的一个概念 - 循环引用 一、循环引用 循环引用,一个单元格内的公式...

  • Swift 5.1 (5) - 控制流

    控制流 For-In循环 使用for-in循环迭代数组 使用for-in循环迭代字典 使用for-in循环迭代数值...

  • 第十四章习题

    1.for循环和迭代器之间有什么关系? for循环会使用迭代协议来遍历迭代的对象中的每一个项。for循环会在每次迭...

  • Go语言学习笔记06.流程控制

    分支结构 循环结构 for循环 range迭代 break和continue goto

  • kotlin 中的 "for" 循环和迭代m

    文章目录场景"for" 循环迭代map总结 场景 kotlin 中的 "for" 循环和迭代 map 与我们熟知的...

  • Julia循环结构_for循环_2020-04-23

    # Julia循环结构_for循环_2020-04-23Thursday #@ for循环是一种迭代循环机制,迭代...

  • Javascript的进阶(2)2018-6-21

    重复循环(for循环)语法:for(初始化变量;循环条件;循环迭代){循环语句}反反复复(while循环)和for...

  • 控制流:迭代循环(for)

    控制流:迭代循环(for) 什么是迭代循环 迭代循环语句 Python语言中的for语句实现了循环结构的 第一种循...

网友评论

      本文标题:循环和迭代

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