Javascript возвращают неопределенный и объектный факт - PullRequest
0 голосов
/ 21 сентября 2018

Я только что проверил поведение функций 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"
   };

}

И ВЫХОД -

Здравствуйте, undefined [объект]

Я просто хочу знать, как ??

Ответы [ 5 ]

0 голосов
/ 21 сентября 2018

Ахаха!Это одна из проблем Javascript (или уловка?)

Как вы могли заметить, вам не всегда нужно вставлять последнюю точку с запятой в конце ваших инструкций.Например,

let x = '3'

- это то же самое, что let x = '3';На самом деле, браузер всегда читает его как вторую строку.Это связано с тем, что ASI (автоматическая вставка точек с запятой) пытается интеллектуально вставить точку с запятой.

Но проблема в том, что мы не видим реального действия ASI, что усложняет его отладку.

Вот как преобразуется первая функция:

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

А вот как преобразуется вторая функция:

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

}

(Обратите внимание на «;» сразу после return)

И поэтому идентификация гораздо важнее, чем вы думаете!

Возможно, вы захотите заинтересовать вас ASI:

0 голосов
/ 21 сентября 2018

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

0 голосов
/ 21 сентября 2018

Следующее не работает так, как вы ожидаете:

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

}

выполняется оператор return, а затем { bar:"hello" }; является просто блоком кода;недоступный, потому что он приходит сразу после вычисления оператора return.Чтобы исправить это, убедитесь, что оператор return находится в той же строке, что и открывающая фигурная скобка объекта:

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 указывает интервал, что делает его печатным и более читабельным.
0 голосов
/ 21 сентября 2018

В javascript вам не нужно ;, чтобы завершить строку кода, поэтому foo2() возвращает значение без значения (undefined), когда оно достигает оператора return, поэтому вы видите undefined и анализируете остальное, как блоккод, но никогда не достигает его.Вторая функция делает то, что вы ожидаете, и возвращает объект.Если вы напишите document.writeln(one.bar);, вы должны увидеть Hello.

0 голосов
/ 21 сентября 2018

В спецификации JavaScript описана функция, называемая автоматической вставкой точек с запятой.Подробнее об этом здесь

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

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...