Если вы запустите консоль перед изменением значения, измененное значение будет напечатано [duplicate]

def validate_age(age):
    if age >=0 :
        return True
    return False

while True:
    try:
        age = int(raw_input("Please enter your age:"))
        if validate_age(age): break
    except ValueError:
        print "Error: Invalid age."
47
задан HelloWorld 30 April 2014 в 16:25
поделиться

2 ответа

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

В наш код не имеет никакого значения, является ли console.log асинхронным или нет, он не предоставляет никакого обратного вызова или так ; и значения, которые вы передаете, всегда ссылаются и вычисляются во время вызова функции.

Мы действительно не знаем, что происходит тогда (хорошо, мы могли бы, поскольку Firebug, Chrome Devtools и Opera Dragonfly все Открытый исходный код). Консоль должна будет хранить зарегистрированные значения где-нибудь, и она отобразит их на экране.

Таким образом, консоль может либо клонировать (сериализовать), но и выполнять операции с асинхронно (с дросселированием до обновлений ограничения скорости), а также будущие взаимодействия с зарегистрированными объектами в консоли. ) измененные объекты, которые вы записали, или будут хранить ссылки на них. Первый из них плохо работает с глубокими объектами. Кроме того, по крайней мере, первоначальный рендеринг в консоли, вероятно, покажет «текущее» состояние объекта, то есть тот, который был зарегистрирован - в вашем примере вы видите Object {}.

Однако, когда вы разверните объект, чтобы проверить его свойства дальше, вполне вероятно, что консоль будет хранить только ссылку на ваш объект и его свойства, и теперь их отображение покажет их текущее (уже измененное) состояние. Если вы нажмете на +, вы сможете увидеть свойство bar в вашем примере.

Вот скриншот, опубликованный в отчете об ошибке , чтобы объяснить их "fix":

[/g4]

Таким образом, некоторые значения могут ссылаться долго после того, как они были зарегистрированы, а их оценка скорее ленивый («при ​​необходимости»). Самый известный пример этого несоответствия рассматривается в вопросе . Является ли консоль JavaScript Chrome ленивой относительно оценки массивов? Обходной путь заключается в том, чтобы всегда регистрировать серийные снимки ваших объектов, например. выполнив console.log(JSON.stringify(obj)). Однако это будет работать только для некруглых и довольно небольших объектов. См. Также . Как изменить поведение консоли console.log по умолчанию? (* Ошибка консоли в сафари, без надстройки *) .

66
ответ дан Community 21 August 2018 в 00:05
поделиться

При использовании 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 уже привязан к.

1
ответ дан Miao Siyu 21 August 2018 в 00:05
поделиться
  • 1
    Я знаю, что этот вопрос составляет 3 года, но сейчас я столкнулся с одной проблемой - сериализация объекта для меня не работает, потому что это слишком сложно. Я улавливаю событие, пытающееся получить доступ к его данным, но каким-то образом у него нет данных в коде, но в console.log у него есть данные. – Skeec 14 June 2017 в 11:15
Другие вопросы по тегам:

Похожие вопросы: