检测Javascript变量是否真的未定义

检测Javascript变量是否真的未定义,javascript,Javascript,我们如何区分var-foo和var foo=未定义 typeof foo将同时返回“未定义”和窗口中的foo将同时返回true var foo表示var foo=undefined,当然,除非undefined设置为undefined以外的值 这可以在浏览器控制台中看到,如果您初始化一个变量但不给它一个值,它将具有值未定义的(以及类型“未定义的”) 我们如何区分var foo和var foo=未定义 如果这一行在所有使用foo之前,则它们之间没有区别。JavaScript引擎看到行var foo

我们如何区分
var-foo
var foo=未定义


typeof foo
将同时返回“未定义”和窗口中的
foo
将同时返回true

var foo
表示
var foo=undefined
,当然,除非
undefined
设置为
undefined
以外的值

这可以在浏览器控制台中看到,如果您初始化一个变量但不给它一个值,它将具有值
未定义的
(以及类型
“未定义的”

我们如何区分
var foo
var foo=未定义

如果这一行在所有使用
foo
之前,则它们之间没有区别。JavaScript引擎看到行
var foo=undefined如下所示:

// At top of scope
var foo; // `foo` will have the value `undefined`

// Where the var foo=undefined; line was
foo = undefined;
请注意,它们是在不同时间发生的完全不同的事情。声明和“初始化”(实际上是一个赋值)是分开进行的。该声明在进入执行单元时发生;初始化/赋值将在稍后进行,作为逐步代码执行的一部分。(更多:)

这意味着,如果您有:

foo = 5;
alert(typeof foo); // "number"
var foo = undefined;
alert(typeof foo); // "undefined"
…这不是错误,因为引擎处理的方式是:

var foo;
foo = 5;
alert(typeof foo); // "number"
foo = undefined;
alert(typeof foo); // "undefined"

一个正确的例子会产生奇迹:

function winFoo() {
  console.log('foo' in window);
}

function startFoo() {
  window.foo = 'bar';
}

function ovrFoo() {
  window.foo = undefined;
}

function removeFoo() {
  delete window.foo;
}

//window.foo === undefined
//window.foo hasn't been defined yet
winFoo(); //false
//so it makes sense that 'foo' is not in window
startFoo(); //window.foo === 'bar'
//window.foo has now been set to 'bar'
winFoo(); //true
//so it makes sense that 'foo' is in window
ovrFoo(); //window.foo === undefined
//window.foo has been overridden with a value of undefined
winFoo(); //true
//but the key 'foo' still exists in window, it just has a value of undefined
removeFoo(); //window.foo === undefined
//the key 'foo' has been removed from window and its value is therefor forgotten
winFoo(); //false
//so it makes sense that 'foo' is not in window

此外,在任何函数上下文之外声明
var foo
会实例化
window.foo
,如果
,则值为
undefined
!('foo'在窗口中)
(这意味着如果在同一代码块中多次调用
var foo
,则不会覆盖现有值(如果存在)。更重要的是,
var
function
语句实际上被提升到其范围的顶部,这意味着:

console.log('foo' in window);
var foo;
console.log('foo' in window);
将打印两次
true
,而不是
false
,后跟
true

方式1:

if (null === var)

(适用于旧浏览器):


另一个:


然后像这样使用它:


你不知道,但是为什么你需要呢?不确定,但是这些帖子中的一些可能会有所帮助。。和
var-foo是不是
foo=undefined
。因此,typeof foo返回“undefined”!我会问:你为什么要这么做?(或者,你想做什么?)这里值得一提的是,我们有“8.对于代码中的每个VariableDeclaration和VariableDeclarationNoIn d,按照源文本顺序,调用env的SetMutableBinding具体方法,传递dn、undefined和strict作为参数。”因此,每个变量都会自动初始化为
undefined
。我们可以regex脚本标记的所有innerHTML,并查看foo是如何声明的。即使我更改
undefined
的值,一切都是一样的@用户1365010:。当然,你可以创建一个名为
undefined
的局部变量:@user1365010:你必须更加努力(现在)来重新定义
undefined
(这是一个非常非常非常糟糕的主意):没那么糟糕,我必须把我所有的脚本都放在
(函数(undefined){
})(3)变量名应该清楚地表明它们的用途。没有有效的理由将变量命名为“未定义”。请注意,
null
void 0
不同,而且
var
是一个关键字。
if (void 0 != var)
if(var) 
var un;
if (un==undefined)
{
alert('Yes');
} else {
alert('No');
}