有没有办法用块范围进行多重赋值和初始化?
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 不,它不像var
。 var
声明不会进入严格模式。隐式全局变量可以。
@Oriol 我希望 var 声明不总是抛出严格模式。你在想什么用例?我在严格模式下尝试了var a=b=1
,它抛出“ReferenceError”。与let a=b=1
相同
@edc65 是的,那是因为var a=b=1
和let a=b=1
都只声明a
。 b
已分配但未声明。因此,如果它之前没有在其他地方声明,它将成为草率模式下的全局变量,并将进入严格模式。这就是为什么应该避免这段代码的原因。
【参考方案1】:
您可以在单个 let
声明中执行此操作,如下所示:
let a = "wang", b = a;
console.log("b:", b); //undefined or ReferenceError
因为a
和b
都在大括号内用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
将是全局变量
【讨论】:
以上是关于有没有办法用块范围进行多重赋值和初始化?的主要内容,如果未能解决你的问题,请参考以下文章