console.log
не стандартизирован, поэтому поведение довольно неопределенное и может легко изменяться с момента выпуска до выпуска инструментов разработчика.
В наш код не имеет никакого значения, является ли console.log
асинхронным или нет, он не предоставляет никакого обратного вызова или так ; и значения, которые вы передаете, всегда ссылаются и вычисляются во время вызова функции.
Мы действительно не знаем, что происходит тогда (хорошо, мы могли бы, поскольку Firebug, Chrome Devtools и Opera Dragonfly все Открытый исходный код). Консоль должна будет хранить зарегистрированные значения где-нибудь, и она отобразит их на экране.
Таким образом, консоль может либо клонировать (сериализовать), но и выполнять операции с асинхронно (с дросселированием до обновлений ограничения скорости), а также будущие взаимодействия с зарегистрированными объектами в консоли. ) измененные объекты, которые вы записали, или будут хранить ссылки на них. Первый из них плохо работает с глубокими объектами. Кроме того, по крайней мере, первоначальный рендеринг в консоли, вероятно, покажет «текущее» состояние объекта, то есть тот, который был зарегистрирован - в вашем примере вы видите Object {}
.
Однако, когда вы разверните объект, чтобы проверить его свойства дальше, вполне вероятно, что консоль будет хранить только ссылку на ваш объект и его свойства, и теперь их отображение покажет их текущее (уже измененное) состояние. Если вы нажмете на +
, вы сможете увидеть свойство bar
в вашем примере.
Вот скриншот, опубликованный в отчете об ошибке , чтобы объяснить их "fix":
[/g4]
Таким образом, некоторые значения могут ссылаться долго после того, как они были зарегистрированы, а их оценка скорее ленивый («при необходимости»). Самый известный пример этого несоответствия рассматривается в вопросе . Является ли консоль JavaScript Chrome ленивой относительно оценки массивов? Обходной путь заключается в том, чтобы всегда регистрировать серийные снимки ваших объектов, например. выполнив console.log(JSON.stringify(obj))
. Однако это будет работать только для некруглых и довольно небольших объектов. См. Также . Как изменить поведение консоли console.log по умолчанию? (* Ошибка консоли в сафари, без надстройки *) .
pop
возвращает string | undefined
, так что вы можете сохранить его в переменной, чтобы проверить undefined
, или выделить жирным шрифтом и утверждать, что оно всегда будет определяться с помощью !
:
fileName
.split('/')
.pop()!
.replace(/\.\w+$/, '')
[117 ] (На самом деле это не так жирно, потому что разбиение пустой строки всегда будет возвращать хотя бы массив, содержащий пустую строку, поэтому pop должен разрешаться в элемент.)
Проверка переменной будет выглядеть примерно так :
const last = fileName
.split('/')
.pop();
if (last == undefined)
throw Error("This has never happened before.")
// Compiler now will 'know' that last is a string.
camelCase(last.replace(/\.\w+$/, ''));