专栏首页Czy‘s BlogJs中数组空位问题

Js中数组空位问题

Js中数组空位问题

JavaScript中数组空位指的是数组中的empty,其表示的是在该位置没有任何值,而且empty是区别于undefined的,同样empty也不属于Js的任何数据类型,并且在JavaScript版本以及各种方法对于空位的处理也有不同,所以建议避免在数组中出现空位。

描述

JavaScript的数组是以稀疏数组的形式存在的,所以当在某些位置没有值时,就需要使用某个值去填充。当然对于稀疏数组在各种浏览器中会存在优化的操作,例如在V8引擎中就存在快数组与慢数组的转化,此外在V8中对于empty的描述是一个空对象的引用。在Js中使用Array构造器创建出的存在空位的问题,默认并不会以undefined填充,而是以empty作为值,需要注意的是,空位并不是undefinedundefined表示的是没有定义,但是本身undefined就是一个基本数据类型,是一个值,而是empty表示了该处没有任何值,是一个完全为空的位置。

console.log([,,,]); // (3) [empty × 3]
console.log(new Array(3)); // (3) [empty × 3]
console.log([undefined, undefined, undefined]); // (3) [undefined, undefined, undefined]
console.log(0 in [undefined, undefined, undefined]); // true
console.log(0 in [,,,]); // false // in 是检查索引 此处表示 0 位置是没有值的

方法处理

ECMA262V5中对空位的处理就已经开始不一致了,在大多数情况下会忽略空位,例如forEach()for infilter()every()some()都会跳过空位,map()会跳过空位,但会保留这个值,join()toString()会将空位与undefined以及null处理成空字符串。

// forEach 忽略空位
[1, , 2].forEach(v => console.log(v)); // 1 2

// for in 忽略空位
for(let key in [1, , 2]){ console.log(key); } // 0 2

// filter 忽略空位
console.log([1, , 2].filter(v => true)); // [1, 2]

// every 忽略空位
console.log([1, , 1].every(v => v === 1)); // true

// some 忽略空位
console.log([1, , 1].some(v => v !== 1)); // false

// map 遍历时忽略空位 新数组保留空位
console.log([1, , 1].map(v => 11)); // (3) [11, empty, 11]

// join 将空位与undefined以及null视为空字符串
console.log([1, , 1, null, undefined].join("|")); // 1||1||

// toString 将空位与undefined以及null视为空字符串
console.log([1, , 1, null, undefined].toString()); // 1,,1,,

ECMA262V6则是将空位转为undefined,例如Array.form()方法会将数组的空位转为undefined,扩展运算符也会将空位转为undefinedcopyWithin()会连同空位一起拷贝,for of循环也会遍历空位并将值作为undefinedincludes()entries()keys()values()find()findIndex()等会将空位处理成undefined

// Array.form 将空位转为undefined
console.log(Array.from([1, , 2])); // (3) [1, undefined, 2]

// ... 将空位转为undefined
console.log([...[1, , 2]]); // (3) [1, undefined, 2]

// copyWithin 将空位一并拷贝
console.log([1, , 2].copyWithin()); // (3) [1, empty, 2]

// for of 遍历空位并将值作为undefined
for(let key of [1, , 2]){ console.log(key); } // 1 undefined 2

// includes 将空位处理成undefined
console.log([, , ,].includes(undefined)); // true

// entries 将空位处理成undefined
console.log([...[1, , 2].entries()]); // [[0, 1], [1, undefined], [2, 2]]

// keys 会取出空位的索引
console.log([...[1, , 2].keys()]); // [0, 1, 2]

// values 将空位处理成undefined
console.log([...[1, , 2].values()]); // [1, undefined, 2]

// find 将空位处理成undefined
console.log([, , 1].find(v => true)); // undefined

// find 将空位处理成undefined
console.log([, , 1].findIndex(v => true)); // 0

每日一题

https://github.com/WindrunnerMax/EveryDay

参考

https://www.zhihu.com/question/60919509
https://juejin.im/post/6844903917738786829
https://segmentfault.com/a/1190000004680060
https://xmoyking.github.io/2016/12/17/js-framework2/
https://juejin.im/post/6844904047934373896#heading-12
https://blog.csdn.net/qq_30100043/article/details/53308524
https://blog.csdn.net/weixin_43342105/article/details/108638001

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Object对象

    Object对象是JavaScript中两个顶层对象之一,提供方法供直接调用以及原型链继承调用。

    WindrunnerMax
  • getter与setter

    getter是一个获取某个属性的值的方法,setter是一个设定某个属性的值的方法。

    WindrunnerMax
  • null和undefined的区别

    在Js中null与undefined是两种基本数据类型,都可以用来表示"无"这个概念,但是在语义表达以及实际使用上是有所区别的。

    WindrunnerMax
  • 4.Python画一个五子棋棋盘

    今天我们通过wx.PaintDC在窗体上画出一个五子棋棋盘。要想在wxPython创建的窗体对象上通过wx.PaintDC画图,需要在该窗体上绑定一个画图事件w...

    用户4381798
  • Android7.0 分屏 Activity 与 Fragment 生命周期(二)

    和尚我前段时间整理过一些关于 Activity 与 Fragment 生命周期的小博文:Android7.0 分屏下 Activity 与 Frag...

    阿策
  • 微信iOS版更新:可批量管理不常联系的朋友

      iOS版微信更新了v6.5.13版本,在新版本当中微信新增加了可批量管理不常联系的朋友功能,同时在群资料页可以查看最近收到的小程序,不过据网友爆料,腾讯在新...

    ytkah
  • RabbitMQ 高级篇九 TTL设置队列或消息有效期队列及消息

    本文是《RabbitMQ精讲系列》中第十六篇:RabbitMQ消息中间件技术精讲16 高级篇九 TTL队列及消息。如果想学习RabbitMQ的朋友建议从第一篇开...

    凯哥Java
  • Codeforces Round #526 (Div. 2) B. Kvass and the Fair Nut(思维)

    题目链接:http://codeforces.com/contest/1084/problem/B

    Ch_Zaqdt
  • 详解rsync算法–如何减少同步文件时的网络传输量

    先看下图中的场景,客户端A和B,以及服务器server都保存了同一个文件,最初,A、B和server上的文件内容都是相同的(记为File.1)。某一时刻,B修改...

    陶辉
  • 【计算机本科补全计划】C++的从头开始之C++基础

    正文之前 我要去计算机念博士了!!!高兴!!激动!!!!我要上天啦!!!所以,计算机的前面三年的内容我肯定都要过一遍的。这就是计算机补全计划的真正含义!! 正文...

    用户1687088

扫码关注云+社区

领取腾讯云代金券