Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/383.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript未定义、空字符串和if语句_Javascript - Fatal编程技术网

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

Javascript未定义、空字符串和if语句,javascript,Javascript,我不是一个在javascript方面做了很多工作的人。我的背景是Java/C++。我目前正在从事一个使用大量javascript的项目,但是我遇到了一些对我来说没有意义的东西,但希望一些javascript专家能给我一个很好的逻辑解释 var noDefinition = undefined; var emptyString = ""; var noDefinitionAndEmptyString = noDefinition + emptyString; console.log("NoDef

我不是一个在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输出到控制台时,它会生成空白输出。当我连接它们时,控制台将生成未定义的。但是,如果我继续使用if语句,并将它们与未定义的语句进行比较。只有当它执行时,才是第一个

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

用这个代替:

if (typeof noDefinition == "undefined") ...
  • console.log
    在收到未定义的
    值(特定于实现)时不会打印任何内容
  • 未定义的
    与空字符串连接时,结果值为
    “未定义的”
    。那是印刷的

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

    nodefinitionandmptystring
    实际上是一个
    字符串(您可以使用
    console.info(nodefinitionandmptystring的类型)
    ),其值为“未定义”。发生这种情况是因为连接-发生了对
    string
    的隐式转换,而转换为string的未定义变量是字符串“未定义”

    ,如果(noDefinition==null)
    覆盖了typeOf“undefined”和typeOf“null”,但您可能需要添加and语句以确保它不是空字符串。。。像这样:


    如果(nodefinitionandmptystring==null | | nodefinitionandmptystring==“”)

    当您将未定义的字符串连接到一个字符串时,它将成为一个字符串

    var foo = undefined;
    var bar = "";
    console.log(foo+bar, typeof(foo+bar));
    * output *
    undefined string
    
    ECMAScript文档- 不确定,但阅读141页上的文件,您可以找到

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

    当字符串作为函数而不是构造函数调用时,它将执行类型转换 转换


    这让我相信,为什么用字符串连接任何东西都会输出一个字符串重写您的示例可能会更清楚地说明在连接字符串和未定义值时实际发生的情况:

    var foo = undefined;
    var bar = "";
    console.log(foo+bar, typeof(foo+bar));
    * output *
    undefined string
    
    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”)