gpt4 book ai didi

javascript - JSLint for backwards for 循环

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

Douglas Crockford,因此,JSLint 真的不喜欢 for 循环。大多数时候我同意,并使用 [].forEachObject.keys(obj) 遍历数组或字典。

但是,在某些情况下,内置函数在任何合理的意义上都不比 for 循环好(据我所知),我不喜欢在我的 JSLint 上收到警告。

一个这样的例子是,当一个人在 Canvas 上有一堆元素时。绘图时,你想向前遍历数组,但是当点击测试鼠标点击时,你需要向后迭代。例如

// ...
drawItems = function () {
objects.forEach(drawItem);
},
hitTest = function (x, y) {
var i;
for (i = objects.length - 1; i >= 0; i -= 1) {
if (test(objects[i], x, y)) {
return objects[i];
}
}
}
// ...

我可以想出几种方法来通过测试,但它们都很笨拙。例如

hitTest = function (x, y) {
var item;

objects.reverse();
objects.some(function (v) {
if (test(v)) {
item = v;
return true;
}
});
objects.reverse();
return item;
}

hitTest = function (x, y) {
return objects.reduceRight(
function (prev, curr) {
return prev || (
test(curr, x, y)
? curr
: prev
);
},
undefined
);
}

这会愉快地通过 JSLint,但是,说实话,看起来很恶心。我不喜欢为了通过测试而“破解”我的代码的想法。

除了选择“tolerate for statement”选项(因为这会影响其余代码的 linting)之外,我将如何处理这个问题同时避免像反转或复制数组这样的浪费操作?

最佳答案

遇到一个有趣的、reverse 的替代修复 here -- 看第 3 和第 4 -- 今天看别的东西。很容易从 jQuery 的 each 切换到 forEachevery。无论如何,您必须获得原始 for 的长度,所以实际上非常干净,虽然有点时髦。

/*jslint white:true, devel:true */
var a = [3,4,5,6], max = a.length-1;
a.forEach(function (ignore, i) {
"use strict";
console.log(a[max-i]);
});

我有点担心性能问题,因为每次迭代都会拉出元素两次,一次在 a[max-i] 一次forEach's callback's (here, throwaway) third argument , 虽然也许那是一个 micro-optimization concern .

仅将 forEach 用于指标是引发时髦警告的原因。具有讽刺意味的是,自Crockford has shown a stark dislike for hipsters in the past ,所以我不确定他是否也喜欢这个“修复”——我们可能没有人回答过你的“meta-question”。想bug Crockford's list ;这是一个很好且有趣的问题,但您并不总能在该列表中得到好的答案。

但这是一个漂亮(看似?)干净的解决方法。

关于javascript - JSLint for backwards for 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30655811/

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