javascript中if语句中的单等号是如何工作的

IT技术 javascript
2021-03-19 14:37:04

最近我在互联网上看到一个在 javascript 中有效的语句,我想知道我主要在 if 语句中使用的 javascript 中单个等号 (=) 的含义是什么。
它是一个包含双等号 (==) 的比较函数

if(i = 1) {
    alert(i);
}

这是有效的,我想知道当 if 语句被分配给变量 i 的值 1 并检查 i 的值时会发生什么,它与以下内容相同:

i = 1
if(i) {
    alert(i)
}

但是我很快意识到赋值变量需要有关键字 var 所以我将代码更改为:

  if(var i = 1) {
        alert(i);
  }

这次代码不起作用。为什么?

6个回答

您分析的第一部分当然是正确的。

现在,有趣的部分可能是为什么您的最后一个代码if (var ...) {不起作用。

它不起作用,因为

1)

var something

是一个语句,而不是一个表达式。

2) 以下是 ECMAScript 定义if 语句的方式

如果语句:

if ( 表达式 ) 语句 else 语句

if(表达式)语句

您必须在if子句中放置表达式,而不是语句。

在这篇文章中更多地了解表达式与语句。

那么 {i=0} 被认为是一个表达式或语句?
2021-04-27 14:37:04
i=0是一个可以用作语句的表达式(反之则不然)。并且{i=0}是一个声明。
2021-05-13 14:37:04

如果您检查控制台,它会显示Unexpected token var. 你只是不应该在 if 语句的条件下声明变量。

如果您确实想在条件内进行赋值,只需先声明变量,如下所示:

var i;
if(i = 1){
   alert(i);
}

不过,我看到您已经知道赋值和比较之间的区别,这很好:)

Single=是一个赋值运算符,在 if 语句中总是等于 true(假设它是一个非负值)。

Double =,如==,是一个比较,仅当运算符任一侧的值相等时才等于 true 。

假设它是一个非负值”应该读作“假设它不是一个假值”。说“一个赋值运算符并且总是等于真充其量是一种误导你应该说“赋值的真值与被赋值的值的真值相同”。
2021-04-24 14:37:04
@MightyPork Juhana 的反对意见并不是这个答案中的信息是错误的(尽管根据我的第一条评论,其中有些错误的),而是它不完整提供有力解释的答案并没有错(例如,纠正问题中的误解),但没有实际解决特定问题的有力解释是不够的。
2021-04-29 14:37:04
if (x = "") 总是假的
2021-05-04 14:37:04
这并没有回答为什么if( var i = 1 )不起作用的问题
2021-05-04 14:37:04
@MightyPork 那肯定至少会回答所写的问题(“这次 [with var] 代码不起作用,为什么? ”)。
2021-05-10 14:37:04

单个“=”表示“分配给左边的变量”。

作为 IF 的返回值,您将获得分配的值,因为它是 1,所以执行“true”分支。

但是,如果您将“var”放入 IF,它不会返回分配的值,我认为它甚至根本不起作用。

误认为“=”和“==”是一个常见的错字。

Single=确实是一个赋值,如果你把它放在 if 条件中,它不会i与 1进行比较,而是将变量赋值为i1,然后将该值用作条件本身,从而得到i一个真值。所以是的,它与您的第二个示例相同。

此外,在 javascript 中最好使用===而不是==如果您期望项目是相同的类型:

if (1 == '1') {
  alert('this is true'); // where you might actually expect it to be false, 

在这种情况下,如果您使用三重等号 ( ===) ,它将正常工作

if (1 === '1') {
  alert('this is false'); // which is expected
}
@MightyPork 怎么样?让我改进它。
2021-04-22 14:37:04
您的最后一个令人困惑,因为它意味着alert即使 if 语句为假也会运行 - 尝试将 if 块设为空并将警报置于 else 语句下。
2021-04-27 14:37:04
这篇文章令人困惑。
2021-05-01 14:37:04
好吧,也许it不是very好主意,to使所有其他wordcode block它让我的眼睛跳了起来,真的 - 但它可能只是我。另外,你给出的例子与 OP 要求的完全不同,但这是另一回事。
2021-05-05 14:37:04
@edgarjs 对这么多编辑感到抱歉,我一直看到一些不太对劲的地方。我想我抓住了你最初的意思并添加了信息以更准确地回答所提出的问题
2021-05-20 14:37:04