Javascript Funky array mishap

function a() {
  var b = ["b"];
  console.log(b);
  //console.log(b.slice());
  b = b.push("bb"); 
}
a();

В "идеальном" мире вы можете подумать, что console.log будет показывать ["b"], но, как ни странно, он показывает ["b", "bb"], хотя "bb" не нажимается до тех пор, пока впоследствии.

Если вы сделаете console.log(b.slice()); Затем вы получите желаемый результат ["b"]. Почему это? Какая причина этого осложнения? Я просто хочу понять это лучше, чтобы я мог избежать этого.

* Примечание. Я затронул эту точку в недавнем вопросе, но это гораздо более краткий пример. @RightSaidFred привел меня к этому моменту и оказал огромную помощь до сих пор.

Изменить

Runnable example на JSFiddle

Ответ 1

Это известная проблема с console.log.

Вместо того, чтобы превращать параметр в строку при вызове метода, параметр сохраняется и превращается в строку, когда он отображается в пользовательском интерфейсе. Поскольку в пользовательском интерфейсе ничего не происходит, пока функция работает, вы увидите состояние объекта, как оно есть, когда вы выходите из функции.

Ответ 2

Я не думаю, что это JavaScript wtf; Я думаю, что это console.log wtf. Основываясь на ответе, который я видел только вчера, console.log, скорее всего, кэширует ваш объект. Если вы замените console.log(b) на alert(b), вы увидите b, как ожидается.

К сожалению, убедительность console.log вести себя предсказуемым образом не является чем-то, на что у меня есть ответ.

Ответ 3

Я предполагаю, что это связано с тем, как работает console.log(), хотя вы делаете что-то немного напуганное, когда говорите:

b = b.push("bb");

вы должны просто сказать

b.push("bb");

Ответ 4

Подтверждение (если необходимо) ответа Гуффа:

function a() {
  var b = ["b"];
  console.log (b); 
  console.log (' ' + b); 
  console.log (b); 
  console.log (b.toString ()); 
  console.log (b);
  b = b.push("bb"); 
  console.log (b);
}
a();

Выходы Chrome:

["b", "bb"]
 b
["b", "bb"]
b
["b", "bb"]
2

Обратите внимание, что каждый журнал, ссылающийся на объект, показывает "аномальный" результат, и каждый, который требует оценки выражения, не имеет. Обратите внимание также на итоговый журнал, который показывает, что b устанавливается в значение значения 2, так как значение, возвращаемое push, является новой длиной массива.

Итак, чтобы избежать этой проблемы, убедитесь, что каждый параметр журнала включает в себя оценку выражения.

Ответ 5

Я думаю, что это ошибка в инструментах google chrome dev