问:
检查变量是否已初始化的哪种方法更好/正确? (假设变量可以保存任何东西(字符串、整数、对象、函数等))
if (elem) { // or !elem
或者
if (typeof elem !== 'undefined') {
或者
if (elem != null) {
答1:
huntsbot.com全球7大洲远程工作机会,探索不一样的工作方式
你想要the typeof operator。具体来说:
if (typeof variable !== 'undefined') {
// the variable is defined
}
这看起来是一个很好的解决方案,但你能解释一下为什么会这样吗?
实际上,您应该检查对象是否是您需要的对象。所以这就是 if( typeof console == 'object' ) { // 变量是我需要的 }
@George IV:“只做
if(variable)”——嗯,不,因为 false 和 0 而失败。`
'if(variable)' 也无法测试对象属性的存在。
“if (typeof variable !== 'undefined') { // variable is not undefined }” 对我也有用...谢谢!
答2:
打造属于自己的副业,开启自由职业之旅,从huntsbot.com开始!
typeof 运算符将检查变量是否真的未定义。
if (typeof variable === 'undefined') {
// variable is undefined
}
与其他运算符不同,typeof 运算符在与未声明的变量一起使用时不会引发 ReferenceError 异常。
但是,请注意 typeof null 将返回 “object”。我们必须小心避免将变量初始化为 null 的错误。为了安全起见,我们可以使用以下代码:
if (typeof variable === 'undefined' || variable === null) {
// variable is undefined or null
}
有关使用严格比较 === 而不是简单相等 == 的详细信息,请参阅:Which equals operator (== vs ===) should be used in JavaScript comparisons?
@StevenPenny 检查时间线。发布此答案后,最高答案从 another question 合并
警告:这不适用于对象的成员,如果您尝试使用 some_object.a_member 中的点符号来访问它们。
这不检查变量是否存在,它检查其值类型。您想检查是否已声明变量。 @BrianKelley 的答案是正确的。
为什么不只是 variable != null 它似乎也可以捕获“未定义”变量
答3:
打造属于自己的副业,开启自由职业之旅,从huntsbot.com开始!
在许多情况下,使用:
if (elem) { // or !elem
将为您完成工作!…这将检查以下情况:
undefined:如果该值未定义且未定义 null:如果为 null,例如,如果 DOM 元素不存在… 空字符串:‘’ 0:数字零 NaN:不是数字 false
所以它会涵盖所有情况,但总有一些奇怪的情况我们也想涵盖,例如,一个带空格的字符串,就像这个 ’ ’ 一样,这将在 javascript 中定义,因为它有字符串中的空格…例如,在这种情况下,您可以使用 trim() 添加一项检查,例如:
if(elem) {
if(typeof elem === 'string' && elem.trim()) {
///
此外,这些检查仅针对 值,因为对象和数组在 Javascript 中的工作方式不同,空数组 [] 和空对象 {} 始终为 true。
我创建了下面的图像以显示答案的简要说明:
https://i.stack.imgur.com/UTBcN.png
@Alireza,很好!你的回答会帮助很多人。我已经记住了这些虚假值,唯一不确定的是 []。
我收到“ReferenceError:未定义元素”
@ropo,这是因为您甚至没有定义 elem 来检查它是什么,如果是您的情况,则需要使用已经提到的 typeof(elem)==="string" 来检查它...
然后,当它说 if(elem) 检查未定义(虽然它返回未定义错误)时,答案会产生误导,不是吗?
让我惊讶的点赞数。答案是错误的。正如上面评论中提到的,“if (elem) {}”不检查未定义,如果变量未定义,它会抛出错误。但是,如果 elem 未定义,“if (window.elem) {}”将不会抛出错误。
答4:
huntsbot.com提供全网独家一站式外包任务、远程工作、创意产品分享与订阅服务!
在 JavaScript 中,可以定义变量,但保留值 undefined,因此最常见的答案在技术上并不正确,而是执行以下操作:
if (typeof v === "undefined") {
// no variable "v" is defined in the current scope
// *or* some variable v exists and has been assigned the value undefined
} else {
// some variable (global or local) "v" is defined in the current scope
// *and* it contains a value other than undefined
}
这可能足以满足您的目的。以下测试具有更简单的语义,可以更轻松地准确描述代码的行为并自己理解(如果您关心这些事情):
if ("v" in window) {
// global variable v is defined
} else {
// global variable v is not defined
}
当然,这假设您在浏览器中运行(其中 window 是全局对象的名称)。但是,如果您正在使用像这样的全局变量,您可能在浏览器中。主观上,使用 ‘name’ in window 在风格上与使用 window.name 来指代全局变量是一致的。将全局变量作为 window 的属性而不是变量来访问,可以最大限度地减少代码中引用的未声明变量的数量(为了 linting),并避免全局变量被局部变量遮蔽的可能性。此外,如果全局变量让您的皮肤爬行,您可能会觉得只用这个相对较长的棍子触摸它们会更舒服。
`这仅检查变量是否是全局声明的。如果你编码正确,那么你就是在限制你的全局变量。它将报告本地变量为假: (function() { var sdfsfs = 10; console.log( “sdfsfs” in window); })() ``
这是最好的 f$#^%ing 答案。我对此束手无策,试图弄清楚如何准确解释这种极端情况。杰出的。没想到你能做到这一点。
注意:您的答案已从 stackoverflow.com/questions/519145/… 迁移到此处
对于 Angular 用户:不幸的是,在 ng-if 语句中似乎不允许这样做。
这不适用于 const 或 let 变量
答5:
打造属于自己的副业,开启自由职业之旅,从huntsbot.com开始!
在大多数情况下,您会使用:
elem != null
与简单的 if (elem) 不同,它允许 0、false、NaN 和 ‘’,但拒绝 null 或 undefined,使其成为一个很好的通用测试参数是否存在,或对象的属性。
其他检查也不是不正确的,它们只是有不同的用途:
if (elem):如果 elem 被保证是一个对象,或者如果 false、0 等被认为是“默认”值(因此等同于 undefined 或 null),则可以使用。
typeof elem == ‘undefined’ 可以在指定的 null 对未初始化的变量或属性具有不同含义的情况下使用。如果没有声明 elem(即没有 var 语句,不是 window 的属性,或者不是函数参数),这是唯一不会引发错误的检查。在我看来,这是相当危险的,因为它会让错别字在不知不觉中溜走。为避免这种情况,请参阅以下方法。
如果没有声明 elem(即没有 var 语句,不是 window 的属性,或者不是函数参数),这是唯一不会引发错误的检查。在我看来,这是相当危险的,因为它会让错别字在不知不觉中溜走。为避免这种情况,请参阅以下方法。
与 undefined 进行严格比较也很有用:
if (elem === undefined) ...
但是,因为全局 undefined 可以用另一个值覆盖,所以最好在使用之前在当前范围内声明变量 undefined:
var undefined; // really undefined
if (elem === undefined) ...
或者:
(function (undefined) {
if (elem === undefined) ...
})();
此方法的第二个优点是 JS 缩小器可以将 undefined 变量减少为单个字符,每次可以节省几个字节。
我很震惊您可以覆盖 undefined。我什至认为答案中不值得一提。可能是所有 Javascript 中唯一可接受的最差变量名。
这会导致异常,如果在全局上下文中使用,则需要在变量之前使用 window....这不是最好的方法。
由于这个最重要的问题,您应该始终使用 void(0) 而不是 undefined。
+1,因为此答案指出,有时您实际上可能想要将 false、0 等标识为无效值。
答6:
保持自己快人一步,享受全网独家提供的一站式外包任务、远程工作、创意产品订阅服务–huntsbot.com
检查 window.hasOwnProperty(“varname”)
大量 typeof 答案的替代方案;
Global 变量在全局范围内用 var varname = value; 语句声明
可以作为窗口对象的属性访问。
因此,hasOwnProperty() 方法,它
返回一个布尔值,指示对象是否具有指定的属性作为它自己的属性(而不是继承它)可用于确定是否
“varname” 的 var 已被全局声明ie 是 window 的属性。
// 因此,全局建立窗口的属性 var foo = “whatever”, // string bar = false, // bool baz; // undefined // window.qux 不存在 console.log( [ window.hasOwnProperty( “foo” ), // true window.hasOwnProperty( “bar” ), // true window.hasOwnProperty( “baz” ), / / true window.hasOwnProperty( “qux” ) // false ] );
hasOwnProperty() 的优点在于,在调用它时,我们不使用可能尚未声明的变量——这当然是问题的一半。
虽然并不总是完美或理想的解决方案,但在某些情况下,这只是工作!
笔记
使用 var 定义变量时,上述情况属实,而 let 则相反:
声明一个块作用域局部变量,可选择将其初始化为一个值。与 var 关键字不同,它在全局范围内定义一个变量,或者在本地定义一个整个函数,而不管块范围如何。在程序和函数的顶层,let 与 var 不同,它不会在全局对象上创建属性。
为了完整性: const 常量,根据定义,实际上不是可变的(尽管它们的内容可以是可变的);更相关:
与 var 变量不同,全局常量不会成为窗口对象的属性。需要一个常量的初始化器;也就是说,您必须在声明它的同一语句中指定它的值。常量的值不能通过重新赋值改变,也不能重新声明。 const 声明创建对值的只读引用。这并不意味着它持有的值是不可变的,只是不能重新分配变量标识符。
由于 let 变量或 const 常量绝不是继承了 hasOwnProperty() 方法的任何对象的属性,因此它不能用于检查它们的存在。
关于 hasOwnProperty() 的可用性和使用:
从 Object 继承的每个对象都继承了 hasOwnProperty() 方法。 […] 与 in 运算符不同,此方法不会检查对象的原型链。
这是一个很棒的选择,应该是这个问题的最受好评的。请使用返回 true(例如 window.hasOwnProperty('console') 或 var hop = "p";window.hasOwnProperty('hop'))的工作示例简化答案标题。
最后,由于访问不存在的成员而不会引发错误的东西……所有 typeof 答案都忽略了。
此答案已过时 - 根据标准 ECMAScript,您可以使用 let 定义变量,其中这些变量不可用作 window [或任何其他可用] 对象的属性。 hasOwnProperty 测试是否存在 properties,而不是变量,因此不能用于检测 let 定义的变量。
@amn 关于使用 var 的答案仍然正确,并且在这方面没有过时。然而,我添加了一个注释,概述了 let 和 const 的使用与 var 的不同之处。感谢您的启发;我们一起崛起:)
@amn 我已经重写了答案(希望是最后一次),以更清楚地说明 hasOwnProperty 只能以规定的方式用于检查 var 变量的存在。我读起来没问题。
答7:
huntsbot.com聚合了超过10+全球外包任务平台的外包需求,寻找外包任务与机会变的简单与高效。
如何检查变量是否存在
这是一个非常安全的解决方案,用于测试变量是否存在并已初始化:
var setOrNot = typeof variable !== typeof undefined;
它最常与 ternary operator 结合使用以设置默认值,以防某个变量尚未初始化:
var dark = typeof darkColor !== typeof undefined ? darkColor : "black";
封装问题
不幸的是,您不能简单地将检查封装在一个函数中。
你可能会想到做这样的事情:
function isset(variable) {
return typeof variable !== typeof undefined;
}
但是,如果您调用例如,这将产生参考错误。 isset(foo) 和变量 foo 尚未定义,因为您不能将不存在的变量传递给函数:
未捕获的 ReferenceError:未定义 foo
测试函数参数是否未定义
虽然我们的 isset 函数不能用于测试变量是否存在(原因如上所述),但它确实允许我们测试函数的参数是否未定义:
var a = '5';
var test = function(x, y) {
console.log(isset(x));
console.log(isset(y));
};
test(a);
// OUTPUT :
// ------------
// TRUE
// FALSE
即使没有将 y 的值传递给函数 test,我们的 isset 函数在这种情况下也能完美运行,因为 y 在函数 test 中被称为 undefined 值。
答8:
与HuntsBot一起,探索全球自由职业机会–huntsbot.com
未声明(未定义)测试变量的简短方法是
if (typeof variable === "undefined") {
...
}
我发现它对于检测在浏览器外部运行的脚本很有用(没有声明 window 变量)。
这是可移植的“规范方式”吗?
这是错误的。 window.bar=undefined 已定义并设置为一个值。您的答案无法检测到此变量与变量不存在之间的区别。如果您执行 this.hasOwnProperty('bar'),它可能会奏效。
此代码不起作用,您可以使用任何浏览器控制台验证这一点
考虑 const x = 0; (() => console.log(x, this.hasOwnProperty('x')))();。变量 x 已定义但返回 false...
答9:
huntsbot.com汇聚了国内外优秀的初创产品创意,可按收入、分类等筛选,希望这些产品与实践经验能给您带来灵感。
当您执行简单的分配和相关检查时,还有另一种简便的检查方法。只需使用条件(三元)运算符。
var values = typeof variable !== 'undefined' ? variable : '';
当您尝试使用引用变量的实例赋值来声明全局变量时,这也会很有帮助。
如果你想检查变量不应该是 undefined 或 null。然后执行以下检查。
声明变量时,如果要检查值,这甚至很简单: 它会同时执行 undefined 和 null 检查。
var values = variable ? variable : '';
答案是完全错误的。 typeof 变量总是返回一个字符串,因此永远不会是假的。例如,如果 typeof(booooo) 是 "undefined",则 typeof(typeof boooooo) 是 "string" 并且 typeof boooooo && true 始终是 true。 @John-Slegers 的答案与 typeof 一样简略。
绝对正确的答案。 Here is an working Fiddle。而且我不知道你在说什么场景。问题是关于检查变量的存在。
@mpag 不要说Flat 错误。证明给我看。发现错误真的很容易,相反,您可以在这里提供很好的答案!!!。如果答案完全错误,那么 28 位程序员如果不检查我的答案就不会投票。由于这里有许多著名的答案,他们本可以投票赞成,而不是这个。
实际上第二段代码不是检查与上述条件相同的情况。我认为人们会通过这行 If you wanted to check variable shouldn't be undefined or null. 理解,通过这个注释,它清楚地说明,它不执行变量声明检查。那是检查变量值。
您的第二次检查将失败,值为 0
答10:
一个优秀的自由职业者,应该有对需求敏感和精准需求捕获的能力,而huntsbot.com提供了这个机会
这取决于您是否只关心变量是否已定义,或者您是否希望它具有有意义的值。
检查类型是否未定义将检查变量是否已定义。
=== null 或 !== null 只会检查变量的值是否正好是 null。
== null 或 != null 将检查值是 undefined 还是 null。
if(value) 将检查变量是 undefined、null、0 还是空字符串。
答11:
与HuntsBot一起,探索全球自由职业机会–huntsbot.com
试着抓
如果根本没有定义变量(例如:尚未加载定义全局变量的外部库 - 例如谷歌地图),您可以使用 try-catch 块检查这一点而不会中断代码执行,如下所示(您不需要 { 1}模式)
尝试{ notDefinedVariable; } catch(e) { console.log(‘检测到:变量不存在’); } console.log(‘但代码仍在执行’);未定义变量; // 没有 try-catch 包装代码在这里停止 console.log(‘代码执行停止。你不会在控制台上看到这个消息’);
奖励:(参考其他答案)为什么 === 比 == 更清楚(source)
如果(a == b)
https://i.stack.imgur.com/nkpj6.png
如果(a === b)
https://i.stack.imgur.com/7MeG6.png
仅供参考,(a == b) 放在 Game of Life 网格上并不是那么令人兴奋。
HuntsBot周刊–不定时分享成功产品案例,学习他们如何成功建立自己的副业–huntsbot.com