Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/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_Variables_Variable Assignment - Fatal编程技术网

使用JavaScript进行多个左手赋值

使用JavaScript进行多个左手赋值,javascript,variables,variable-assignment,Javascript,Variables,Variable Assignment,这相当于: var var1 = 1, var2 = 1, var3 = 1; var var1 = var2 = var3 = 1; 我很确定这是变量定义的顺序:var3,var2,var1,这相当于: var var1 = 1, var2 = 1, var3 = 1; var var1 = var2 = var3 = 1; 有没有办法在JavaScript中确认这一点?可能使用一些探查器?尝试以下操作: var var3 = 1, var2 = var

这相当于:

var var1 = 1,
    var2 = 1,
    var3 = 1;
var var1 = var2 = var3 = 1;
我很确定这是变量定义的顺序:var3,var2,var1,这相当于:

var var1 = 1,
    var2 = 1,
    var3 = 1;
var var1 = var2 = var3 = 1;
有没有办法在JavaScript中确认这一点?可能使用一些探查器?

尝试以下操作:

var var3 = 1, var2 = var3, var1 = var2;
请注意第一个警报中的单个“=”。这将显示赋值表达式的结果是赋值,第二个警报将显示赋值已发生


从逻辑上讲,赋值必须从右向左链接。然而,由于这对javascript来说是原子的(没有线程),特定的引擎可能会选择稍微不同的方式来实际优化它。

javascript中的赋值从右到左进行<代码>var var1=var2=var3=1

如果这些变量中的任何一个的值在此语句之后是
1
,则逻辑上它必须从右侧开始,否则该值或
var1
var2
将是未定义的

您可以将其视为等价于
var1=(var2=(var3=1))首先计算最里面的一组括号。

实际上

var var1=42;
var var2;

alert(var2 = var1); //show result of assignment expression is assigned value
alert(var2); // show assignment did occur.
不等同于:

var var1 = 1, var2 = 1, var3 = 1;
区别在于范围界定:

功能良好(){
var1=1,var2=1,var3=1;
}
函数坏(){
VarVar1=var2=var3=1;
}
好的();
console.log(window.var2);//未定义
坏的();
console.log(window.var2);//1.啊

(a和&b)
在逻辑上是
(a?b:a)
,其行为类似于乘法(例如
!!a*!!b

(a | | b)
在逻辑上是
(a?a:b)
,行为类似于加法(例如
!!a+!!b

(a=0,b)
是不关心
a
是否真实的缩写,隐式返回
b


请注意,逗号运算符实际上是特权最低的运算符,但括号是特权最高的运算符,并且在构造单行表达式时,它们是并驾齐驱的


最终,您可能需要“thunk”而不是硬编码的值,对我来说,thunk既是函数也是结果值(同一个“东西”)

你可以从容地完成这件事

const windowInnerHeight = () => 0.8 * window.innerHeight; // a thunk

windowInnerHeight(); // a thunk
[{a:true},{b:true},{c:true}]

var1=1,var2=1,var3=1

在这种情况下,
var
关键字适用于所有三个变量

for x in [ 'a', 'b', 'c' ] then "#{x}" : true
这不等于:

var var1 = 1,
    var2 = 1,
    var3 = 1;
var var1 = var2 = var3 = 1;
VarVar1=var2=var3=1

在这种情况下,由于变量提升,屏幕后面的
var
关键字仅适用于
var1
,表达式的其余部分计算正常,因此变量
var2、var3
变为全局变量

Javascript按以下顺序处理此代码:

var var1 = 1,
    var2 = 1,
    var3 = 1;

现在很清楚,它们是不同的。编写代码的方法是

/*
var 1 is local to the particular scope because of var keyword
var2 and var3 will become globals because they've used without var keyword
*/

var var1;   //only variable declarations will be hoisted.

var1= var2= var3 = 1; 
那么,让我们来做些什么呢?与var完全相同,不要因为块范围而让let assignment迷惑您

var var1, var2, var3
var1 = var2 = var3 = 1
我们可以做到以下几点:

let var1 = var2 = 1 // here var2 belong to the global scope

注意:顺便说一句,我不建议在同一行中使用多个赋值,甚至不建议使用多个声明。

Dang,这是出乎意料的。谢谢你的提示,我会小心的。我不明白。。。为什么bad()中的变量不在函数范围内?当函数完成时,它们不应该被垃圾收集吗?@skinyg33k,因为它是从右向左的。因此,它将在最左边之前解析最右边的。所以
var1=var2
发生在
var3=1
之后和
var2=var3
之后。就像
var3=1;var2=var3;var var1=var2
只需注意:如果你知道你想提前做这类事情,你仍然可以从作业中分解定义。所以:
var v1、v2、v3随后:
v1=v2=v3=6它们仍然在本地范围内。由于David提到了警报,这将按预期工作(如果在var之前):
警报(v1=v2=v3=6)完全正确。但是如果我们遵循一些常见的最佳实践,在这种情况下,通过在顶部声明变量,我们可以避免不必要的错误,并避免局部变量泄漏到全局范围。看:谢谢,这绝对有帮助。这有助于思考如果不是从右向左求值会抛出什么错误(在本例中,错误是var1/var2未定义)。这实际上是一个语法错误。您不能在
var
之后立即使用
)。删除外部括号集允许它编译时不会出错,
var var1=(var2=(var3=1))当时我觉得它没有很好地说明这一点,但我想它是一样的。
var-var1=var2=var3=1;
等于
var-var3=1;var-var2=var3;var-var1=var2;
谢谢你的回答。我想我正在寻找一种方法,在保持多重赋值结构的同时使用警报是的(a=b=c),但我认为这是不可能的。像javascript中那样的单个语句(虽然有几个表达式,但都可以用一个语句实现)可以被认为是原子的。你必须将其分解。这并不能真正回答问题。请重新阅读问题。谁在乎咖啡脚本赋值从右到左?如果我使用
This.var1=This.var2=This.var3=1
,这也适用吗?是的,直到它是全局变量,因为
This
引用了window反对。