2016-01-04 302 views
-1

我的代码有这个操作不工作!=

if (choice != 'A1' || 'A2' || 'A3' || 'B1' || 'B2' || 'B3' || 'C1' || 'C2' || 'C3'){//dosomethingrecursive} 

每当我选择说,“A1”,它的作用就好像是选择不是=它。据我了解是错误的,或者我错过了什么?

+0

你认为'A2'转换为布尔值会是什么? – TZHX

+3

这不是JavaScript中的工作方式。您必须明确地对每个可能的值进行比较。 – Pointy

+0

我不知道这是什么意思 – Bartholomew

回答

0

你不能将英语句子翻译成这样的代码 - 代码的含义更加精确,在这种情况下不同。

你的代码计算

'A1' || 'A2' || 'A3' || 'B1' || 'B2' || 'B3' || 'C1' || 'C2' || 'C3' 

,然后将结果与choice。这不是你想要的。

您必须单独进行比较,例如

if (choice != 'A1') && (choice != 'A2') && ... 
+1

差不多。它正在评估'选择!='A1'',然后剩下的。你的结论是正确的。 – Krease

1

在JavaScript和我知道,布尔logic operators不要以这种方式结合所有的编程语言,他们遵循一个固定的bool OPERATOR bool架构。

这意味着您的一系列括号||首先被递增转换为单个值,然后将该值与您的choice进行比较。

达到你想要的逻辑最简单的方法是通过利用Array#every重复你的逻辑操作上的每个值,直到操作失败:

['A1', 'A2', 'A3', 'A4'].every(function(x) { x != choice }) 

翻译为:'choice' must be different from every value in 'array'

一般而言,每次您需要重复某些操作时,请考虑如何使用数组及其iterator methods来实现,它通常是最优雅的方式。

1

你不能这样写。 如果你不想(正确)链测试

if (choice != 'A1' && choice != 'A2' && ... 

和想要的东西更短,你可以把你的价值观在数组中,并测试choice不是数组的元素:

[ 'A1', 'A2', ... ].indexOf(choice) < 0 
+0

'choice'不是一个字符串,它是一个变量:) – PDKnight

+0

@PDKnight'choice'不是一个字符串?你怎么知道的 ? – Ilya

+1

将'.indexOf(“choice”)'改为'.indexOf(choice)'。 – PDKnight