Javascript中是否有一种使用模式来防止[1,3,5]==true中出现2的陷阱?

Javascript中是否有一种使用模式来防止[1,3,5]==true中出现2的陷阱?,javascript,Javascript,我发现有些用法有点棘手 2 in [1, 3, 5] for (var i in [1, 3, 5]) { ... } str = "hello"; for (var i in str) { ... } 第一行是true(我可能会立即在[1,3,5]中说2是false),第二行循环通过0,1,2而不是1,3,5,最后一部分循环通过0到4,而不是'h','e','l','o'。现在我只是使用:每当看到数组的in或数组的in-loop时,立即考虑索引。否则,有没有一种方法或使用模式可以用来避免

我发现有些用法有点棘手

2 in [1, 3, 5]

for (var i in [1, 3, 5]) { ... }

str = "hello";
for (var i in str) { ... }

第一行是
true
(我可能会立即在[1,3,5]中说
2是
false
),第二行循环通过0,1,2而不是1,3,5,最后一部分循环通过0到4,而不是
'h','e','l','o'
。现在我只是使用:每当看到数组的
in
或数组的in-loop时,立即考虑索引。否则,有没有一种方法或使用模式可以用来避免这个陷阱

您可以使用
indexOf
方法

用于阵列

var arr = [1,2,3,4];
arr.indexOf(2); // will return index of item if exist other wise return -1;
对于字符串

var str = 'Hello world';
str.indexOf('e')
console.log(str.indexOf('e'),str.indexOf('n'));

您可以使用
indexOf
方法

用于阵列

var arr = [1,2,3,4];
arr.indexOf(2); // will return index of item if exist other wise return -1;
对于字符串

var str = 'Hello world';
str.indexOf('e')
console.log(str.indexOf('e'),str.indexOf('n'));

是的,它被称为“在
中不要对数组使用
”。它测试一个对象是否有某个键,因此您无法在数组上正确使用它

您也不应该使用
for(某物中的var x)
,除非您想迭代
某物的属性

要检查数组中是否包含值,请使用
~arr.indexOf(value)
-或
arr.indexOf(value)!=-1
如果您希望它更详细

要在数组中的元素上迭代,请使用
for(var i=0;i
是,这称为“不要在数组中使用
”。它测试一个对象是否有某个键,因此您无法在数组上正确使用它

您也不应该使用
for(某物中的var x)
,除非您想迭代
某物的属性

要检查数组中是否包含值,请使用
~arr.indexOf(value)
-或
arr.indexOf(value)!=-1
如果您希望它更详细


要迭代数组中的元素,请使用
for(var i=0;i

中的
关键字用于对象,如下所示(取自)

数组可以看作是一个对象。数组
['zero','one','two']
类似于对象
{0:'zero',1:'one',2:'two'}

因此,如果您为(i in['zero','one','two'])编写
javascript会将其视为您为(i in{0:'zero',1:'one',2:'two'})编写

您可以检查对象是否具有以下特定属性值:

function isIn(val, obj) {
  for (var i in obj) if (obj[i] == val) return true;
  return false;
}

isIn('car', ['car', 'horse']) // returns true
如果要特别检查数组而不仅仅是任意对象,则可以使用返回其参数索引的或数组中不包含参数的-1

function isInArray(val, arr) {return arr.indexOf(val) > -1;}

isIn('car', ['car', 'horse']) // returns true

关键字中的
用于对象,如下所示(取自)

数组可以看作是一个对象。数组
['zero','one','two']
类似于对象
{0:'zero',1:'one',2:'two'}

因此,如果您为(i in['zero','one','two'])编写
javascript会将其视为您为(i in{0:'zero',1:'one',2:'two'})编写

您可以检查对象是否具有以下特定属性值:

function isIn(val, obj) {
  for (var i in obj) if (obj[i] == val) return true;
  return false;
}

isIn('car', ['car', 'horse']) // returns true
如果要特别检查数组而不仅仅是任意对象,则可以使用返回其参数索引的或数组中不包含参数的-1

function isInArray(val, arr) {return arr.indexOf(val) > -1;}

isIn('car', ['car', 'horse']) // returns true


陷阱在哪里?你的意思是因为一个给出了一个
布尔值,而另一个给出了属性名?在某些语言中,[1,3,5]中的2是假的,因为它检查数组中是否有2。而for(在[1,3,5]中的i)将循环通过1,3,5,而不是0,1,2JavaScript已
.forEach()
为您提供值而不是索引<代码>[1,3,5].forEach(函数(项,i){console.log(项,i);})
根据您在其中执行代码的环境,您可以使用创建自己的
in
/
for in
语义。@user1689607
。forEach
用于ECMA 5.1?陷阱在哪里?你的意思是因为一个给出了一个
布尔值,而另一个给出了属性名?在某些语言中,[1,3,5]中的2是假的,因为它检查数组中是否有2。而for(在[1,3,5]中的i)将循环通过1,3,5,而不是0,1,2JavaScript已
.forEach()
为您提供值而不是索引<代码>[1,3,5].forEach(函数(项,i){console.log(项,i);})根据您在其中执行代码的环境,您可以使用创建自己的
in
/
for in
语义。@user1689607
.forEach
用于ECMA 5.1?我想我们使用
if(arr.indexOf(2))!=-1) 
if(arr.indexOf(2)>=0)
检查是否存在,与Ruby中的if相比,
if(arr.indexOf(2))
足够好了,因为
0
在Ruby中是真的(作为比较),因为0在JavaScript中是有效的索引,所以0表示元素在数组中的第一位存在-如果数组中不存在项,则为1。请参阅注释,我想我们使用
if(arr.indexOf(2))!=-1) 
if(arr.indexOf(2)>=0)
检查是否存在,与Ruby中的if相比,
if(arr.indexOf(2))
足够好了,因为
0
在Ruby中是真的(作为比较),因为0在JavaScript中是有效的索引,所以0表示元素在数组中的第一位存在-如果数组中不存在项,则为1。看到评论了吗?所以一般的建议是不要使用for-in-loop for-array?因为即使是Javascript权威指南也讨论了for-in-loop for-array。。。但它立即表示要使用
hasOwnProperty
进行检查。。。所以我想使用
for(var I=0;I
总是更干净@動靜能量: 那本书给了你很糟糕的建议。找一本更好的书。现在我想有时候我们确实需要使用
if(我在arr中)
。。。除非有另一种方法,所以我们必须小心另一件事是,如果程序使用稀疏数组,那么使用in-loop可能更有效,因为如果我们使用
i=0进行循环;i
,然后我们可以检查所有这些