【问题标题】:How to check undefined variable in a ternary operator?如何检查三元运算符中的未定义变量?
【发布时间】:2018-07-17 11:39:22
【问题描述】:

我对三元运算有疑问:

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]]

【问题讨论】:

  • 为什么有一个未声明的变量?还是只需要检查undefined
  • 没错,就我而言,我希望有人可以为我提供该变量:D
  • 确切地说,我正在开发一个通用代码,可以说 abc 可能已定义也可能未定义
  • @KiranShakya 在这种情况下,您的代码typeof abc !== "undefined" 也失败了,对吧?因为abc 没有定义?
  • 不!为了澄清一点,我使用该部分作为三元运算的条件,如您在第 4 行中看到的那样

标签: javascript typescript ecmascript-6


【解决方案1】:

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

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

如果您需要处理未声明的abc,唯一安全的方法是使用typeof(没有try/catch):

typeof abc === "undefined"

如果abc 是一个未声明的标识符,那将是正确的,没有错误。如果声明了 abc 并包含值 undefined,这也是如此。

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

可能使用var 来确保它被声明:

var abc = abc || {};

重复的var 声明不是错误(重复的let 声明是)。因此,根据上述情况,如果 abc 未声明,则使用初始值 undefined 声明它,我们将其分配为 {}。如果它被声明,我们用{} 替换它的值,如果它是假的。 但是,如果它可能用letconst 声明也可能不声明,那么上面也会抛出一个错误。

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

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

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

【讨论】:

  • 感谢您提及我的拼写错误,所以这里只使用 typeof 是最好的选择吗?
  • @KiranShakya:(不用担心,“三位一体”一个词,只是不是这个这个词。:-))typeof 是检查标识符是否未声明而不会引发错误的唯一安全方法。不过,ReferenceError 是可捕获的,因此从技术上讲,您也可以使用 try/catch,但如果这不是例外情况(abc 未声明),它会更加冗长且效率较低。
  • var abc = abc || {}; 看起来需要注释为什么这是正确的,如果在代码中看到的话。
  • @NinaScholz:是的。我的意思是,这是一个常见的成语,但正如你所说,它看起来......错了。 :-) 我通常在我们将它用于伪命名空间的项目中评论它(例如,那些不使用正确模块的项目)。
  • @T.J.Crowder,所以如果我总是期望 object 是它的类型,那么我可以做let a = typeof abc === "object" ? abc : {}。从技术上讲,它更短更正确:)
【解决方案2】:

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

你也这么说

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

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

你可以试试

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

【讨论】:

    【解决方案3】:
       state = (typeof state !== "undefined") ? state : '';
    

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

    【讨论】:

    • 谢谢,简单,我在找什么
    猜你喜欢
    • 2022-10-18
    • 1970-01-01
    • 2017-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-27
    • 1970-01-01
    相关资源
    最近更新 更多