所以,今天偶然发现你可以将属性设置为数组,这是有道理的,因为Javascript中的所有内容都是一个对象。
此外,当与常见的数组迭代方法结合使用时,这会表现出某些有趣的行为:
let arr = ['a', 'b', 'c'];
arr.test = 'Test';
arr.map(el => console.log(el));
//output:
//a
//b
//c
arr.forEach(el => console.log(el));
//output:
//a
//b
//c
for(let x in arr){
console.log(arr[x]);
}
//output:
//a
//b
//c
//Test
有人能解释一下这里发生了什么吗?为什么map
和forEach
会忽略该属性,但for
会输出该属性?为什么可以首先将属性设置为数组?这是一个符合标准的做法,我应该在生产中做些什么?
答案 0 :(得分:1)
为什么map和forEach忽略属性
它们是数组方法,设计用于数组,并且意识到唯一的"真实"数组中的数据具有数字属性名称。
但输出
for ... in
循环将遍历所有可迭代属性,并且默认情况下任何新属性都是可迭代的。
为什么可以首先将属性设置为数组?
正如你所说:因为它们是对象。
这是一项符合标准的实践
标准说数组是对象......所以是的。
我应该在制作中做些什么?
一般不是。它可能会使维护代码的人感到困惑。
答案 1 :(得分:1)
for/in
循环用于循环对象属性。这就是您在使用它时获得test
属性的原因。
计数的for
循环用于数组,因为计数器用于获取数组索引并排除属性(在遍历数组时,您不希望迭代长度属性吗? )。
.map
和.forEach
是Array.prototype
属性,专门用于迭代数组中的元素而不是所有数组的属性。