Здесь было много полезных ответов, в целом достигающих высшей точки в два пункта.
BACKTICKS(
) `используются вокруг имен идентификаторов. QUOTES(')
используются вокруг значений. И как @MichaelBerkowski сказал
Backticks должны использоваться для идентификаторов таблиц и столбцов, но необходимы только тогда, когда идентификатор является
blockquote>MySQL
зарезервированным ключевое слово или когда идентификатор содержит символы пробела или символы за пределами ограниченного набора (см. ниже) Часто рекомендуется избегать использования зарезервированных ключевых слов в качестве идентификаторов столбцов или таблиц, если это возможно, во избежание проблемы с кавычками.Существует случай, когда идентификатор не может быть зарезервированным ключевым словом или содержать символы whitespace или за пределами ограниченного набора , но обязательно требует обратных ссылок вокруг их.
ПРИМЕР
123E10
является допустимым именем идентификатора, а также действительнымINTEGER
литералом.[Не вдаваясь в подробности, как вы могли бы получить такое имя идентификатора] Предположим, что я хочу создать временную таблицу с именем
123456e6
.Нет ОШИБКИ на обратных циклах.
DB [XXX]> create temporary table `123456e6` (`id` char (8)); Query OK, 0 rows affected (0.03 sec)
ОШИБКА, если вы не используете обратные ссылки.
DB [XXX]> create temporary table 123451e6 (`id` char (8)); ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '123451e6 (`id` char (8))' at line 1
Однако
123451a6
[* g15]DB [XXX]> create temporary table 123451a6 (`id` char (8)); Query OK, 0 rows affected (0.03 sec)
Это полностью, потому что
1234156e6
также является показательным номером.
console.log
не стандартизирован, поэтому поведение довольно неопределенное и может легко изменяться с момента выпуска до выпуска инструментов разработчика.
В наш код не имеет никакого значения, является ли console.log
асинхронным или нет, он не предоставляет никакого обратного вызова или так ; и значения, которые вы передаете, всегда ссылаются и вычисляются во время вызова функции.
Мы действительно не знаем, что происходит тогда (хорошо, мы могли бы, поскольку Firebug, Chrome Devtools и Opera Dragonfly все Открытый исходный код). Консоль должна будет хранить зарегистрированные значения где-нибудь, и она отобразит их на экране.
Таким образом, консоль может либо клонировать (сериализовать), но и выполнять операции с асинхронно (с дросселированием до обновлений ограничения скорости), а также будущие взаимодействия с зарегистрированными объектами в консоли. ) измененные объекты, которые вы записали, или будут хранить ссылки на них. Первый из них плохо работает с глубокими объектами. Кроме того, по крайней мере, первоначальный рендеринг в консоли, вероятно, покажет «текущее» состояние объекта, то есть тот, который был зарегистрирован - в вашем примере вы видите Object {}
.
Однако, когда вы разверните объект, чтобы проверить его свойства дальше, вполне вероятно, что консоль будет хранить только ссылку на ваш объект и его свойства, и теперь их отображение покажет их текущее (уже измененное) состояние. Если вы нажмете на +
, вы сможете увидеть свойство bar
в вашем примере.
Вот скриншот, который был опубликован в отчете об ошибке , чтобы объяснить их "fix":
[/g4]
Таким образом, некоторые значения могут ссылаться долго после того, как они были зарегистрированы, а их оценка скорее ленивый («при необходимости»). Самый известный пример этого несоответствия рассматривается в вопросе . Является ли консоль JavaScript Chrome ленивой относительно оценки массивов? Обходной путь заключается в том, чтобы всегда регистрировать серийные снимки ваших объектов, например. выполнив console.log(JSON.stringify(obj))
. Однако это будет работать только для некруглых и довольно небольших объектов. См. Также . Как изменить поведение консоли console.log по умолчанию? (* Ошибка консоли в сафари, без надстройки *) .
При использовании console.log:
a = {}; a.a=1;console.log(a);a.b=function(){};
// without b
a = {}; a.a=1;a.a1=1;a.a2=1;a.a3=1;a.a4=1;a.a5=1;a.a6=1;a.a7=1;a.a8=1;console.log(a);a.b=function(){};
// with b, maybe
a = {}; a.a=function(){};console.log(a);a.b=function(){};
// with b
в первой ситуации объект достаточно прост, поэтому консоль может «подкрепить» его, а затем представить вам; но в других ситуациях a слишком «сложный» для «stringify», поэтому консоль вместо этого покажет вам объект памяти, и да, когда вы посмотрите на него, b уже привязан к.