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

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

if (elem) { // or !elem

要么

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

要么

if (elem != null) {
TomGreen2020/03/09 19:53:35

这取决于实际情况。如果要检查某些可能在代码外部全局定义的或可能尚未全局定义的东西(例如jQuery),则需要:

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

(在那里不需要严格的相等性,typeof总是返回一个字符串。)但是,如果您对某个函数的参数进行了传递,则可能会对其进行定义,但如果将其传递,则为null。

function sayHello(name) {
    if (name) return "Hello, " + name;
    else return "Hello unknown person";
}
sayHello(); // => "Hello unknown person"
十三西门2020/03/09 19:53:35

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

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;
}

如果需要相反的情况,则首先将!variable变为!! variable,而在无效函数中===变为!=且函数名称更改为notInvalid。

神奇Davaid2020/03/09 19:53:35

为了检查变量是否已经声明/设置,我做了这个肮脏的把戏。

我什至没有找到一种将代码提取到函数的方法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");
}
乐猪猪2020/03/09 19:53:35

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

typeof window.console === "undefined"

等同于

window.console === undefined

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

请注意,我们console仅在全局范围(这是window所有浏览器中对象)中查找。在这种特殊情况下,这是可取的。我们不想console在其他地方定义。

@BrianKelley在他的出色回答中解释了技术细节。我仅添加了缺少的结论,并将其摘要为更易于阅读的内容。

马克2020/03/09 19:53:35

这些答案(除了Fred Gandt解决方案之外)都是不正确或不完整的。

假设我需要variableName;携带一个undefined值,因此已经以某种方式声明了var variableName;这意味着它已经被初始化了-如何检查它是否已经声明?

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

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

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

在AJAX达到顶峰的时候,我编写了一种方法(后来称为isNS()),该方法能够确定名称空间是否存在,包括对属性名称(例如“ Book1.chapter22.paragraph37”)的深入测试等等。

但是,由于它以前已经发布过,并且由于它的重要性,它值得在单独的线程中发布,因此我不会在此处发布它,但是会提供关键字(javascript + isNS),它将帮助您找到源代码,并附带所有必要的解释。

Sam蛋蛋Itachi2020/03/09 19:53:35

您可以使用typeof运算符。

例如,

var dataSet;

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

上面的代码片段将返回如下输出

变量dataSet是:未定义。

阳光Itachi村村2020/03/09 19:53:35

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

因此,如果您传递空值,则可接受的答案将不起作用。如果传递空值,则需要对空值进行额外检查:

if ((typeof variable !== "undefined") && (variable !== null))  
{
   // the variable is defined and not null
}
LEYJim2020/03/09 19:53:35

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


var _undefined;
var _null = null;

alert(_undefined); 
alert(_null); 
alert(_undefined == _null);
alert(_undefined === _null);

2020/03/09 19:53:35
if (typeof console != "undefined") {    
   ...
}

或更好

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

适用于所有浏览器

神乐Near2020/03/09 19:53:35

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

但是,我想指出的是,JavaScript undefined是可变的(出于某些不敬虔的原因)。因此,简单地进行检查varName !== undefined有可能不会总是按预期返回,因为其他库可能已更改为未定义。一些答案(@skalee的答案)似乎更喜欢不使用typeof,这可能会给您带来麻烦。

处理此问题的“旧”方法是将undefined声明为var,以抵消的任何可能的静音/覆盖undefined但是,最好的方法仍然是使用,typeof因为它将忽略任何undefined其他代码的替代尤其是如果您正在编写要在野外使用的代码,而谁又知道该页面上可能还会运行什么……

米亚十三Harry2020/03/09 19:53:35

这取决于您是否只关心已定义变量,还是希望它具有有意义的值。

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

=== null!== null仅检查变量的值是否准确null

== null!= null将检查值是否为undefinednull

if(value)将检查变量是undefinednull0,或一个空字符串。

乐米亚2020/03/09 19:53:35

未声明(未定义)测试变量的简短方法是

if (typeof variable === "undefined") {
  ...
}

我发现它对于检测在浏览器外部运行的脚本(没有声明window变量)很有用