gpt4 book ai didi

javascript - 在 Javascript while 循环中使用 'undefined' 作为标记是否安全?

转载 作者:行者123 更新时间:2023-11-30 19:30:07 25 4
gpt4 key购买 nike

在 Javascript 中使用这种循环安全吗?

denseArray = [1,2,3,4,5, '...', 99999]

var x, i = 0
while (x = denseArray[i++]) {
document.write(x + '<br>')
console.log(x)
}

document.write('Used sentinel: ' + denseArray[i])
document.write('Size of array: ' + i)

使用内置哨兵,它比 for 循环更短,对于大数组也可能更有效。 sentinel 将调用者标记为发生了一些非常不寻常的事情

数组必须是 dense array上类!这意味着没有其他 未定义 除了数组中最后一个元素之后的值。我几乎从不使用稀疏数组,只使用密集数组,所以这对我来说没问题。

要记住的另一个更重要的一点(感谢@Jack Bashford 的提醒)是它不仅仅是未定义的哨兵。如果数组值为 0、false 或任何其他虚假值,循环将停止。所以,你必须确定数组中的数据没有falsy values。即 0, "", '', ``, null, undefined > 和 NaN

这里是否存在“超出范围”的问题,或者我们是否可以将 Javascript 中的数组视为“无限”,因为 long 内存未满?undefined 是否意味着浏览器可以将其设置为任何值,因为它是未定义的,或者我们是否可以认为条件测试始终有效?Javascript 中的数组很奇怪,因为“它们是对象”所以最好问。

我无法使用这些标签在 Stackoverflow 上找到答案:[javascript] [sentinel] [while-loop] [arrays]结果为零!

我已经考虑了一段时间并且使用它足以开始担心。但我想使用它,因为它优雅、易于查看、简短,也许在大数据中有效。 i 是数组的大小很有用。

更新

  • @Barmar 告诉:JS 保证一个未初始化的数组元素将返回未定义的值。
  • > MDN confirms : 使用无效的索引号返回未定义。
  • @schu34 的注释:最好使用 denseArray.forEach((x)=>{...code}) 针对它的使用进行优化并为开发人员所知。无需遇到虚假值。它有 good browser support .

最佳答案

即使您的代码以后不会被其他人查看,最好还是让它尽可能具有可读性和组织性。条件测试中的赋值(递增和递减运算符除外)通常不是一个好主意。

您的检查也需要更具体一些,因为 [0, ''] 的计算结果均为 false。

denseArray = [1,2,3,4,5, '...', 99999]

for(let i = 0; i < denseArray.length; i++) {
let x = denseArray[i]
document.write(x + '<br>');
console.log(x);
if (/* check bad value */) break;
}

document.write('Used sentinel: ' + denseArray[i])
document.write('Size of array: ' + i)

根据我的经验,如果以可读性甚至可靠性为代价,那么节省几行代码通常是不值得的。

编辑:这是我用来测试速度的代码

const arr = [];
let i;

for (i = 0; i < 30000000; i++) arr.push(i.toString());

let x;

let start = new Date();

for(i = 0; i < arr.length; i++) {
x = arr[i];
if (typeof x !== 'string') break;
}

console.log('A');
console.log(new Date().getTime() - start.getTime());

start = new Date();

i = 0;
while (x = arr[i++]) {
}

console.log('B');
console.log(new Date().getTime() -start.getTime());

start = new Date();

for(i = 0; i < arr.length; i++) {
x = arr[i];
if (typeof x !== 'string') break;
}

console.log('A');
console.log(new Date().getTime() - start.getTime());

start = new Date();

i = 0;
while (x = arr[i++]) {
}

console.log('B');
console.log(new Date().getTime() -start.getTime());


start = new Date();

for(i = 0; i < arr.length; i++) {
x = arr[i];
if (typeof x !== 'string') break;
}

console.log('A');
console.log(new Date().getTime() - start.getTime());

start = new Date();

i = 0;
while (x = arr[i++]) {
}

console.log('B');
console.log(new Date().getTime() -start.getTime());

for 循环甚至有一个额外的 if 语句来检查错误值,而且速度仍然更快。

关于javascript - 在 Javascript while 循环中使用 'undefined' 作为标记是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56510107/

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