如何在三元运算符中检查未定义的变量?

时间:2018-02-07 08:50:24

标签: javascript typescript ecmascript-6

我遇到三元操作问题:

let a = undefined ? "Defined!" : "Definitely Undefined",
    b = abc ? "Defined!" : "Definitely Undefined", // ReferenceError
    c = (abc !== undefined) ? "Defined!" : "Definitely Undefined", // ReferenceError
    d = (typeof abc !== "undefined") ? "Defined!" : "Definitely Undefined"

// results: a = d = "Definitely Undefined", 
// while b and c throw ReferenceError when abc is undefined

在访问其属性之前检查abc是否为undefined以及如果指定空白对象{} 最佳和简短 是什么? undefined

let a = [[best way to check abc]] ? {[abc.label1]: 2, [abc.label2]: 1} : {}

PS:我目前正在使用(typeof abc !== "undefined")代替[[best way to check abc]]

3 个答案:

答案 0 :(得分:7)

  

当abc未定义时,b和c抛出ReferenceError

所以abc不仅仅是未定义的,而是未声明的。那里有很大的不同。

如果您需要处理未声明的abc,那么唯一安全的方式(try / catch}就是typeof

typeof abc === "undefined"

如果abc是未声明的标识符,那将是真的,没有错误。如果声明abc并且包含值undefined

,也会如此
  

在访问其属性之前检查abc是否未定义以及在未定义时分配空白对象{}的最佳和简短方法是什么?

可能使用var来确保声明:

var abc = abc || {};

重复var声明不是错误(重复let声明)。因此,如果使用上述内容,如果abc未声明,则会使用初始值undefined声明它,并为其分配{}。如果它已声明,如果它是假的,我们用{}替换它的值。 但是,如果它可能会或可能不会声明为letconst,那么上述内容也会产生错误。

因此,为了处理可能会或不会使用letconst声明的情况,我们需要完全不同的变量:

let ourabc = typeof abc === "undefined" || !abc ? {} : abc;

如果ourabc未声明或者包含假值,则会将{}设置为abc。由于所有非null对象引用都是真实的,并且您已经说过要访问对象属性,这可能是最短的方式。

答案 1 :(得分:2)

   state = (typeof state !== "undefined") ? state : '';

这样,您可以在三元运算符中检查未定义的变量。

答案 2 :(得分:0)

  

在访问其属性之前检查abc是否未定义以及在未定义时分配空白对象{}的最佳和简短方法是什么?

你说那个

我目前正在使用(typeof abc!==" undefined")

看起来你已经定义了abc,值为undefined

您可以尝试

var a = abc || {};
console.log(a);