使用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反对。