1

我试图将一个变量与一个值进行比较,结果意外地使用 '=' 代替了 '==' 因此代码看起来像:

var test = 1;
if(test = 2) {
 console.log(test);
}

代替:

var test = 1;
if(test == 2) {
 console.log(test);
}

我假设该值已成功分配给变量,因此条件返回真实console.log()并被执行。我的假设正确吗?除了Yoda Condition 参考之外,避免此类错误的良好编码实践是什么

4

7 回答 7

3

起绒_ 有些工具可以自动分析您的 Javascript 并捕获此类常见错误。

于 2013-08-05T23:38:42.370 回答
2

JavaScript 中的赋值运算符 ( =) 计算为表达式的右侧值,这意味着test = 2计算结果为2并且由于所有不为假的值 ( 0, false, null, undefined, '', NaN) 根据定义都是真实的,因此输入了 if 条件。

===一个好的做法是在检查相等和不相等时始终使用符号,!==并且有一些工具可以帮助您执行这些规则,例如JSHint

于 2013-08-05T23:44:04.910 回答
1

编辑:没有看到提问者要求避免这种方法。

使用严格的比较运算符 (===)。您还可以更改正在比较的值的顺序,如果您使用赋值语句而不是比较运算符,则会失败。

失败:

var test = 1;
if(2 = test) {
 console.log(test);
}

上面的代码将抛出异常,因为您不能为常量值赋值。

作品:

var test = 1;
if(2 == test) {
 console.log(test);
}
于 2013-08-05T23:45:09.317 回答
1

使用if (a === b) { do stuff ; } 三个等于,===

在 Javascript 中,您经常需要三个等号,===因为这要求原语具有相同的类型和值,并且不会执行类型强制,尽管您没有提到它,但这可能是另一个混​​乱的来源。

如果您不使用等号,它就会变成两个等号比较,a == b如果您是初学者或不知道 Javascript 中这种比较的怪癖,这可能不会像预期的那样工作,但至少不是一个作业。

于 2013-08-05T23:36:01.697 回答
1

JavaScript 中的答案很简单:总是使用严格比较。这不仅可以避免赋值错误,还可以避免一些可能来自 JavaScript 的弱比较规则的非直观行为。

于 2013-08-05T23:36:35.880 回答
0

当您分配某些东西时,返回的值并不代表分配是否成功,它实际上只是返回分配的右侧(例如,test = 2inif (test = 2)将返回2在 JavaScript 中是“真实的”,从而导致console.log(test)评估. 这实际上在某些情况下非常有用。例如:

while ((value = retrieveSomeValue()) !== null) {
    console.log(value);
}

上面的代码不断地将一些变量分配给value一些函数的结果retrieveSomeValue,测试结果值以确保它不为空,然后执行 while 主体。

不过要回答您的问题:===运算符更容易与=运算符区分开来,并且可能表现得更像您对==. 在 JavaScript 比较中应该使用哪个等号运算符(== vs ===)?

于 2013-08-06T00:01:07.880 回答
0

a = b是一个任务。意思是a将等于b。

a == b是一个比较。意思是 a 等于 b。

a === b==与未进行类型转换相同。含义 a 等于 b,但它也是相同的对象/类型吗?

你的代码哪里出错了

var test = 1;
if(test = 2) { //this is true, because test now equals 2.
   console.log(test);
}
于 2013-08-05T23:39:36.033 回答