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