javascript数组的长度在从中删除元素后不会更改

javascript数组的长度在从中删除元素后不会更改,javascript,arrays,Javascript,Arrays,我试图将一个数组值复制到另一个数组中,但在不中断与此数组关联的链接的情况下,换句话说,我不能将新数组分配给此值,这就是为什么我不能使用slice()或concat()之类的方法。 下面是执行该操作的函数的代码: self.updateBreadcrumbs = function (newBreadcrumbs) { var old_length = self.breadcrumbs.length; var new_length =newBread

我试图将一个数组值复制到另一个数组中,但在不中断与此数组关联的链接的情况下,换句话说,我不能将新数组分配给此值,这就是为什么我不能使用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];
                }

            }
        }
self.updateBREADCRUMS=函数(newBreadcrumbs){
var old_length=self.breadcrumbs.length;
var new_length=newbreadcrumps.length;
var j=新长度>旧长度?新长度:旧长度;
对于(变量i=0;i
我的问题是,当我从数组中删除某些内容时,数组的长度不会改变

如果你知道更简单的方法,我完全愿意接受建议

数组的长度永远不能通过删除其中的元素来更改

但是,它可以通过
拼接
例如

与一般的看法不同,
delete
操作符与直接释放内存无关<代码>删除
仅对对象的属性有效。它对数组长度没有影响

splice()方法通过删除 现有元素和/或添加新元素


有关

的详细信息
数组
对象的
长度
属性是由其方法维护的属性,它不是对象本身的固有特性。因此,如果您对它执行的操作不是
Array
自己的方法之一,它将不会更新
length
属性。在本例中,您希望使用的是
拼接方法()

有趣的是,你可以通过直接改变数组的长度来改变数组的组成。例如,如果您有一个包含6个元素的数组,并且要将其
length
属性更改为5(即
array.length=5;
),则它将不再将第6个元素识别为数组的一部分

关于
length
属性的更多信息:

数组(除了其原型方法)只不过是一个简单的对象。区别在于length属性有一个特殊的setter方法,以及添加新属性的不同方式。 如果将属性添加到对象中,将测试其名称是否为数值,以及该值是否>=当前数组长度。如果是,则更新内部长度。 如果设置了长度,则会检查新值是否小于旧值,如果小于旧值,则会删除属性名称为数值且>=新长度的所有自己的属性

如果从数组中删除索引元素,它将被删除(稍后访问此索引将返回undefined,与任何不存在的属性一样)。它不会更改数组长度,增加数组长度也不会为添加的索引位置(稀疏数组)创建任何属性。使用
[]
新建Aray[10000]
将创建内存占用完全相同的阵列。只有length属性具有不同的初始值


这与其他语言中的数组完全不同,在其他语言中,大小为
n
的数组将为元素保留n个存储空间(作为指向对象的指针或本机值类型)。因此,在其他语言中,创建一个给定大小的数组并填充它比创建一个空数组并添加值要快(在这种情况下,每次都必须分配一个更大的连续空间,并且在添加元素之前必须将数组复制到这个更大的内存中)。OTOH,访问JS数组中的元素要比其他语言中的元素慢一些(因为它们只是命名属性,必须首先位于属性列表中),固定位置。

删除这样的元素不会改变数组的长度。您正在删除数组中的对象。数组不受影响。此函数的作用是什么?为什么不干脆
self.breadcrumbs=newBreadcrumbs
?@SteveWellens:不,不是这样。@georg 1,我有一个角度服务,它在控制器之间共享这个数组,如果我重新分配数组-控制器内的链接将断开,但slice()将返回新数组,不是吗,如果是这种情况,则在这种情况下不适合其拼接而不是切片
var arr=[1,2,3,4,5]; //length 5
arr.splice(0,1); //length 4