js array.length = 0 vs array = []

最近看到 vue 源码的 nextTick ,发现里面清空数组的方式是把 length 置零,有点好奇具体发生了什么。于是搜索一番,也顺便记录一番。

const callbacks = []
let pending = false

function flushCallbacks () {
  pending = false
  const copies = callbacks.slice(0)
  callbacks.length = 0 // <================
  for (let i = 0; i < copies.length; i++) {
    copies[i]()
  }
}

首先我们看看 callbasks = [],实际上做了哪些事情呢?

  1. 创建了一个新的空数组 []
  2. 将其引用赋值给 callbacks

如果在赋值前,有其他变量也引用了 callbacks 引用的数组,是不会被影响的。

let callbacks = [1, 2, 3] // 这里只能用 let 或 var
let cbs = callbacks
callbacks = []
console.log(callbacks, cbs) // [] [1, 2, 3]

可是如果你是把数组的 length 置零,修改的是数组本身。

const callbacks = [1, 2, 3] // 这里可以用 const
const cbs = callbacks
callbacks.length = 0
console.log(callbacks, cbs) // [] []

MDN 对 Array.length 的描述如下:

length 是Array的实例属性。返回或设置一个数组中的元素个数。该值是一个无符号 32-bit 整数,并且总是大于数组最高项的下标

length 属性的值是一个 0 到 Math.pow(2, 32) - 1 的整数。不在这个范围里会报错 RangeError

可以给 length 设置一个比当前数组长度更小的值来截断数组。

const callbacks = [1, 2, 3]
callbacks.length = 2
console.log(callbacks) // [1, 2]

也可以设置一个更大的值来扩展数组,实际元素的数目将会增加,新的元素都是 undefined

const callbacks = [1, 2, 3]
callbacks.length = 5
console.log(callbacks) // [1, 2, 3, <2 empty items>]

当然,这么写可能会让你的同事看的一脸懵逼。为了避免修改数组变量(const),可以用其他显式的方式来清空数组

const callbacks = [1, 2, 3]
callbacks.splice(0, callbacks.length)
console.log(callbacks) // []
  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
// 下载器类 class Downloader { constructor(data, options) { this.data = data; this.options = options; this.item = null; this.onStart = null; this.onProgress = null; this.onCompleted = null; this.data.progress = 0; // 新增 progress 属性 this.data.status='pause';//true 表示 进度没有结束,继续下载 this.data.timeid=0; } start() { const win = BrowserWindow.getFocusedWindow(); this.options.onStarted = (item) => { this.item = item; this.data.status='process';//true 表示 进度没有结束,继续下载 this.onStart(); if (!handleDownload.includes(item)) { handleDownload.push(item); } }; this.options.onTotalProgress=(progress)=>{ this.data.progress = progress.percent * 100; // 更新 progress 属性 this.onTotalProgress(progress); } this.options.onCompleted = () => { this.onCompleted(); }; download(win, this.data.dowloadLink, this.options); } pause() { if (this.item) { this.item.pause(); } } resume() { if (this.item) { this.item.resume(); } } cancel() { if (this.item) { this.item.cancel(); } } } ipcMain.handle('window-downloadNow', (msg, dataArray) => { for (var i=0;i<dataArray.length;i++) { var timenow=Date.now();//调用的时候,打个时间戳 const options = { directory: downloadPath, filename: dataArray[i].title + '.' + dataArray[i].fileType, saveAs: false, extension: dataArray[i].fileType, openFolderWhenDone: false, showProgressBar: true, showBadge: true, }; var downloader = new Downloader(dataArray[i], options); downloader.data.timeid=timenow;//存储唯一标识 downloader.start(); downloader.onStart = () => { // 下载开始 }; downloader.onTotalProgress = (progress) => { // 更新下载进度 downloadArray.set(downloader.data.timeid, { title: downloader.data.title, sUrl: downloader.data.sUrl, progress: downloader.data.progress, size: downloader.data.size, status:downloader.data.status, timeid:downloader.data.timeid }); mainWindow.webContents.send('consolelog2', JSON.stringify(handleDownload)); mainWindow.webContents.send('consolelog', downloadArray); mainWindow.webContents.send('donwloadStatus', true); }; downloader.onCompleted = () => { if(downloader.data.progress==100&&downloader.data.status=='process'){ mainWindow.webContents.send('endDownload', JSON.stringify(downloader)); mainWindow.webContents.send('donwloadStatus', false); downloader.data.status='complete' } if(downloader.data.progress<100){ mainWindow.webContents.send('donwloadStatus', true); } mainWindow.webContents.send('consolelog', downloadArray); }; } return JSON.stringify(dataArray); // 返回值将作为 Promise 的 resolved 值 }); 这个下载器有个问题,当dataArray 为24个时,下载的数据不是这24个,而是最后一个,为什么
最新发布
06-01

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值