JavaScript 检查变量是否存在(已定义/初始化)

IT技术 javascript variables initialization undefined
2021-01-28 03:36:57

哪种检查变量是否已初始化的方法更好/正确?(假设变量可以保存任何东西(字符串、整数、对象、函数等))

if (elem) { // or !elem

或者

if (typeof elem !== 'undefined') {

或者

if (elem != null) {
6个回答

你想要typeof操作具体来说:

if (typeof variable !== 'undefined') {
    // the variable is defined
}
@George IV:“就做`if(variable)”——嗯,不,这对于 false 和 0 来说失败了。
2021-03-18 03:36:57
'if( variable )' 也无法测试对象属性的存在。
2021-03-21 03:36:57
@geowa4 实际上,如果变量未定义,则会引发错误。
2021-03-23 03:36:57
实际上,您应该检查对象是否符合您的需要。所以这就是 if( typeof console == 'object' ) { // 变量是我需要的 }
2021-03-24 03:36:57
这看起来是一个很好的解决方案,但你能解释一下为什么会这样吗?
2021-03-25 03:36:57

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
}

有关使用严格比较===而不是简单相等的更多信息==,请参阅:
JavaScript 比较中应使用哪个相等运算符 (== vs ===)?

这不会检查变量是否存在,它会检查其值类型。您想检查是否已声明变量。@BrianKelley 的答案是正确的。
2021-03-17 03:36:57
警告:这不适用于对象的成员,如果您尝试使用some_object.a_member.
2021-03-20 03:36:57
为什么不只是variable != null它似乎也捕获“未定义”变量
2021-03-28 03:36:57
@StevenPenny 检查时间线。发布此答案后,最佳答案是从另一个问题合并的
2021-04-04 03:36:57

在许多情况下,使用:

if (elem) { // or !elem

将为您完成工作!...这将检查以下情况:

  1. undefined:如果该值未定义并且它是undefined
  2. null : 如果它是 null,例如,如果 DOM 元素不存在...
  3. 空字符串''
  4. 0 : 数字零
  5. NaN : 不是数字
  6. 错误的

所以它将涵盖所有情况,但总有一些奇怪的情况我们也想涵盖,例如,一个带有空格的字符串,就像这个' ',这将在 javascript 中定义,因为它在字符串中有空格...例如,在这种情况下,您使用 trim() 再添加一项检查,例如:

if(elem) {

if(typeof elem === 'string' && elem.trim()) {
///

此外,这些检查仅针对,因为对象和数组在 Javascript 中的工作方式不同,空数组[]和空对象{}始终为true

我创建了下面的图像以显示答案的简要说明:

未定义、空等

那么当它说if(elem)检查未定义(同时返回未定义错误)时,答案是误导性的,不是吗?
2021-03-16 03:36:57
令我惊讶的点数。答案是完全错误的。正如上面评论中提到的,“if (elem) {}”不检查未定义,如果变量未定义,它将抛出错误。但是,如果 elem 未定义,“if (window.elem) {}”将不会抛出错误。
2021-03-21 03:36:57
我收到“ReferenceError:elem 未定义”
2021-03-22 03:36:57
@Alireza,不错!你的回答会帮助很多人。我已经记住了这些错误的值,唯一不确定的是 []。
2021-03-27 03:36:57
@ropo,这是因为你甚至没有定义 elem 来检查它是什么,如果是你的情况,你需要用 typeof(elem)==="string" 来检查它已经提到过......
2021-04-06 03:36:57

在 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是全局对象的名称)。但是,如果您像这样处理全局变量,则可能是在浏览器中。主观上, using'name' in window在风格上与 usingwindow.name指代全局变量一致将全局变量作为属性window而不是变量访问允许您最大限度地减少在代码中引用的未声明变量的数量(为了 linting),并避免全局变量被局部变量遮蔽的可能性。此外,如果全局变量让你的皮肤爬行,你可能会觉得只用这个相对较长的棒触摸它们会更舒服。

这不适用于constlet变量
2021-03-15 03:36:57
这只检查变量是否是全局声明的。如果您编码正确,那么您就是在限制您的全局变量。它会为本地变量报告错误:(function() { var sdfsfs = 10; console.log( "sdfsfs" in window); })() `
2021-03-18 03:36:57
注意:您的答案已从stackoverflow.com/questions/519145/...
2021-03-29 03:36:57
这是最好的 f$#^%ing 答案。我在这件事上不知所措,试图弄清楚如何准确地解释这个极端情况。杰出的。没想到你能做到这一点。
2021-03-31 03:36:57
对于 Angular 用户:不幸的是,它似乎不允许出现在 ng-if 语句中。
2021-04-07 03:36:57

在大多数情况下,您会使用:

elem != null

与简单的 不同if (elem),它允许0falseNaN'',但拒绝nullundefined,使其成为一个很好的通用测试,用于检验是否存在参数或对象的属性。


其他检查也没有错误,它们只是有不同的用途:

  • if (elem):如果可以被用于elem保证是一个对象,或者如果false0等被认为是“默认”值(因此等同于undefinednull)。

  • typeof elem == 'undefined'可用于指定null对未初始化的变量或属性具有不同含义的情况。

    • 如果声明(即没有语句,不是 的属性,或不是函数参数),这是唯一不会抛出错误的检查在我看来,这是相当危险的,因为它允许错别字被忽视。为避免这种情况,请参阅以下方法。elemvarwindow

同样有用的是与 的严格比较undefined

if (elem === undefined) ...

但是,因为全局undefined可以被另一个值覆盖,所以最好undefined在使用它之前在当前作用域中声明该变量

var undefined; // really undefined
if (elem === undefined) ...

或者:

(function (undefined) {
    if (elem === undefined) ...
})();

这种方法的第二个优点是 JS 压缩器可以将undefined变量减少到单个字符,每次为您节省几个字节。

由于这个压倒一切的问题,您应该始终使用void(0)而不是undefined.
2021-03-17 03:36:57
+1因为这个答案指出,有时你可能实际上识别false0等成为无效值。
2021-03-25 03:36:57
我很震惊你可以覆盖undefined. 我什至不认为这在答案中值得一提。可能是所有 Javascript 中最差的可接受的变量名。
2021-03-30 03:36:57
window.如果在全局上下文中使用,这会导致异常并要求您在变量之前使用......这不是最好的方法。
2021-04-12 03:36:57