为什么JavaScript';s null合并运算符(| |)不适用于es6变量(let/const)?
为什么为什么JavaScript';s null合并运算符(| |)不适用于es6变量(let/const)?,javascript,ecmascript-6,var,let,null-coalescing-operator,Javascript,Ecmascript 6,Var,Let,Null Coalescing Operator,为什么var-APP=APP |{}工作正常,但const-APP=APP | |{}否?或者让APP=APP | |{}来解决这个问题 Uncaught ReferenceError: APP is not defined 因为这只与应用程序的评估有关,而与它设置的内容无关 为什么var-APP=APP |{}工作正常,但const-APP=APP | |{}否 让我们澄清如何评估这些语句。在执行任何代码之前,运行库将查找所有变量声明,并为当前范围中的每个变量创建一个条目。一段时间后,当执行
var-APP=APP |{}代码>工作正常,但const-APP=APP | |{}代码>否?或者让APP=APP | |{}
来解决这个问题
Uncaught ReferenceError: APP is not defined
因为这只与应用程序的评估有关,而与它设置的内容无关
为什么var-APP=APP |{}代码>工作正常,但const-APP=APP | |{}代码>否
让我们澄清如何评估这些语句。在执行任何代码之前,运行库将查找所有变量声明,并为当前范围中的每个变量创建一个条目。一段时间后,当执行APP=APP |{}
时,APP
的值在被赋值之前被读取
它与var
一起“工作”,因为var
声明是用未定义的值隐式初始化的。因此,在为变量赋值之前访问变量将返回未定义的
const
和let
声明保持未初始化状态。在从初始声明中为它们分配值之前,您无法访问它们。这也称为或TDZ
以下是一个简化的示例:
console.log(foo);//未定义
var-foo=42;
console.log(foo);//42
为什么var-APP=APP |{}代码>工作正常,但const-APP=APP | |{}代码>否
让我们澄清如何评估这些语句。在执行任何代码之前,运行库将查找所有变量声明,并为当前范围中的每个变量创建一个条目。一段时间后,当执行APP=APP |{}
时,APP
的值在被赋值之前被读取
它与var
一起“工作”,因为var
声明是用未定义的值隐式初始化的。因此,在为变量赋值之前访问变量将返回未定义的
const
和let
声明保持未初始化状态。在从初始声明中为它们分配值之前,您无法访问它们。这也称为或TDZ
以下是一个简化的示例:
console.log(foo);//未定义
var-foo=42;
console.log(foo);//42来自:
在ECMAScript 2015中,let绑定不受变量提升的约束,这意味着let声明不会移动到当前执行上下文的顶部。在初始化之前引用块中的变量会导致ReferenceError(与使用var声明的变量相反,该变量只具有未定义的值)。从块的开始到初始化处理,变量处于“时间死区”
这同样适用于:
所有关于“暂时死区”的考虑都适用于let和const
换言之,这样做的原因是:
var APP = APP || {};
是因为可变起重,将上述情况转化为:
var APP; // <-- declares APP
APP = APP || {}; // <-- initializes APP
最后,对于记录(正如正确指出的,|
运算符不是一个空合并运算符,而是一个短路或运算符
关于这一点的混淆可能是因为这样的陈述:
var n = n || '';
对于上述声明,有两件事需要记住
n
不是null
。。。它是未定义的
(与
空)
由于可变起重,该语句相当于:
var n; // n has the value of undefined
n = n || ''; // the comparison is now: undefined || '';
由于undefined
是一个“falsy”值,短路或运算符返回第二个值
这种行为也适用于null
,因为null
也是“虚假的”。来自:
在ECMAScript 2015中,let绑定不受变量提升的约束,这意味着let声明不会移动到当前执行上下文的顶部。在初始化之前引用块中的变量会导致ReferenceError(与使用var声明的变量相反,该变量只具有未定义的值)。从块的开始到初始化处理,变量处于“时间死区”
这同样适用于:
所有关于“暂时死区”的考虑都适用于let和const
换言之,这样做的原因是:
var APP = APP || {};
是因为可变起重,将上述情况转化为:
var APP; // <-- declares APP
APP = APP || {}; // <-- initializes APP
最后,对于记录(正如正确指出的,|
运算符不是一个空合并运算符,而是一个短路或运算符
关于这一点的混淆可能是因为这样的陈述:
var n = n || '';
对于上述声明,有两件事需要记住
n
不是null
。。。它是未定义的
(与
空)
由于可变起重,该语句相当于:
var n; // n has the value of undefined
n = n || ''; // the comparison is now: undefined || '';
由于undefined
是一个“falsy”值,短路或运算符返回第二个值
这种行为同样适用于null
,因为null
也是“虚假的”。well const只能声明一次,所以使用这种模式似乎是错误的。也许你所说的“工作正常”是什么意思?这段代码应该做什么?|
是JavaScript的逻辑OR–它可以用来合并错误的值,但它不是空合并运算符。这很可能是因为var
实际上是var-App=undefined;APP=APP |{}
由于var吊装。对let
执行同样的操作,它也会起作用。Well const只能声明一次,因此使用该模式似乎是错误的。您所说的“工作正常”是什么意思?这段代码应该做什么?|
是