Javascript未定义、空字符串和if语句

Javascript undefined, empty strings, and if statements

本文关键字:if 语句 字符串 未定义 Javascript      更新时间:2023-09-26

我不是在javascript方面做了很多工作的人。我的背景是Java/C++。然而,我目前正在进行一个使用大量javascript的项目,我发现了一些对我来说没有意义的东西,但希望一些javascript大师能给我一个很好的逻辑解释。

var noDefinition = undefined;
var emptyString = "";
var noDefinitionAndEmptyString = noDefinition + emptyString;
console.log("NoDefinition");
console.log(noDefinition);
console.log("EmptyString");
console.log(emptyString);
console.log("noDefinition+emptyString");
console.log(noDefinitionAndEmptyString);
console.log("************************");
if(noDefinition == undefined)
{
    console.log("No Definition is undefined");
}

if(emptyString == undefined)
{
    console.log("emptyString is undefined");
}
if(noDefinitionAndEmptyString == undefined)
{
    console.log("noDefiniton and emptyString is undefined");
}

上面的代码在我的控制台中产生以下结果:
[信息]无定义
[信息]
[信息]空字符串
[信息]
[信息]noDefinition+emptyString
[信息]未定义
[信息]********[信息]没有定义

因此,正如您所看到的,当我将变量noDefinition和emptyString输出到控制台时,它会产生空白输出。当我连接它们时,控制台将产生未定义的。然而,if随后继续使用if语句,并将它们中的每一个与未定义的进行比较。唯一执行的if是第一个。

即使将该值放到控制台中时,该值仅显示为空白,也会发生这种情况。此外,在控制台中显示为未定义的串联也无法与未定义进行比较,因此永远不会执行。我对此感到困惑,我希望有人能给我一个关于发生了什么的解释。

当您将未定义与字符串连接时,它将成为字符串

var foo = undefined;
var bar = "";
console.log(foo+bar, typeof(foo+bar));
* output *
undefined string

ECMAScript文档-http://www.ecmascript.org/docs.php不确定,但阅读第141页的文档,你可以找到这个

15.5.1作为函数调用的字符串构造函数

当String作为函数而不是构造函数被调用时,它执行一个类型转变

这让我相信为什么任何东西与字符串的串联都会输出字符串

  1. console.log在接收到undefined值(特定于实现)时不打印任何内容
  2. undefined与空字符串连接时,得到的值为"undefined"。那是印刷的

前面的要点解释了您的观察结果。

重写您的示例可能会更清楚地了解连接字符串和未定义值时实际发生的情况:

var noDefinition = undefined;
var emptyString = "";
var noDefinitionAndEmptyString = noDefinition + emptyString;
console.log("************************");
console.log("NoDefinition:" + " " + noDefinition + " " + typeof(noDefinition));
console.log("EmptyString:"+ " " + emptyString + " " + typeof(emptyString));
console.log("noDefinition+emptyString: " + noDefinitionAndEmptyString + " " + typeof(noDefinitionAndEmptyString));
console.log("************************");

结果:

************************
NoDefinition: undefined undefined
EmptyString: string
noDefinition+emptyString: undefined string
************************

改为使用这个:

if (typeof noDefinition == "undefined") ...

if(noDefinition == null)包含typeOf"undefined"和typeOf"null",但您可能需要添加一个and语句以确保它不是空字符串。。。像这样:

if(noDefinitionAndEmptyString == null || noDefinitionAndEmptyString == "")

noDefinitionAndEmptyString实际上是一个string(您可以使用console.info(typeof noDefinitionAndEmptyString)),其值为"undefined"。发生这种情况的原因是串联-发生了对string的隐式强制转换,而强制转换为字符串的未定义变量是字符串'undefined'