首页 文章

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

提问于
浏览
1385

检查变量是否已初始化的哪种方法更好/更正? (假设变量可以包含任何内容(字符串,整数,对象,函数等))

if (elem) { // or !elem

要么

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

要么

if (elem != null) {

28 回答

  • 0

    这取决于实际情况 . 如果您正在检查可能在代码之外全局定义的内容(可能是jQuery),您需要:

    if (typeof(jQuery) != "undefined")
    

    (在那里不需要严格的相等,typeof总是返回一个字符串 . )但是如果你有一个函数的参数可能已经或者没有被传递,它们将始终被定义,但是如果被省略则为null .

    function sayHello(name) {
        if (name) return "Hello, " + name;
        else return "Hello unknown person";
    }
    sayHello(); // => "Hello unknown person"
    
  • 740

    很难区分undefined和null . Null 是当您想要指示变量没有特定值时可以分配给变量的值 . Undefined 是一个特殊值,它将是未分配变量的默认值 .

    var _undefined;
    var _null = null;
    
    alert(_undefined); 
    alert(_null); 
    alert(_undefined == _null);
    alert(_undefined === _null);
    
  • 9

    这些答案(除了Fred Gandt解决方案)都不正确或不完整 .

    假设我需要 variableName; 携带 undefined 值,因此它已经以 var variableName; 的方式声明,这意味着它已经 initialized ; - 如何检查是否已经申报?

    或者甚至更好 - 如何通过一次调用立即检查“Book1.chapter22.paragraph37”是否存在,但不会引发参考错误?

    我们通过使用最强大的JasvaScript运算符 in 运算符来实现:

    "[variable||property]" in [context||root] 
    >> true||false
    

    在AJAX达到普及的时候,我编写了一个方法(后来命名)isNS(),它能够确定命名空间是否存在,包括对属性名称的深度测试,如“Book1.chapter22.paragraph37”等等 .

    但由于它之前已经发布,因为它非常重要,它值得在一个单独的线程中发布,我不会在这里发布,但会提供关键字( javascript + isNS ),它将帮助您找到源代码,并提供所有必要的解释 .

  • 7

    你想the typeof operator . 特别:

    if (typeof variable !== 'undefined') {
        // the variable is defined
    }
    
  • 8

    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?

  • -1

    最强大的'is it defined'检查是 typeof

    if (typeof elem === 'undefined')
    

    如果您只是检查已定义的变量以指定默认值,那么通常可以执行以下操作:

    elem = elem || defaultElem;
    

    它通常很好用,请参阅:Idiomatic way to set default value in javascript

    还有一个使用 typeof 关键字的班轮:

    elem = (typeof elem === 'undefined') ? defaultElem : elem;
    
  • 189

    更实用,更易于使用:

    function exist(obj)
    {
        return (typeof obj !== 'undefined');
    }
    

    如果存在,该函数将返回 true ,如果不存在,则返回 false .

  • 3

    在问题中概述的特定情况下,

    typeof window.console === "undefined"
    

    是完全相同的

    window.console === undefined
    

    我更喜欢后者,因为它更短 .

    请注意,我们只在全局范围内查找 console (在所有浏览器中都是 window 对象) . 在这种特殊情况下,它想要 console 在别处定义 console .

    @BrianKelley在他的回答中解释了技术细节 . 我只是添加了缺乏结论并将其消化为易于阅读的内容 .

  • 44

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

    elem != null
    

    与简单的 if (elem) 不同,它允许 0falseNaN'' ,但拒绝 nullundefined ,使其成为参数或对象属性存在的良好通用测试 .


    其他检查也不正确,它们只是有不同的用途:

    • if (elem) :如果保证 elem 是一个对象,或者 false0 等被认为是"default"值(因此相当于 undefinednull ),则可以使用 .

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

    • 如果 elem 不是 declared (即没有 var 语句,不是 window 的属性,或者不是函数参数),这是 won't throw an error 的唯一检查 . 在我看来,这是相当危险的,因为它允许错别字被忽视 . 要避免这种情况,请参阅以下方法 .


    undefined 进行严格比较也很有用:

    if (elem === undefined) ...
    

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

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

    要么:

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

    这种方法的第二个优点是JS minifiers可以将 undefined 变量减少为单个字符,每次节省几个字节 .

  • 11

    这取决于你是否只关心变量已定义或如果您希望它具有有意义的值 .

    检查类型是否未定义将检查变量是否已定义 .

    === null!== null 仅检查变量的值是否正好 null .

    == null!= null 将检查值是 undefined 还是 null .

    if(value) 将检查变量是 undefinednull0 还是空字符串 .

  • 64

    怎么样简单:

    if(!!variable){
      //the variable is defined
    }
    
  • 3

    检查对象是否hasOwnProperty()

    过多的 typeof 答案的替代方案是使用 hasOwnProperty() 当然检查一个对象(JS中的几乎所有东西)是否具有属性,即变量(以及其他内容) .

    hasOwnProperty()方法返回一个布尔值,指示对象是否具有指定的属性作为自己的(不是继承的)属性 . 来自Object的每个对象都继承hasOwnProperty()方法 . 此方法可用于确定对象是否具有指定的属性作为该对象的直接属性;与in运算符不同,此方法不会检查对象的原型链 .

    // Globally established (therefore) properties of window
    var foo = "whatever", // string
        bar = false,      // bool
        baz;              // undefined
    // window.qux does not exist
    
    console.log( [
        window.hasOwnProperty( "foo" ),             // true
        window.hasOwnProperty( "bar" ),             // true
        window.hasOwnProperty( "baz" ),             // true
        window.hasOwnProperty( "qux" ),             // false
        { foo: [], bar: 0 }.hasOwnProperty( "bar" ) // true
    ] );
    

    hasOwnProperty() 的优点在于,在调用它时,我们不使用可能尚未定义的变量 - 这当然是问题的一半 .

    虽然不是完美或理想的解决方案,但在某些情况下,这只是工作!

  • 4

    当您执行简单的任务和相关检查时,还有另一种简短的方法可以检查这一点 . 只需使用 Conditional (Ternary) Operator.

    var values = typeof variable !== 'undefined' ? variable : '';
    

    当您尝试使用引用变量的实例赋值声明Global变量时,这也会有所帮助 .

    如果你想检查变量不应该是 undefinednull . 然后执行以下检查 .

    When the variable is declared, and if you want to check the value, this is even Simple: 它会一起执行 undefinednull 检查 .

    var values = variable ? variable : '';
    
  • 12

    在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 是全局对象的名称) . 但如果你're mucking around with globals like this you'可能在浏览器中 . 主观上,使用 'name' in window 在风格上与使用 window.name 引用全局变量一致 . 访问全局变量作为 window 的属性而不是变量允许您最小化您在代码中引用的未声明变量的数量(为了利用linting),并避免全局被局部变量遮蔽的可能性 . 此外,如果全球性使你的皮肤爬行,你可能会感觉更舒服只用这个相对长的棍子接触它们 .

  • 28

    如何检查变量是否存在

    这是一个非常灵活的解决方案,用于测试变量是否存在并已初始化:

    var setOrNot = typeof variable !== typeof undefined;
    

    它最常与ternary operator结合使用,以便在某个变量尚未初始化时设置默认值:

    var dark = typeof darkColor !== typeof undefined ? darkColor : "black";
    

    封装问题

    不幸的是,你不能简单地将你的支票封装在一个函数中 .

    您可能会想到这样的事情:

    function isset(variable) {
        return typeof variable !== typeof undefined;
    }
    

    但是,如果您正在调用eg,则会产生引用错误 . 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 值 .

  • 5
    if (typeof console != "undefined") {    
       ...
    }
    

    或更好

    if ((typeof console == "object") && (typeof console.profile == "function")) {    
       console.profile(f.constructor);    
    }
    

    适用于所有浏览器

  • 5

    要检查变量是否已声明/设置,我做了这个肮脏的技巧 .

    我还没有找到将代码提取到函数的方法,即使使用 eval .

    "use strict";
    
    // var someVar;
    
    var declared;
    try {
      someVar;
      declared = true;
    } catch(e) {
      declared = false;
    }
    
    if (declared) {
      console.log("someVar is declared; now has the value: " + someVar);
    } else {
      console.log("someVar is not declared");
    }
    
  • 5

    Null是JavaScript中的值, typeof null 返回 "object"

    因此,如果传递空值,则接受的答案将不起作用 . 如果传递空值,则需要为空值添加额外检查:

    if ((typeof variable !== "undefined") && (variable !== null))  
    {
       // the variable is defined and not null
    }
    
  • 2

    如果你想要定义的块做某事,那么使用它

    if (typeof variable !== 'undefined') {
        // the variable is defined
    }
    

    如果您希望未定义的块执行某些操作或分配或定义变量,请使用此选项

    if (typeof variable === 'undefined') {
        // the variable is undefined
    }
    
  • 114

    为了促成辩论,如果我知道变量应该是一个字符串或一个对象我总是更喜欢 if (!variable) ,所以检查它是否是假的 . 这可以带来更干净的代码,例如:

    if (typeof data !== "undefined" && typeof data.url === "undefined") {
        var message = 'Error receiving response';
        if (typeof data.error !== "undefined") {
            message = data.error;
        } else if (typeof data.message !== "undefined") {
            message = data.message;
        }
        alert(message); 
    }
    

    ..可以简化为:

    if (data && !data.url) {
      var message = data.error || data.message || 'Error receiving response';
      alert(message)
    }
    
  • 27

    Be Aware that when you check !== or != against "undefined" it wont work

    Tested on Firfox Quantom 60.0.1

    使用这样的测试来避免冲突

    if(!(typeof varibl['fl'] === 'undefined')) {
    
                console.log(varibl['fl']);
                console.log("Variable is Defined");
            }else{
    
                console.log(varibl['fl']);
                console.log("Variable is Un-Defined");
            }
    
  • 8

    最高的答案是正确的,使用typeof .

    但是,我想要指出的是,在JavaScript中 undefined 是可变的(出于一些不道德的原因) . 所以简单地检查 varName !== undefined 有可能不会像你期望的那样总是返回,因为其他的库可能已经改变了未定义 . 一些答案(@ skalee的,一个),似乎不喜欢不使用 typeof ,这可能会让人陷入困境 .

    "old"处理此问题的方法是声明未定义为var以抵消 undefined 的任何潜在静音/覆盖 . 但是,最好的方法仍然是使用 typeof ,因为它将忽略来自其他代码的任何覆盖 undefined . 特别是如果您正在编写代码以便在野外使用,谁知道页面上还有什么可以运行...

  • 7

    未定义,布尔,字符串,数字功能

    if( typeof foo !== 'undefined' ) { 
    
    }
    

    对象,数组

    if( foo instanceof Array ) { 
    
    }
    
  • 129

    我的偏好是 typeof(elem) != 'undefined' && elem != null .

    无论如何选择,考虑将支票放入这样的功能中

    function existy (x) {
        return typeof (x) != 'undefined' && x != null;
    }
    

    如果您不知道变量已声明,则继续 typeof (x) != 'undefined' && x != null;

    如果您知道变量已声明但可能不存在,则可以使用

    existy(elem) && doSomething(elem);
    

    您正在检查的变量有时可能是嵌套属性 . 你可以使用prop || {}下线检查有问题的 property :

    var exists = ((((existy(myObj).prop1||{}).prop2||{}).prop3||{})[1]||{}).prop4;
    

    在每个属性使用(...'|| {}') . nextProp之后,丢失的属性不会抛出错误 .

    或者你可以使用像 existy(o) && existy(o.p) && existy(o.p.q) && doSomething(o.p.q) 这样的存在

  • 8

    在许多情况下,使用:

    if (elem) { // or !elem
    

    会为你做这个工作!...这将检查以下案例:

    • undefined :如果未定义该值,则为 undefined

    • null :如果它为null,例如,如果DOM元素不存在...

    • empty string''

    • 0 :数字为零

    • NaN :不是数字

    • false

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

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

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

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

    undefined, null, etc

  • -4

    我在上面的答案中看不到这一点,所以我想在这里建议一下 .

    function isDefined(x) { return !!x }
    
    if( isDefined(x) ) {
        //The variable is defined
    }
    

    !如果x是 nullundefined ,x将返回true,所以!!如果x既不是未定义也不是null,则x将仅返回true .

    我意识到这也是空案的原因,但这里有公平的警告 .

  • 2628

    我根据对象使用两种不同的方式 .

    if( !variable ){
      // variable is either
      // 1. '';
      // 2. 0;
      // 3. undefined;
      // 4. null;
      // 5. false;
    }
    

    有时我不想将空字符串评估为falsey,因此我使用这种情况

    function invalid( item ){
      return (item === undefined || item === null);
    }
    
    if( invalid( variable )){
      // only here if null or undefined;
    }
    

    如果您需要相反的,那么在第一个实例中!变量变为!!变量,并且在无效函数中===变为!=并且函数名称变为notInvalid .

  • 41

    你可以使用 typeof 运算符 .

    例如,

    var dataSet;
    
    alert("Variable dataSet is : " + typeof dataSet);
    

    上面的代码片段会返回输出

    变量dataSet是:undefined .

相关问题