gpt4 book ai didi

javascript - 为什么删除后数组的长度仍然不为零?

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:54:58 24 4
gpt4 key购买 nike

我有以下代码输出一个数组的长度,删除它,然后输出新的长度:

console.log($scope.adviceList.activeAdvices.length); // *1*
$scope.adviceList.activeAdvices.splice(id,1); // *id is a parameter*
console.log($scope.adviceList.activeAdvices.length); // *0*

console.log($scope.adviceList.activeAdvices.length); // *1*
delete $scope.adviceList.activeAdvices[id];
console.log($scope.adviceList.activeAdvices.length); // *0*
console.log($scope.adviceList.activeAdvices); // *[]*

删除后,数组正确显示为空。然而,它的长度仍然是 1。

最佳答案

delete 是一个“较低级别”的运算符。它直接作用于对象,它不“了解”数组。使用 delete 不会触发重新计算数组长度的例程。


此处的其他答案声称该属性的值设置为 undfined,这是不正确的。一个简单的测试表明:

var a = [1]; 
delete a[0];
console.dir(a);

并比较如果你真的将值设置为 undefined 会发生什么:

var a = [1]; 
a[0] = undefined;
console.dir(a);

为了获得更可靠的证据,让我们看看 specification :

When the [[Delete]] internal method of O is called with property name P and the Boolean flag Throw, the following steps are taken:

  1. Let desc be the result of calling the [[GetOwnProperty]] internal method of O with property name P.
  2. If desc is undefined, then return true.
  3. If desc.[[Configurable]] is true, then
       a. Remove the own property with name P from O.
       b. Return true.
  4. Else if Throw, then throw a TypeError exception.
  5. Return false.

没有任何地方说该属性的值设置为 undefined


不同浏览器的控制台可能会显示不同的数组表示形式。在此特定示例中,您可以争论它应该是 [] 还是 [undefined]

  • [] (Chrome) 似乎有道理,因为数组实际上没有任何元素,没有带有数字名称的属性。但是,当您访问 .length 属性时,您会得到一个 1,这可能会造成混淆。
    不久前,Chrome 使用了 a representation like [undefined x 5]表示长度为 5 但没有元素的数组。我认为这实际上是一个很好的解决方案。

  • [undefined] (Firefox) 有意义,因为数组的长度为 1 并且访问 arr[0] 实际上返回 undefined (但 arr[10] 也是如此)。但是,arr.hasOwnProperty(0) 将是 false 并且如果数组确实包含value undefined,如何仅通过这种表示将其与长度为 1 的空数组区分开来(答案:你不能)。

底线是:不要过于相信 console.log。如果您想要精确的表示,请使用 console.dir

关于javascript - 为什么删除后数组的长度仍然不为零?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18396702/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com