Почему выполнение инструкции "}!{" в консоли браузера возвращает false?
Вложений: 1
Здравствуйте, уважаемые!
Если ввести (именно выполнить в консоли, а не сделать console.log() ) в консоль браузера "}!{", то вернется flase. Почему? |
!{} == false- вот с этим понятно. Он видит оператор отрицания и следующий за ним объект. Оператор отрицания переводит выражение в "логическую форму" (не знаю как по другому сказать) и т.к. в логической форме {} === true, то !{}===false. {} ! {} == falseвот с этим уже не совсем понятно, т.к. оператор "!" стоит в середине выражения. По идее, хотя я, скорее всего ошибаюсь, в этом случае должно вернуться undefined. }!{ - ну в от с этим ваще не понятно. Тоже ждал синтаксической ошибки. |
firebug написан человеками на js, соответственно дело в его коде.)
Скорее всего пользовательский код, исполняется eval'ом, а перед этим запихиивается в блок. Соответственно первая скобка закрывает блок, вторая открывает новый но так как он пустой и перед ним стоит отрецание - получается не блок, а объект: usercode = '}!{'; alert(eval('{'+usercode+'}')) //{}!{} Первое в "{}!{}" - не объект, а пустой блок кода, т.к. ничто не указывает ему вести себя как объект). |
Ах вот оно что!!! Спасибо. Только "скорее всего"... Нужно бы точно:) Но версия очень правдоподобна:) Спасибо!!!
И я все-таки не до конца понял, почему конструкция {}!{}возвращает false? Вот с такой вот !{}- понятно. |
Первый {} - пустой блок кода. Это всё равно что ничего.)
Хочешь точно - посмотри сырцы firebug'a - это не сложно. |
Цитата:
eval('{'+'{}'+'!{}'+'}')Должно же вернуться undefined и за ним сразу false? Или я не прав? |
http://javascript.ru/eval
Метод eval возвращает значение последнего вычисленного выражения. |
Кстати я ошибся. Там не просто блок эвалится, а кострукция:
with(_FirebugCommandLine){ //наш код };что впрочем не меняет ситуации. Даже лезть в сырцы не понадобилось чтоб разгадать сию великую тайну. Поскольку код эвалится в контексте текущей страницы, то остаётся просто подменить eval на свой: Сначала выполните в консоли: window.eval = function(code){ return code } А потом пишите, что хотите и выплняйте.) |
Maxmaxmахimus,
Тред не читал @ Сразу писал Мы уже выяснили, там не просто блок, там with. |
Цитата:
Цитата:
Цитата:
|
Часовой пояс GMT +3, время: 02:02. |