为什么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只能声明一次,因此使用该模式似乎是错误的。您所说的“工作正常”是什么意思?这段代码应该做什么?
    |