Javascript 如何检查三元运算符中未定义的变量?
我对三元操作有问题:Javascript 如何检查三元运算符中未定义的变量?,javascript,typescript,ecmascript-6,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 !== "und
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属性之前,检查abc是否未定义
,以及在未定义
时分配空白对象{}
的最佳捷径是什么
let a = [[best way to check abc]] ? {[abc.label1]: 2, [abc.label2]: 1} : {}
PS:我目前正在使用(abc的类型!=“未定义”)
代替[[检查abc的最佳方法]]
当abc未定义时,b和c抛出ReferenceError
因此,abc
不仅仅是未定义的,它是未声明的。这有很大的区别
如果需要处理未声明的abc
,唯一安全的方法是使用typeof
:
typeof abc === "undefined"
如果abc
是未声明的标识符,则这将是正确的,没有错误。如果声明了abc
,并且包含值undefined
,则也是如此
在访问其属性之前,检查abc
是否未定义以及在未定义时分配空白对象{}
的最佳快捷方法是什么
可能使用var
来确保声明:
var abc = abc || {};
重复的var
声明不是错误(重复的let
声明是错误)。因此,在上面,如果abc
是未声明的,它将使用初始值undefined
声明,我们将其赋值为{}
。如果它被声明,如果它是falsy,我们将其值替换为{}
但是,如果它可以或不可以用let
或const
声明,那么上面的语句也将抛出一个错误
因此,为了处理可能会或可能不会使用let
或const
声明的情况,我们需要一个完全不同的变量:
let ourabc = typeof abc === "undefined" || !abc ? {} : abc;
如果abc
未声明或包含错误值,则将ourabc
设置为{}
。由于所有非空的对象引用都是真实的,并且您已经说过要访问对象属性,所以这可能是最短的方法
在访问abc的属性之前,检查abc是否未定义以及在未定义的情况下分配空白对象{}的最佳快捷方法是什么
你是这么说的
我目前正在使用(abc的类型!=“未定义”)
看起来您已定义abc,且值为未定义
你可以试试看
var a = abc || {};
console.log(a);
这样可以检查三元运算符中未定义的变量。为什么有未声明的变量?或者你只需要检查
未定义的
?确切地说,在我的情况下,我希望有人能为我提供该变量:准确地说,我正在开发一个通用代码,让我们假设abc可能是,也可能不是defined@KiranShakya在这种情况下,您的代码typeofabc!==“未定义”
是否也会失败?因为没有定义abc?没有!为了澄清一点,我使用这个部分作为三元运算的条件,如你在第4行中所看到的。谢谢你提到我的拼写错误,所以在这里使用typeof只是最好的选择?@KiranShakya:(不用担心,“三元”是一个词,而不是这个词。:-))typeof
是检查标识符是否未声明而不会引发错误的唯一安全方法。不过,引用错误是可捕获的,因此从技术上讲,您也可以使用try
/catch
,但如果这不是一种例外情况(abc
未声明),那么它会更详细,效率更低如果在代码中看到的话,看起来它需要一个注释来解释为什么这是正确的。@NinaScholz:是的。我的意思是,这是一个常见的习语,但正如你所说,它看起来……错了。:-)我通常在我们将其用于伪名称空间(例如,不使用适当模块的名称空间)的项目中对其进行了注释。@t.J.Crowder,所以如果我总是希望对象是它的类型,那么我可以做let a=typeof abc==“object”?abc:{}
。从技术上讲,它比较短且正确:)
state = (typeof state !== "undefined") ? state : '';