我遇到三元操作问题:
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]]
答案 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
声明它,并为其分配{}
。如果它已声明,如果它是假的,我们用{}
替换它的值。 但是,如果它可能会或可能不会声明为let
或const
,那么上述内容也会产生错误。
因此,为了处理可能会或不会使用let
或const
声明的情况,我们需要完全不同的变量:
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);