在 JavaScript 中,链式赋值可以吗?

     2023-02-25     227

关键词:

【中文标题】在 JavaScript 中,链式赋值可以吗?【英文标题】:In JavaScript, is chained assignment okay? 【发布时间】:2011-03-24 04:02:48 【问题描述】:

我对 JS 或其语法并不陌生,但有时,该语言的语义有时让我感到困惑。今天上班,有同事提到这个:

var a = b = [];

不一样

var a = [], b = [];

var a = []; var b = [];

因为第一个版本实际上将对空数组的引用分配给 a 和 b。我不能完全接受这是真的,但我不确定。大家觉得呢?

【问题讨论】:

见***.com/questions/1758576/… 谢谢你,Crescent Fresh - 我没有完全看到这个问题,因为我正在寻找“链式作业”。 这能回答你的问题吗? Multiple left-hand assignment with JavaScript 【参考方案1】:

是的,它们不一样。 var a = b = [] 相当于

var a;
b = [];
a = b;

不仅ab 都被分配了相同的值(对同一个空数组的引用),b 根本没有被声明。在 ECMAScript 5 及更高版本的 strict mode 中,这将抛出 ReferenceError;否则,除非在范围内已经存在变量b,否则b 会作为全局对象的属性静默创建,并且无论代码在哪里,甚至在函数内部,其行为都类似于全局变量。哪个不好。

你可以很容易地看到这一点:

(function() 
    var a = b = [];
)();

console.log(b); // Shows []

【讨论】:

我没有立即看到 b 是一个全局变量,谢谢! +1 避免分配给不可解析引用的另一个原因是,在 ES5 上,在严格模式下,将抛出 ReferenceError【参考方案2】:

你的同事是对的:

var a = b = [];
a.push('something');
console.log(b); // outputs ["something"]

但是:

var a = [],
  b = [];
a.push('something');
console.log(b); // outputs []

【讨论】:

【参考方案3】:

你的同事是对的。第一条语句创建一个新的空数组。然后,将此数组的引用分配给 b。然后,将相同的引用(这是赋值表达式的结果)分配给 a。所以 a 和 b 指的是同一个数组。

在所有其他情况下,您创建两个单独的数组。

顺便说一句:这种行为很常见,并且在所有基于 C 的编程语言中都是相同的。所以这不是 JavaScript 特有的。

【讨论】:

感谢您的回复,Tobias,也感谢您指出所有基于 C 语言的共性。 这个可以用JS中的数组来测试:["dog"] === ["dog"];返回false,但是var a = b = ["dog"]; a === b;返回true。【参考方案4】:

在第一个示例中,b 是对a 的引用,b 成为一个全局变量,可以从任何地方访问(它替换了可能已经存在于全局范围内的任何b 变量)。

【讨论】:

【参考方案5】:

补充已经提供的答案。 ref 赋值不同于 value 赋值

var x = y = 3; // by value
y++; // 4
x; // 3

var a = b = []; // by ref
b.push(1); // [1];
a; // [1]
a = [];
a.push(2); // [2];
b; // [1]

现在我们已经解决了 2 两个问题,您的问题还提到了 linting,这是“漂亮代码”(非功能性)的实践。其实JSHint has deprecated all their "pretty code rules"

话虽如此,我通常使用以下样式。-

var a, b, c, // first row all unassigned
    x = 1, // 1 row per assigned
    y = 2,
    list = [
       'additional',
       'indentation'
    ],
    obj = 
       A: 'A',
       B: 'B'
    ;
var z = y +2; // created a new `var` cluster since it uses a var from the previous

【讨论】:

【参考方案6】:

为此,您需要将 var 声明从链式赋值中分离出来(请参阅: http://davidshariff.com/blog/chaining-variable-assignments-in-javascript-words-of-caution/)。

例如

var one = 1, two = 2;

one = two = 3; /* Now both equal 3 */

但是如果你按照你描述的那样做(在这个例子中是var one = two = 3;two 会泄漏到全局空间中,而one 是在本地范围内声明的。

【讨论】:

C/C++ 中的链式赋值是未定义的行为吗?

】C/C++中的链式赋值是未定义的行为吗?【英文标题】:IschainedassignmentinC/C++undefinedbehavior?【发布时间】:2014-05-0118:57:30【问题描述】:忽略变量的类型,像a=b=c这样的表达式是否在C和C++中都定义了行为?如果是这样,谁能给我... 查看详情

java中可能有多少链式赋值?

】java中可能有多少链式赋值?【英文标题】:Howmuchchainedassignmentpossibleinjava?【发布时间】:2018-07-0102:50:49【问题描述】:例如inta,b,c,d,e,f,g,h,.........................;a=b=c=d=e=f=g=h=.............................=1;那么,在java中它可以用多长时... 查看详情

类型提示和链式赋值以及多重赋值

】类型提示和链式赋值以及多重赋值【英文标题】:Typehintsandchainedassignmentandmultipleassignments【发布时间】:2019-10-2921:45:21【问题描述】:我猜这两个问题是相关的,所以我将它们一起发布:1.-是否可以在链式赋值中加入类型提示... 查看详情

我可以为未在 PayPal 中注册的用户创建 PayPal 链式付款作为接收方吗?

】我可以为未在PayPal中注册的用户创建PayPal链式付款作为接收方吗?【英文标题】:CanicreatePayPalChainedPaymenttounregisteredinPayPaluserasreceiver?【发布时间】:2015-12-3013:44:25【问题描述】:我有一个应用程序,它需要在礼物发送者指定... 查看详情

我们可以在 if 语句中赋值吗?

】我们可以在if语句中赋值吗?【英文标题】:Canweassignavalueinsidetheifstatement?【发布时间】:2019-07-2315:31:02【问题描述】:#include<stdio.h>voidmain()intx=0;if(x=0)printf("It\'szero\\n");elseprintf("It\'snotzero\\n");为什么声明if(x=0)不是错误?我... 查看详情

可以在 Azure Pipelines 中完成条件变量赋值吗?

】可以在AzurePipelines中完成条件变量赋值吗?【英文标题】:CanConditionalVariableAssignmentbeDoneinAzurePipelines?【发布时间】:2019-12-2305:18:32【问题描述】:AzurePipelines有Expressions和Conditions,但我找不到根据条件将两个值之一分配给variabl... 查看详情

仅当 JavaScript 中的三元运算符中的条件为真时才赋值

】仅当JavaScript中的三元运算符中的条件为真时才赋值【英文标题】:AssignonlyifconditionistrueinternaryoperatorinJavaScript【发布时间】:2013-02-0704:28:17【问题描述】:在JavaScript中可以做这样的事情吗?max=(max<b)?b;换句话说,仅当条件为... 查看详情

在c语言中.结构体变量之间可以相互赋值吗

结构体变量直接赋值,就是其本身内存地址空间,按照地址分布直接赋值。所以两个一样的结构变量可以直接赋值。但是如果结构成员中有指针,且指针指向的地址大小不一样,是不能直接赋值的。参考技术A1、结构体变量是可... 查看详情

可以在android中调用javascript函数吗?

】可以在android中调用javascript函数吗?【英文标题】:Itispossibletocallajavascriptfunctioninandroid?【发布时间】:2020-04-3000:14:10【问题描述】:我知道我可以在android中执行函数并通过javascript调用它们,但我不知道是否可以在android(java)... 查看详情

javascript(声明,赋值)

在JavaScript中,函数即对象,程序可以随意操控它们。比如,JavaScript可以把函数赋值给变量,或者作为参数传递给其他函数,并且可以给它们设置属性,甚至调用它们的方法。函数定义一般函数定义的形式有以下几种:函数声明... 查看详情

我可以在 python 中同时进行变量赋值和列表插入吗?

】我可以在python中同时进行变量赋值和列表插入吗?【英文标题】:CanIdoavariableassignmentandlistinsertionatthesametimeinpython?【发布时间】:2016-10-3104:19:20【问题描述】:上下文:我想指定我希望我的脚本创建的一堆目录的名称。我想将... 查看详情

if 条件中的链式赋值

】if条件中的链式赋值【英文标题】:Chainingassignmentinanifcondition【发布时间】:2021-05-0501:08:27【问题描述】:您好,只是想知道如果您在if条件中使用链式分配,最左边的变量是否会用于检查if条件就像a=b=c一样,它的a最终被检查... 查看详情

是否可以在 JavaScript 构造函数中解构实例/成员变量?

】是否可以在JavaScript构造函数中解构实例/成员变量?【英文标题】:Isitpossibletodestructureinstance/membervariablesinaJavaScriptconstructor?【发布时间】:2016-11-0219:17:09【问题描述】:是否可以在JavaScript类的构造函数中使用解构赋值来将实... 查看详情

在 JavaScript 中存储执行状态?以后可以继续吗?

】在JavaScript中存储执行状态?以后可以继续吗?【英文标题】:StoringexecutionstateinJavaScript?Canyouresumelater?【发布时间】:2012-10-0303:07:19【问题描述】:有没有办法做到这一点?我想创建一个JavaScript应用程序,可以从最后一个检查... 查看详情

我甚至可以在javascript中使用元素的名称吗? [复制]

】我甚至可以在javascript中使用元素的名称吗?[复制]【英文标题】:Caniusenameofelementinjavascripteven?[duplicate]【发布时间】:2014-11-3000:19:57【问题描述】:我可以在javascript中使用元素的名称吗?对于使用id="xxx",我们使用$(\'#... 查看详情

我们可以在 JavaScript 中使用调度程序吗?

】我们可以在JavaScript中使用调度程序吗?【英文标题】:CanweuseschedulersinJavaScript[closed]【发布时间】:2013-06-1411:29:36【问题描述】:我想在JavaScript中使用调度程序。我的要求是我必须每10秒调用一次url,以便页面使用新加载的数... 查看详情

我可以在 Javascript 中使用 CSS calc 吗?

】我可以在Javascript中使用CSScalc吗?【英文标题】:CanIuseCSScalcwithinJavascript?【发布时间】:2017-04-1318:12:36【问题描述】:在JavaScript中设置位置时可以使用csscalc()函数吗?ePopup.style.top="calc(100px-1.5em)";【问题讨论】:我当然试过了... 查看详情

在 C++ 中,具有 const 数据成员的类可以没有复制赋值运算符吗?

】在C++中,具有const数据成员的类可以没有复制赋值运算符吗?【英文标题】:InC++,canaclasswithaconstdatamembernothaveacopyassignmentoperator?【发布时间】:2020-06-1711:29:32【问题描述】:我正在设计一个应该有一个名为K的常量数据成员的类... 查看详情