关于object 使用for in遍历的说法是否正确?

问题1:只要是object一个对象就可以使用for in去输出属性查看?
问题2:我只知道json是用for in去遍历,json因为有键名和键值,所以遍历之后可以看到具体的键名的具体内容。
那么是否说明所有的object都是属于json的模式的?
问题3:其实数组也是属于object的,明显不属于json那样,但也居然可以使用for in遍历!(怀疑人生...)
下面是我测试的代码:
<input type="text" id="input_01">
<script>

var oInput=document.getElementById("input_01")//问题2
var array=[1,2,3,4,5]//问题3
for( attr in oInput){
    console.log(
        attr+"="+oInput[attr]
    )
}
for( attr in array){
    console.log(
        attr+"="+oInput[attr]
    )
}

</script>

阅读 2.5k
2 个回答

for in 可以枚举可枚举属性名,对象,数组都是可以使用的,可以把数组理解为一种特殊的对象,常用for in枚举稀疏数组,object如果说里面包含object,那么for in 就无法枚举里面的object,类似于浅拷贝。object是有一些自己的方法的,比如toString之类的,但是因为这些方法不可枚举,使用for in时不会显示,但是如果object上有个方法,这个方法是你自己加上去的,默认可枚举,for in就会枚举它,这可能就不是你想要的结果.
ob{

a: "a",
b: {…},
f: ƒ
}
a: "a"
b: {c: "c", d: "d"}
f: ƒ ()__proto__: Object

for(let x in ob){

console.log(ob[x]) 

}
a

{c: "c", d: "d"}

ƒ (){ return 0 }
这个ob对象里有三个成员a, b, f for in 将其全部枚举出来了,所以只要记住这一点,for in枚举可枚举属性,所有问题都可以解决。

问题1:只要是object一个对象就可以使用for in去输出属性查看?

是的。不过有前提条件 必须是要 enumerable 属性才行 Object. prototype .propertyIsEnumerable

问题2:我只知道json是用for in去遍历,json因为有键名和键值,所以遍历之后可以看到具体的键名的具体内容。那么是否说明所有的object都是属于json的模式的?

json是一种数据格式,独立于语言存在; 通常在js里面表现为一个Object类型的实例,也就是常说的对象,对象在js里面就是属性的集合。 既然是object类型,自然可以用for-in来枚举其属性的键值队。

问题3:其实数组也是属于object的,明显不属于json那样,但也居然可以使用for in遍历!(怀疑人生...)

1:js中的数组是object类型,它的继承关系大改就是 Array -> Object.

typeof [] === typeof {}; ///简单验证

  • 其实它还继承了Function(因为有prototype存在),不过Object 类型和 Function 类型有点(ai mei)傻傻分不清楚,

2:数组的实例,这里涉及到一些原型链的知识,Array

//实例化数组
var array = [];
// array实例会有Array.prototype所定义的所有属性,所以可以用 for in 来枚举

ps:
要理解的是什么是规范,什么是实现,以及他们的本质关系,

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏