Javascript返回undefined和Object事实

时间:2018-09-21 06:10:56

标签: javascript javascript-objects

我刚刚检查了javascript函数的行为 而且我还想知道每个人都要检查一下,并告诉我这两个javascript函数行为之间的区别

示例代码如下

document.write("Hello");


var one = foo1();
var two = foo2();

document.writeln(two);
document.writeln(one);


function foo2 (){
   return 
   {
            bar:"hello"
   };

}

function foo1 (){
   return {
            bar:"hello"
   };

}
  

输出是

     

您好未定义的[object Object]

我只想知道如何??

5 个答案:

答案 0 :(得分:1)

以下内容无法按预期工作:

function foo2 (){
   return 
   {
            bar:"hello"
   };

}

执行return语句,然后{ bar:"hello" };只是一个代码块;一个不可达的,因为它在返回语句被求值之后立即出现。 要解决此问题,请确保ret​​urn语句与对象的大括号位于同一行:

function foo2 (){
   return {
            bar:"hello"
   };

}

现在是打印部件-document.writeln()接受其参数上的调用.toString(),对于对象来说,意味着打印[object object]
在打印对象之前对它们运行JSON.stringify(),如下所示:

function toJSON(arg) {
    return JSON.stringify(arg, null, 2)
}

document.writeln(toJSON(two));
document.writeln(toJSON(one));
  • 请注意,我使用的是JSON.stringify(arg, null, 2)而不是JSON.stringify(arg),因为2参数指示间距,从而使其打印精美且更易理解。

答案 1 :(得分:0)

JavaScript规范描述了称为自动分号插入的功能。进一步了解此here

document.write("Hello");


var one = foo1();
var two = foo2();

document.writeln(JSON.stringify(one));
document.write(JSON.stringify(two));


function foo2 (){
   return {
            bar:"hello"
   };

}

function foo1 (){
   return {
            bar:"hello"
   };

}

答案 2 :(得分:0)

在javascript中,您不需要;结束一行代码,因此foo2()在到达return语句时不返回任何值(未定义),这就是为什么您看到undefined并解析其余部分的原因就像一段代码,但永远不会到达。第二个函数执行您期望的操作并返回对象。如果您写document.writeln(one.bar);,则应该看到Hello

答案 3 :(得分:0)

body语句中的return必须保持在同一行。

您会在undefined中得到foo1(),因为您什么也没有返回,这是因为ASI。

return // this returns undefined
{
    "foo": "bar"
}
  

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/return#Automatic_Semicolon_Insertion

答案 4 :(得分:0)

啊!这是Javascript问题之一(或技巧?)

您可能会注意到,不必总是在指令末尾插入最后的分号。 例如,

let x = '3'

与     令x ='3'; 实际上,浏览器将始终像第二行一样读取它。这是由于ASI(自动分号插入)试图以一种智能的方式插入分号。

但是问题是我们看不到ASI的真正作用,因此很难调试。

第一个函数的转换方法如下:

function foo1 (){
   return {
            bar:"hello"
   };
}

这是第二个函数的转换方式:

function foo2 (){
   return ;
   {
            bar:"hello"
   };

}

(请注意return之后的“;”)

这就是为什么识别比您想象的重要得多的原因!

您可能想对ASI感兴趣: