我正在尝试将一个数组值复制到另一个数组中,但是没有打破与此数组关联的链接其他单词我不能将新数组分配给此值,这就是为什么我不能使用像slice()或CONCAT()。 以下是执行该操作的函数的代码:
self.updateBreadcrumbs = function (newBreadcrumbs) {
var old_length = self.breadcrumbs.length;
var new_length =newBreadcrumbs.length;
var j = new_length > old_length ? new_length: old_length;
for (var i = 0; i < j; i++) {
if(old_length < i+1){
self.breadcrumbs.push(newBreadcrumbs[i]);
continue;
}
if(new_length < i+1){
delete self.breadcrumbs[i];
continue;
}
if (self.breadcrumbs[i].title !== newBreadcrumbs[i].title) {
self.breadcrumbs[i] = newBreadcrumbs[i];
}
}
}
我的问题是,当我从数组中删除某些内容时,数组的长度不会改变。
如果你知道任何更简单的方法,我对命题完全开放。
答案 0 :(得分:13)
通过删除其中的元素,数组的长度永远不会改变。
然而,splice
可以改变它
例如
var arr=[1,2,3,4,5]; //length 5
arr.splice(0,1); //length 4
与普遍看法不同,delete
运算符与直接释放内存无关。 delete
仅对对象的属性有效。它对数组长度没有影响
splice()方法通过删除来更改数组的内容 现有元素和/或添加新元素。
有关 Splice
的更多信息答案 1 :(得分:3)
length
对象的Array
属性是由其方法维护的属性,它不是对象本身的固有特征。因此,如果您对其采取的操作不是Array
自己的方法,则不会更新length
属性。在这种情况下,您需要使用splice
方法(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/splice)
有趣的是,您可以通过直接更改数组的长度来更改数组的构成。 。 。例如,如果你有一个包含6个元素的数组,并且你要将其length
属性更改为5(即array.length = 5;
),它将不再将第6个元素识别为阵列。
有关length
媒体资源的更多信息:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/length
答案 2 :(得分:2)
(除了其原型方法之外)数组仅是一个简单对象。区别在于length属性具有特殊的setter方法,而添加新属性的方式也有所不同。 如果将属性添加到对象,则将测试其名称是否为数字值,以及该值是否> =当前数组长度。如果是这样,则更新内部长度。 如果设置了长度,则会检查新值是否小于旧值,如果是,则将删除所有具有属性名称(即数值)且> =新长度的属性。
如果从数组中删除索引元素,则该元素将被删除(稍后访问该索引将返回undefined,就像对任何不存在的属性一样)。它不会更改数组长度,也不会增加数组长度,不会为添加的索引位置(稀疏数组)创建任何属性。使用[]
或new Aray[10000]
都会创建具有完全相同的内存占用的数组。只是length属性具有不同的初始值。
这与其他语言中的Array完全不同,在其他语言中,大小为n
的数组将为元素保留n个存储空间(是指向对象的指针还是本机值类型)。因此,在其他语言中,创建具有给定大小的数组并填充数组要比创建空数组和添加值快(在这种情况下,每次必须分配更大的连续空间并且必须将数组复制到此更大的内存位置之前)添加元素)。 OTOH,访问JS数组的元素要慢一些(因为它们只是命名属性,必须首先位于属性列表中),而在其他语言中,元素处于给定的固定位置。