Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/402.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 赋值返回的值_Javascript_Assignment Operator - Fatal编程技术网

Javascript 赋值返回的值

Javascript 赋值返回的值,javascript,assignment-operator,Javascript,Assignment Operator,为什么常规赋值语句(例如,x=5)返回赋值(5,在本例中),而赋值与变量声明(var x=5)组合返回未定义的 我通过在Chrome浏览器的Javascript控制台中执行以下语句获得返回值: > var x = 5; undefined > y = 5; 5 当您写入var x=5时它声明x并将其值初始化为5 这是一个可变语句,它不返回任何内容 但是x=5是一个表达式,它将5赋值给x。 由于没有x,JavaScript隐式地在普通代码中创建一个全局x,这就是语言的设计方式。它与大

为什么常规赋值语句(例如,
x=5
)返回赋值(
5
,在本例中),而赋值与变量声明(
var x=5
)组合返回
未定义的

我通过在Chrome浏览器的Javascript控制台中执行以下语句获得返回值:

> var x = 5;
undefined
> y = 5;
5

当您写入
var x=5时
它声明
x
并将其值初始化为5

这是一个
可变语句
,它不返回任何内容

但是
x=5
是一个
表达式,它将5赋值给x。

由于没有
x
,JavaScript隐式地在普通代码中创建一个全局
x
,这就是语言的设计方式。它与大多数语言一致

让变量声明返回除
undefined
之外的任何内容都是毫无意义的,因为您永远不能在表达式上下文中使用
var
关键字

当您希望同时将多个变量设置为相同的值时,将赋值设置为
表达式
而不是
语句
非常有用:

x = y = z = 2;
它也可以这样使用:

x = 2*(y = z); // Set y = z, and x = 2*z
a = var x = y = 5;
但是,这不是最可读的代码,最好编写为:

y = z;
x = 2*z;

我编辑了我的答案,因为有评论和其他一些答案

赋值运算符不返回任何内容。。。在下面的示例中,JS解析器做的第一件事是将5赋值给y。第二件事是将y赋值给x,依此类推。赋值不是<代码>返回<代码>(它不是函数,在JS中它没有C++语法来重载运算符的行为)。代码>返回
比赋值更复杂
return
construct不仅返回一个值,而且关闭当前上下文导致它被销毁。此外,如果没有其他子级使用它,它将关闭任何父上下文(闭包模式)。所以,请不要(在注释中)告诉我赋值运算符返回任何值。JS中的赋值运算符只是一种语言构造

这种语言结构在链中很有用(这就是为什么每个人都在谈论返回):

任何未声明的变量都由全局范围内的解析器自动声明。如果显式声明变量,则不能同时在链中使用它,如下所示:

x = 2*(y = z); // Set y = z, and x = 2*z
a = var x = y = 5;
正确使用上述代码应为:

var x = y = 5;
a = x;
当然,为了使代码更清晰,可以使用括号,但这并不意味着代码的行为类似于函数


另外,您的示例仅在JS控制台中工作,它不返回而是打印语句或表达式的结果。这意味着JS控制台将变量声明的结果视为
未定义的
(创建函数时相同:
函数a(){}
)。

这是因为
变量x=5是一个变量语句,而不是表达式

中描述了此语句的行为

  • 计算VariableDeclarationList
  • 返回(正常、空、空)
  • 这基本上是一个返回值。

    赋值运算符(即等号)(1)将右侧操作数(即变量、属性或函数的值)赋值给左侧操作数(即变量或属性),然后(2)赋值表达式(例如y=10)在对表达式的其余部分求值之前,变为一个简单操作数,其值与其右侧操作数(例如10)相同。这类似于在计算表达式时用其返回值替换被调用函数(尽管函数调用按操作顺序排在第一位,赋值操作排在第十四位):

    请注意,现在不仅x等于3,而且整个表达式的计算结果也为3

    var
    关键字的作用是将变量绑定到当前范围。使用
    var
    关键字声明的变量绑定到声明它们的范围。
    var
    关键字指定最左边的变量(或属性)作为对计算表达式值的引用:

    var fun = function () {
        var x = 1;
        var y = x + 1; 
        return y;
    }
    
    // The x and y variables are bound to the scope of the fun function.
    

    var
    关键字与表达式一起使用称为声明。声明是不计算为值的操作,甚至不是未定义的(即使您的控制台正在打印未定义的)。此外,声明不能出现在JavaScript需要表达式的地方,正如本文的其他答案所示。

    可能的重复。看看kangax的答案。“
    var x=1
    在当前范围内声明变量
    x
    (也称为执行上下文)另一方面,…
    x=1
    ,只是一个属性赋值。它首先尝试根据作用域链解析
    x
    。如果它在该作用域链中的任何位置找到它,则执行赋值;如果它没有找到
    x
    ,则只在全局对象上创建
    x
    属性。这很有趣。。我从来没有注意到这一点!我认为
    x=5
    是一个能够返回值的表达式,而
    var x=5
    是一个不能返回值的语句。这一点最明显的是,您不能内联声明变量,即
    console.log(var x=5)
    。你从哪里得到
    undefined
    的返回值?是什么样的例子让你认为x=5实际上“返回”?@AbbyChauYuHoi我也不同意
    return
    关键字,但我的答案出于某种原因被否决了。我不明白这些人…另一个x=5是什么?这是一个赋值操作。我相信没有其他限定条件的
    x=5
    等同于
    window.x=5
    ,或者不管全局对象是什么。问为什么变量声明加上一个(可选)有意义吗Javascript将赋值分类为
    语句
    ,而不是
    表达式
    ?如果Javascript将变量声明视为表达式(可在其他表达式中使用等),会有什么中断?@user10165