gpt4 book ai didi

在数组中查找项目的 JavaScript 最有效函数?并解释这个棘手的代码

转载 作者:搜寻专家 更新时间:2023-11-01 04:57:52 25 4
gpt4 key购买 nike

在数组中查找项目的最有效方法是什么,这种方法合乎逻辑且 Web 开发人员可以理解?

我遇到了这段代码:

var inArray = function(a, b, c, d) {
for (c in b) d |= b[c] === a;
return !!d
};

它工作正常。有人可以向我解释一下代码吗?
我还遇到了 exact same question这可能会使我的重复。但我真正的问题在于对上述代码的解释以及为什么在其中使用了按位运算符。
另外,有没有一种方法可以不使用任何 for 循环或迭代来获取数组中某个项目的索引?

最佳答案

var inArray = function(a, b, c, d) {
for (c in b) d |= b[c] === a;
return !!d
};

那是一些可怕的代码,你应该远离它。按位运算符在这里完全没有必要,cd 作为参数根本没有意义(正如 Raymond Chen 指出的那样,代码的作者可能是为了安全空间而做的)声明局部变量——但问题是如果 true 被传递给 d 代码突然被破坏,额外的参数破坏了任何理解感声明将提供)。

我将解释代码,但首先,这里有一个更好的选择:

function inArray(arr, obj) {
for (var i = 0; i < arr.length; ++i) {
if (arr[i] === obj) {
return true;
}
}
return false;
}

请注意,这取决于数组是否为实际数组。您可以使用 for (k in arr) 类型循环将其推广到所有对象。


无论如何,继续解释:

for (c in b) d |= b[c] === a;

这意味着对于 b 中的每个键(存储在 c 中),我们将检查是否 b[c] === a。换句话说,我们对数组进行线性扫描,并根据 a 检查每个元素。

d |= val 是按位或。 val 中的高位将在 d 中设置为高位。这在比 JS 更容易暴露位的语言中更容易说明,但一个简单的说明:

10011011
01000001
--------
11011011

它只是将每个单独的位与另一个值中的相同位置位进行“或”运算。

它在这里被滥用的原因是它使代码复杂化并且它依赖于奇怪的隐式转换。

x === y 返回一个 bool 值。在按位表达式中使用 bool 值毫无意义。不过,实际情况是 bool 值正在转换为非零值(可能是 1)。

同样,undefined 就是 d 的样子。这意味着 d 将被强制转换为 0 以进行按位运算。

0 | 0 = 0,但是 0 | 1 = 1。所以基本上它是一个美化:

for (c in b) d = (d || (b[c] === a));

至于 !!x 只是用来将某些东西转换为 bool 值。 !x 将采用 x,隐式地将其转换为 bool 值,然后取反。额外的 ! 将再次否定它。因此,它很可能隐式转换为 bool (!!x 为真意味着 x 至少 大致为真 (1, “string” 等)和 !!x 暗示 x至少松散的假(0"" 等)。


This answer提供了更多选项。请注意,尽管所有这些都旨在回退到 native indexOf,这几乎肯定会比我们在脚本领域编写的任何代码都快。

关于在数组中查找项目的 JavaScript 最有效函数?并解释这个棘手的代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14093638/

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