哪种检查变量是否已初始化的方法更好/正确?(假设变量可以保存任何内容(字符串、int、对象、函数等))
if (elem) { // or !elem
or
if (typeof elem !== 'undefined') {
or
if (elem != null) {
哪种检查变量是否已初始化的方法更好/正确?(假设变量可以保存任何内容(字符串、int、对象、函数等))
if (elem) { // or !elem
or
if (typeof elem !== 'undefined') {
or
if (elem != null) {
当前回答
在许多情况下,使用:
if (elem) { // or !elem
会为你做这件事的!。。。这将检查以下情况:
undefined:如果值未定义且未定义null:如果它为null,例如,如果DOM元素不存在。。。空字符串:“”0:数字零NaN:不是数字假的
所以它将涵盖所有的情况,但我们也希望涵盖一些奇怪的情况,例如,一个带空格的字符串,比如这个“”,这将在javascript中定义,因为它在字符串中有空格。。。例如,在本例中,您使用trim()再添加一个检查,例如:
if(elem) {
if(typeof elem === 'string' && elem.trim()) {
///
此外,这些检查仅针对值,因为对象和数组在Javascript中的工作方式不同,所以空数组[]和空对象{}始终为true。
我创建了下面的图像,以显示答案的简要说明:
其他回答
if (variable === undefined) {}
工作正常,只检查未定义。
为了有助于辩论,如果我知道变量应该是字符串或对象,我总是喜欢if(!variable),所以检查它是否是假的。这可以带来更干净的代码,例如:
if(数据类型!==“undefined”&&数据类型。url===“未定义”){var message='接收响应时出错';if(typeof data.error!==“undefined”){message=数据错误;}否则如果(数据类型.消息!==“未定义”){message=数据消息;}警报(消息);}
..可以简化为:
if(data&&!data.url){var message=data.error | | data.message | |'接收响应时出错';警报(消息)}
在ReactJS中,事情有点复杂!这是因为它是一个编译环境,遵循ESLint的无undef规则,因为react-scripts@2.0.3(2018年10月1日发布)。这里的文档对任何对此问题感兴趣的人都有帮助。。。
在JavaScript中,在ES6之前,变量和函数声明被提升到作用域的顶部,因此可以在代码中的正式声明之前使用标识符。。。。当ES6的[新]规则遇到对尚未声明的标识符的引用时,将发出警告。
因此,虽然有可能有一个未定义(或“未初始化”)的变量,但在ReactJS中有一个没有关闭esint规则的未声明变量是不可能的。
这可能非常令人沮丧——GitHub上有太多的项目只是利用了ES6之前的标准;并且在没有任何调整的情况下直接编译这些基本上是不可能的。
但是,对于ReactJS,可以使用eval()。如果你有一个未声明的变量,比如。。。
if(undeclaredvar) {...}
您可以简单地将此部分重写为。。。
if(eval('typeof undeclaredvar !== "undefined"')) {...}
例如。。。
if(eval(“false”)){console.log(“否!”);}if(eval(“true”)){console.log(“是!”);}
对于那些将GitHub存储库导入ReactJS项目的人来说,这只是检查是否声明了变量的唯一方法。在结束之前,我想提醒您,如果使用错误,eval()存在安全问题。
我更喜欢这种方法,因为它的准确性和简洁性:
变量x如果(x===无效0){console.log(“x未定义”)}其他{console.log(“x已定义”)}
正如在其他评论和回答中提到的,undefined不能保证是undefineed。因为它不是关键字,所以可以在全局范围以外的范围中将其重新定义为变量。这里有一个小例子可以说明这种细微差别:
var undefined='bar'console.log(`在全局范围内:${undefined}`)函数foo(){var undefined=“已定义”变量x如果(x===未定义){console.log(`x===undefined`)}其他{console.log(`x!==undefined`)}如果(x===无效0){console.log(`x===void 0`)}其他{console.log(`x!==void 0`)}}foo()
请参阅void以了解兼容性(IE5支持!?!!哇!)。
最高答案是正确的,请使用typeof。
然而,我想指出的是,在JavaScript中,undefined是可变的(出于某种不道德的原因)。所以只需检查varName!==undefined有可能不会总是像您期望的那样返回,因为其他库可能已经更改了undefineed。一些答案(比如@skalee's)似乎更倾向于不使用typeof,这可能会让人陷入麻烦。
处理此问题的“旧”方法是将undefined声明为一个var,以抵消任何潜在的undefined/override。然而,最好的方法仍然是使用typeof,因为它将忽略其他代码中对undefined的任何重写。特别是如果你正在编写代码,以供在野外使用,谁知道页面上还有什么其他内容。。。