1 Востаннє редагувалося ktretyak (27.02.2015 18:51:27)

Тема: Несподівана робота методу console.log()

Вже мабуть години дві копаюсь, не можу зрозуміти як так виходить, що коли намагаюсь роздрукувати об'єкт

function fn()
{
  // певна логіка створення об'єкта obj

  console.log(obj);
  return obj; // повертається об'єкт, який надалі десь в коді буде змінюватись
}

то роздруковується одне, але коли я намагаюсь зробити так

function fn()
{
  // певна логіка створення об'єкта obj

  console.log(obj);
  return {}; // повертається пустий об'єкт для гарантії, що майбутні маніпуляції в коді не впливатимуть на obj
}

то роздруковується зовсім інше.

Тобто в майбутньому десь в коді змінюється об'єкт obj і це впливає на його роздрукування зараз.

Я знаю про те, що коли робиш присвоєння obj2 = obj1, то obj2 по-суті стає лінком на obj1 і змінюючи obj1 відповідно змінюється об'єкт obj2.

Але хіба можна роздруковувати зараз те, що буде потім? Чи це специфіка методу console.log()?

2

Re: Несподівана робота методу console.log()

У мене однаково роздруковується
Можете навести більше коду?

п.с. Створення об'єкта в функції, а використання після того як вона відпрацювала, він же знищиться, а лінк може сі лишит і вказувати вже хто зна на що.

п.п.с. Ще припущення, що це якийсь об'єкт, наприклад "інтерфейсу", що змінюється бравзером від зовнішніх маніпуляцій, тоді б він мав завжди по різному роздруковуватись.

3

Re: Несподівана робота методу console.log()

Я думав що можна написати функцію, яка справді повертає об'єкт, але покищо не зміг це відтворити виключно з об'єктом. Така аномалія спостерігається коли функція повертає об'єкт в масиві

var arr1 = [{"one":1}];

function fn()
{
  console.log(arr1);
  return arr1;
}

// здавалося б цей виклик функції повинен спровокувати роздрукування об'єкту {"one":1}
// але роздруковується {"one": 3}, тобто те, що буде присвоєно пізніше
var arr2 = fn();

arr2[0].one = 3;

4

Re: Несподівана робота методу console.log()

ktretyak, соррі за рускіх,
http://javascript.ru/forum/misc/43209-n … e-log.html
Кажуть, що просто консоль від вебкіт не показує об'єктив в реальному часі.

Подякували: ktretyak1

5

Re: Несподівана робота методу console.log()

Таке ж саме показує і IE, але alert() дійсно виводить очікуваний результат

var arr1 = [{"one":1}];

function fn()
{
  alert(arr1[0].one);
  return arr1;
}

// здавалося б цей виклик функції повинен спровокувати роздрукування об'єкту {"one":1}
// але роздруковується {"one": 3}, тобто те, що буде присвоєно пізніше
var arr2 = fn();

arr2[0].one = 3;

6

Re: Несподівана робота методу console.log()

[Object { one=1}]
Мені оце виводить)

7

Re: Несподівана робота методу console.log()

Це схоже на hoisting, спливання змінних. В JavaScript проголошення виконуються не там, де знаходяться, а на початку коду.

8

Re: Несподівана робота методу console.log()

Змінні arr1 і arr2 посилаються на один і той же об’єкт і це таки воно. Можете в кінець програми дописати arr21[0].one = 13; і потім     console.log(arr21); вище і нічого вам не буде.