【问题标题】:Swapping variable JS交换变量 JS
【发布时间】:2021-06-21 06:19:44
【问题描述】:

我用这种方式交换变量:

let a = 1;
let b = 2;
[a, b] = [b, a];

为什么这种方式只适用于最后的分号?同时JS不用分号也能正常工作。

【问题讨论】:

标签: javascript


【解决方案1】:

这是因为这部分代码:

let b = a
[a, b] = [b, a]

被解释为:

let b = a[a, b] = [b, a]

这意味着:

let b;          // Create variable b.

b = a[b];       // Assign to b the value of property b of a
                // for example if the value of b is "hello"
                // then b = a.hello. If the value of b is 0
                // then b = a[0];

a[b] = [b, a];  // Assign the array containing b and a to
                // property b of a. For example if the
                // value of b is "hello" then
                // a.hello = ["hello", a]

b = a[b];       // Assign the property b of a to b. For example
                // if the value of b is originally "hello" then
                // b = a.hello

这是为什么?这是因为行尾在 javascript 中的工作方式。该算法称为自动分号插入。在 javascript 中,行尾不是语句的结尾。这允许我们编写多行语句。但是,如果行尾恰好是语句的结尾,那么 javascript 会自动插入分号。

这是如何工作的一个例子。如果 javascript 看到:

let a
let b

它会首先尝试将其解析为:

let a let b

这当然是语法错误。所以javascript会尝试在行尾插入分号并重试:

let a;
let b

这导致它被解析为:

let a; let b

这是有效的语法,所以 javascript 很高兴。

但是,假设你给 javascript 这段代码:

let a
[a, b] = [10 20]

Javascript 会尝试将其解析为:

let a[a, b] = [10 20]

这是有效的语法,因为a[x] 只是访问a 的属性x。但是逗号呢?它仍然是有效的语法。它被称为逗号运算符。逗号运算符是类似于+- 的运算符。逗号运算符的工作方式是:

  1. 评估逗号左侧然后忽略结果
  2. 计算逗号右边然后返回结果。

所以代码:

a = 1, 2

等同于:

1
a = 2

这可能看起来完全没用,但有时很有用(只是有时 - 大多数人从未找到它的用途)。但是,它是 javascript 语法的一部分,所以代码:

a[a,b]

是有效的语法。它只是意味着a[b]

所以 javascript 对你的代码的理解与你不同。

standard.js 项目推广了从 javascript 代码中删除分号。如果您想使用不带分号的 javascript 您必须遵循 STANDARD.JS 规则。否则做我做的,总是使用分号。

您可以在以下位置找到关于如何不使用分号的规则:https://standardjs.com/rules.html#semicolons

它包括如下规则:

切勿以 (、[、` 或其他一些不太可能的可能性开始一行。

Standard.js 希望您这样编写代码:

let a = 1
let b = 2
;[a, b] = [b, a]   // <<------- semicolon at start of this line!!

我个人更喜欢在每行末尾看到分号,但这取决于你。

【讨论】:

    【解决方案2】:

    你可以在这里使用简单的方法。

    let a = x;
    let b = y;
    let temp = a;
    a = b;
    b = temp;
    

    我认为这是最好和最快的方法。

    【讨论】:

    • 这并没有回答问题,实际上是问题中代码的劣质版本。
    猜你喜欢
    • 2023-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-07
    • 2015-01-19
    • 2013-03-07
    • 1970-01-01
    相关资源
    最近更新 更多