Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Почему выполнение инструкции "}!{" в консоли браузера возвращает false? (https://javascript.ru/forum/misc/30705-pochemu-vypolnenie-instrukcii-%7D-%7B-v-konsoli-brauzera-vozvrashhaet-false.html)

vesel4ak 13.08.2012 12:45

Почему выполнение инструкции "}!{" в консоли браузера возвращает false?
 
Вложений: 1
Здравствуйте, уважаемые!

Если ввести (именно выполнить в консоли, а не сделать console.log() ) в консоль браузера "}!{", то вернется flase. Почему?

vesel4ak 13.08.2012 12:56

!{} == false
- вот с этим понятно. Он видит оператор отрицания и следующий за ним объект. Оператор отрицания переводит выражение в "логическую форму" (не знаю как по другому сказать) и т.к. в логической форме {} === true, то !{}===false.

{} ! {} == false
вот с этим уже не совсем понятно, т.к. оператор "!" стоит в середине выражения. По идее, хотя я, скорее всего ошибаюсь, в этом случае должно вернуться
undefined
.
}!{ - ну в от с этим ваще не понятно. Тоже ждал синтаксической ошибки.

Aetae 13.08.2012 13:02

firebug написан человеками на js, соответственно дело в его коде.)

Скорее всего пользовательский код, исполняется eval'ом, а перед этим запихиивается в блок.
Соответственно первая скобка закрывает блок, вторая открывает новый но так как он пустой и перед ним стоит отрецание - получается не блок, а объект:
usercode = '}!{';
alert(eval('{'+usercode+'}')) //{}!{}


Первое в "{}!{}" - не объект, а пустой блок кода, т.к. ничто не указывает ему вести себя как объект).

vesel4ak 13.08.2012 13:08

Ах вот оно что!!! Спасибо. Только "скорее всего"... Нужно бы точно:) Но версия очень правдоподобна:) Спасибо!!!

И я все-таки не до конца понял, почему конструкция
{}!{}
возвращает false?

Вот с такой вот
!{}
- понятно.

Aetae 13.08.2012 13:24

Первый {} - пустой блок кода. Это всё равно что ничего.)
Хочешь точно - посмотри сырцы firebug'a - это не сложно.

vesel4ak 13.08.2012 13:29

Цитата:

Сообщение от Aetae (Сообщение 197179)
Первый {} - пустой блок кода. Это всё равно что ничего.)

Т.е. у нас получается в eval'e
eval('{'+'{}'+'!{}'+'}')
Должно же вернуться undefined и за ним сразу false? Или я не прав?

Aetae 13.08.2012 13:36

http://javascript.ru/eval
Метод eval возвращает значение последнего вычисленного выражения.

Aetae 13.08.2012 13:40

Кстати я ошибся. Там не просто блок эвалится, а кострукция:
with(_FirebugCommandLine){
//наш код
};
что впрочем не меняет ситуации.

Даже лезть в сырцы не понадобилось чтоб разгадать сию великую тайну.
Поскольку код эвалится в контексте текущей страницы, то остаётся просто подменить eval на свой:
Сначала выполните в консоли:
window.eval = function(code){ return code }

А потом пишите, что хотите и выплняйте.)

Aetae 14.08.2012 09:48

Maxmaxmахimus,
Тред не читал @ Сразу писал

Мы уже выяснили, там не просто блок, там with.

Aetae 14.08.2012 13:12

Цитата:

Сообщение от Maxmaxmахimus (Сообщение 197408)
во первых ты сообщение от редактировал ПОСЛЕ того как я запостил. во вторых я сказал как надо бороться с with, что является ЕЩЕ одним показателем что я ЧИТАЛ тред, похоже ТЫ не внимательно читал мои сообщений.

Цитата:

Вчера, 13:40
Aetae

Вчера, 18:39
Maxmaxmахimus
Цитата:

ивал и так возвращает результат последнего выражения!, зачем в блок совать.
Щито, билять?


Часовой пояс GMT +3, время: 02:02.