javascript - 为什么 javascript `arr.filter(() => true)` 删除空洞?

标签 javascript arrays

请看下面的代码,数组过滤器显式返回true可以去除数组空洞,为什么会这样?

const array = [0, null, '', undefined, , ,];

console.log(array);
// => [0, null, "", undefined, empty × 2]

array.filter(() => true);
// => [0, null, "", undefined]

最佳答案

因为,与其他数组方法一样,.filter 仅迭代直接位于数组对象上的属性。查看spec :

5. Let A be ? ArraySpeciesCreate(O, 0).
6. Let k be 0.
7. Let to be 0.
8. Repeat, while k < len
  a. Let Pk be ! ToString(k).
  b. Let kPresent be ? HasProperty(O, Pk). // <-----------------------------------
  c. If kPresent is true, then
    i. Let kValue be ? Get(O, Pk).
    ii. Let selected be ! ToBoolean(? Call(callbackfn, T, « kValue, k, O »)).
    iii. If selected is true, then
      1. Perform ? CreateDataPropertyOrThrow(A, ! ToString(to), kValue).
      2. Set to to to + 1.
  d. Set k to k + 1.
9. Return A.

新创建的数组的最大长度 是原始数组上自己的数组索引属性的数量。

const array = [0, null, '', undefined, , ,];

console.log(array.hasOwnProperty('3'));
console.log(array.hasOwnProperty('4'));

关于javascript - 为什么 javascript `arr.filter(() => true)` 删除空洞?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58472289/

相关文章:

javascript - 有没有办法让超链接运行代码?

javascript - 防止 jquery slimscroll 条在缩放时覆盖绝对定位的 div

javascript - Promise 完成之前调用的方法

python - 将二进制 .dat 文件作为数组读取

python - Numpy数组、索引和卷积混淆

C将字符串拆分为数组仅输出第一个标记

java - 如何使 HashMap 以数组为键工作?

javascript - CSS:如何使 div 的左边缘跟随具有动画宽度的侧边栏的右边缘?

javascript - JSP/HTML/JS/CSS - 如何在表单中创建取消按钮

arrays - 在哪里定义与 symfony2 中的实体相关的静态数组?