Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 13.08.2012, 12:45
Новичок на форуме
Отправить личное сообщение для vesel4ak Посмотреть профиль Найти все сообщения от vesel4ak
 
Регистрация: 13.08.2012
Сообщений: 5

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

Если ввести (именно выполнить в консоли, а не сделать console.log() ) в консоль браузера "}!{", то вернется flase. Почему?
Изображения:
Тип файла: jpg 20120813-9ppx-65kb.jpg (65.9 Кб, 10 просмотров)
Ответить с цитированием
  #2 (permalink)  
Старый 13.08.2012, 12:56
Новичок на форуме
Отправить личное сообщение для vesel4ak Посмотреть профиль Найти все сообщения от vesel4ak
 
Регистрация: 13.08.2012
Сообщений: 5

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

{} ! {} == false
вот с этим уже не совсем понятно, т.к. оператор "!" стоит в середине выражения. По идее, хотя я, скорее всего ошибаюсь, в этом случае должно вернуться
undefined
.
}!{ - ну в от с этим ваще не понятно. Тоже ждал синтаксической ошибки.
Ответить с цитированием
  #3 (permalink)  
Старый 13.08.2012, 13:02
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,589

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

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


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

Последний раз редактировалось Aetae, 13.08.2012 в 13:06.
Ответить с цитированием
  #4 (permalink)  
Старый 13.08.2012, 13:08
Новичок на форуме
Отправить личное сообщение для vesel4ak Посмотреть профиль Найти все сообщения от vesel4ak
 
Регистрация: 13.08.2012
Сообщений: 5

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

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

Вот с такой вот
!{}
- понятно.
Ответить с цитированием
  #5 (permalink)  
Старый 13.08.2012, 13:24
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,589

Первый {} - пустой блок кода. Это всё равно что ничего.)
Хочешь точно - посмотри сырцы firebug'a - это не сложно.
__________________
29375, 35
Ответить с цитированием
  #6 (permalink)  
Старый 13.08.2012, 13:29
Новичок на форуме
Отправить личное сообщение для vesel4ak Посмотреть профиль Найти все сообщения от vesel4ak
 
Регистрация: 13.08.2012
Сообщений: 5

Сообщение от Aetae Посмотреть сообщение
Первый {} - пустой блок кода. Это всё равно что ничего.)
Т.е. у нас получается в eval'e
eval('{'+'{}'+'!{}'+'}')
Должно же вернуться undefined и за ним сразу false? Или я не прав?
Ответить с цитированием
  #7 (permalink)  
Старый 13.08.2012, 13:36
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,589

http://javascript.ru/eval
Метод eval возвращает значение последнего вычисленного выражения.
__________________
29375, 35
Ответить с цитированием
  #8 (permalink)  
Старый 13.08.2012, 13:40
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,589

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

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

А потом пишите, что хотите и выплняйте.)
__________________
29375, 35
Ответить с цитированием
  #9 (permalink)  
Старый 14.08.2012, 09:48
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,589

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

Мы уже выяснили, там не просто блок, там with.
__________________
29375, 35
Ответить с цитированием
  #10 (permalink)  
Старый 14.08.2012, 13:12
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,589

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

Вчера, 18:39
Maxmaxmахimus
Цитата:
ивал и так возвращает результат последнего выражения!, зачем в блок совать.
Щито, билять?
__________________
29375, 35
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Функция не возвращает false, почему? Vitaly jQuery 3 05.07.2009 16:05