在'IF'条件语句内部进行变量赋值

5

在PHP中,类似这样的代码是可以的:

<?php
    if ( !$my_epic_variable = my_epic_function() ){
        // my epic function returned false
        // my epic variable is false
        die( "false" );
    }

    echo $my_epic_variable;
?>

我认为这是一个更简短的做法:

$my_epic_variable = my_epic_function();
if ( !$my_epic_variable ){
        die( "false" );
}

这个问题能在JavaScript中完成吗?我尝试过但没有成功,不确定是否有某种特殊的语法或其他东西。


顺便提一下,在这种情况下,使用额外的括号是一个好主意,以使意图更加清晰:if((foo = bar())) - ThiefMaster
这要视情况而定......您想实现什么?JavaScript相当“独特”,因此为了获得最佳结果,请提供更多信息... - benqus
4个回答

4

您可以使用JavaScript 完成相同的操作,但有一个关键区别。 您不能在 if 语句中(局部作用域内)声明 变量,只能引用它。

因此,必须先声明它:

var someVar;

然后您可以按照自己的需求使用它:
if (!(someVar = someFunction())) { /* do some stuff */ }

请注意,您还必须将否定表达式(!(expression))用括号括起来。
然而,以下方法不起作用:
if (var someVar = someFunction()) { /* NOPE */ }

1
在 if 语句中,你不能声明一个局部变量,因为它需要使用 var 关键字。不过,你可以声明一个全局变量(尽管一般来说这是个不好的主意)。 - Anthony Grist
@AnthonyGrist 指出得很好 - 我已更新我的答案以反映您的评论。 - jlb
@AnthonyGrist,这里的真正问题是你不再使用表达式而是语句了。 - Knu

3

是的,那样做很好。但是,如果你要使用反向操作符(!), 那么你需要将赋值语句用括号括起来,否则会导致语法错误。

function myFunc() {
    return false;
}

if(!(myVar = myFunc())) {
    console.log('true');
}    

Working example


2

它在JS中也可以工作:

var foo = null;

if ( foo = 1 ){
 // some code
}

alert (foo);  // 1

甚至可以在函数中使用赋值运算符:

var foo = null;

function getFoo(){
    return 1;
}

if ( foo = getFoo() ){
 // some code
}

alert (foo); // 1

在使用否定语句时,需要添加括号:

var foo = null;

function getFoo(){
    return 1;
}

if (! (foo = getFoo()) ){
 // some code
}

alert (foo); // 1

在最后一种情况下,重要的是将赋值语句用括号括起来,因为!将用于检查其结果。

原始的问题不是来自于 ! 运算符吗?你的示例代码中没有使用它。 - user948581
@Tibo:为了保险起见,已经更新 :) - Sarfraz

2

对我来说,这是首选的方法(在PHP中),因为它清楚地表明您并不是想使用==条件而是犯了一个错误。

if ( ($my_epic_variable = my_epic_function()) !== NULL ){
    // my epic function returned false
    // my epic variable is false
    die( "false" );
}

如果是 JavaScript,我会这样做:

function my_epic_function() {
    return 5;
}

var my_epic_variable;
if ( (my_epic_variable = my_epic_function()) !== null ){
    alert("we're in");
}​

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接