

数组是非常常见且有用的数据结构,用于保存集合,但是它们在JavaScript中有很小的收获,它们实际上是对象。 对于使用JS的人来说,这可能不是什么新闻,但对于刚起步的人来说,却可能会有一个奇怪的惊喜。
JS现在有6种原始类型,分别是string , number ,b oolean ,n ull ,u ndefined和symbol ,当某些不适合其中的一种被分配为对象时,数组就是这种情况。和功能。
let foo = [1、2、3] //在JS内部是类似于offlet foo = {
“ 0”:1
“ 1”:2
“ 2”:3,
}
//这就是为什么您可以使用foo [0]访问它
foo [1]
foo [2]
//如果对象的属性/方法可以是数字,那么在这种情况下您可以像sofoo.0那样访问
foo.1
foo.2
在不知不觉中通过引用进行分配以及在for...in使用时,至少在两种情况下可能会引起一些问题。
引用
当使用已经声明的对象创建新对象时,新对象如果被更改,则也会更改(更改值)第一个对象,例如:
让firstObject = {
foo:1
}
console.log(firstObject)// {foo:1}让secondObject = firstObjectsecondObject.bar = 2console.log(firstObject)// {bar:2,foo:1}
console.log(secondObject)// {bar:2,foo:1}
虽然原始类型在对象被引用分配的情况下是按值分配的,所以当您let secondObject = firstObject的那一刻,您实际上是在说“每当secondObject更改时,也会更改firstObject ”。 由于这发生在对象上,因此将其与数组一起使用时也会发生。
为了避免引用,您可以使用类似以下的内容
让firstObject = {
foo:1
}
让secondObject = {}
为(在firstObject中创建键){
secondObject [key] = firstObject [key]
}
secondObject.bar = 2console.log(firstObject)// {foo:1}
console.log(secondObject)// {bar:2,foo:1}
这是secondObject[key] = firstObject[key]因为secondObject[key] = firstObject[key]分配了原始类型,在这种情况下为数字 “ 1”,您也可以使用称为Object.assign的ES6功能来本地实现此目的。
让secondObject = Object.assign({},firstObject)
“如果我在对象中有对象,该怎么办?” —好吧,在这种情况下,带有for的示例和带有Object.assign的示例都将无法通过值分配对象中任何嵌套的对象,我建议您使用_.merge的.merge或jquery中的$.extend 。 您也可以创建自己的应用程序,这可能是一个很好的练习。
对于…在
让foo = [1、2、3] foo.bar = 4for(在foo中输入键){
console.log('--->',key)//这将输出“ 0”,“ 1”,“ 2”,“ bar”
}
虽然您可能之前希望for...in只会运行一次,但实际上它会在退出之前循环四次,因为实际上我们有4个属性,而不是1个,数组的索引中有3个,属性bar 。
避免将数组和对象分配给同一变量,因为它们在内部可能会发生相同的意外情况,并且需要花费一些时间进行调试,特别是对于新手。
希望这可以帮助您学习更多有关JS中对象和数组的工作方式,并且可以节省宝贵的调试时间(或根本不需要调试时间)。
30条中的第13条是项目的一部分,该项目每周至少发表一次文章,从闲散的想法到教程。 发表评论,关注我DiogoSpínola,然后回到您的辉煌项目!