有没有办法用块范围进行多重赋值和初始化?

Posted

技术标签:

【中文标题】有没有办法用块范围进行多重赋值和初始化?【英文标题】:Is there a way to do multiple assignment and initialization with block scope? 【发布时间】:2017-01-09 15:24:37 【问题描述】:

我想声明两个具有块作用域的变量并将它们初始化为相同的值。如果以下方法可以这样工作,那就太好了,但它没有......


  let a = b = "wang";

console.log("b:", b);

变量“a”具有块作用域,而变量“b”没有,它具有函数作用域,就好像它是用 var 声明的一样。

是否有单行*的方式来完成此任务或者我必须这样做...

let a, b;
a = b = "wang";

* 并不是说​​我会将可读性放在公共汽车下以节省您理解的几个字符,我只是好奇!

【问题讨论】:

不像var。它成为一个隐含的全局。不要这样做! @oriol 与var 完全一样,因此它成为一个隐式全局。像詹姆斯索普那样做 @edc65 不,它不像varvar 声明不会进入严格模式。隐式全局变量可以。 @Oriol 我希望 var 声明不总是抛出严格模式。你在想什么用例?我在严格模式下尝试了var a=b=1,它抛出“ReferenceError”。与let a=b=1 相同 @edc65 是的,那是因为var a=b=1let a=b=1 都只声明ab 已分配但未声明。因此,如果它之前没有在其他地方声明,它将成为草率模式下的全局变量,并将进入严格模式。这就是为什么应该避免这段代码的原因。 【参考方案1】:

您可以在单个 let 声明中执行此操作,如下所示:


  let a = "wang", b = a;

console.log("b:", b); //undefined or ReferenceError

因为ab 都在大括号内用let 声明,所以它们都获得了块作用域。您必须先分配a,以便在将其分配给b 之前将其分配。

【讨论】:

我觉得这是最好的方式 谢谢。为了便于阅读,最好只使用简短的表达式。【参考方案2】:

您可以使用数组destructuring 和fill 来避免重复值:


  let [a, b, c, d] = Array(4).fill("wang");
  console.log(a, b, c, d); // "wang", "wang", "wang", "wang"

a; // ReferenceError

如果您不想担心变量的数量并且不想分配大数组,您还可以使用立即调用的生成器函数表达式。为简单起见,将其实现为辅助函数可能是个好主意

const repeat = function*(value)while(true) yield value;

  let [a, b, c, d] = repeat("wang");
  console.log(a, b, c, d); // "wang", "wang", "wang", "wang"

a; // ReferenceError

【讨论】:

谢谢,这是一个聪明的方法。因此,我可能不会在愤怒中使用它,但知道总是很高兴;) function repeat(x) while(true) yield x; 应该被抽象成一个辅助函数。使用参数的好处是,在let [a, b, c] = repeat(…) 中,所有变量都共享参考值,而不是在每次迭代中生成副本。 @Bergi 是的,我认为如果值是对象或符号会出现问题。使用辅助函数是个好主意,谢谢。 同意,辅助函数使其更具可读性,如果您需要在多个地方或多个变量中执行此操作,这可能是最好的方法。感谢您更新您的答案。 @Bergi 再次感谢您的编辑,我不应该在赶时间时尝试解决问题【参考方案3】:

你可以试试

 let [a, b] = [3, 3]; console.log(a); console.log(b)

【讨论】:

【参考方案4】:

分配从右到左进行。所以,let 语句只适用于a 而不是b 所有其他变量在没有 var/let 语句的情况下都被视为全局变量,因此 b 将是全局变量

【讨论】:

以上是关于有没有办法用块范围进行多重赋值和初始化?的主要内容,如果未能解决你的问题,请参考以下文章

C# 中是不是有用于多重初始化的语法快捷方式?

如何使用 ruby​​ 的多重赋值为 void 变量赋值?

java 先初始化和赋值

ARC 085 NRE

局部变量,实例变量,静态变量

Go基础之变量