Задачка на смекалку
new new new new new new new new foo () () () () () () () () () () () () () () () () () () () () () () () == foo /* true */ Чему равно foo? |
[spoiler]
function() {return arguments.callee} [/spoiler] |
Цитата:
|
<script> function foo() { return this.constructor == foo ? this.constructor : arguments.callee; } alert(new new new new new new new new foo () () () () () () () () () () () () () () () () () () () () () () () == foo); </script> |
Gvozd, как это не работает?
<script type="text/javascript"> function foo(){ return arguments.callee; } alert(new new new new new new new new foo () () () () () () () () () () () () () () () () () () () () () () () == foo); </script> subzey, спасибо за задачу :) |
Цитата:
|
Вы адские кодеры...
|
Задачка #2:
[foo][foo][foo][foo][foo][foo][foo][foo][foo][foo]() == foo; /* true */ Чему равно foo ? |
foo=function(){ return arguments.callee; } foo['0']=foo; foo.toString = function(){return '0';} alert( [foo][foo][foo][foo][foo][foo][foo][foo][foo][foo]() == foo) |
Gvozd, да, похоже я слишком быстро прочитал тему. Ты ответил, а потом Octane привел свой вариант, вот я и решил... :lol:
|
Нет, вы мега-адские кодеры...
|
B~Vladi,
держим марку))) |
Заскучали?
Задачка #3: foo == bar; /* true */ foo + bar == foo + bar; /* false */ foo++-++bar == bar++-++foo; /* false */ Чему равны foo и bar ?UPD: Как-то слишком тривиально получилось. Меняю условия. |
var foo = { toString: function () { return NaN; } }; var bar = foo; alert([ foo == bar, foo++-++bar==bar++-++foo ]); |
а можно что-нить посерьезнее?)
foo = bar = { a: 0, valueOf:function(){return this.a++;} }; alert(foo==bar); /* true */ alert(foo++-++bar==bar++-++foo); /* false */ Octane, интересный вариант) |
Эт-то… я отредактировал условия, добавив еще одно.
З.Ы. Есть очень изящное решение для этого, без valueOf и toString :) |
Цитата:
|
var foo = undefined, bar = undefined; alert([ foo == bar, foo + bar == foo + bar, foo++-++bar == bar++-++foo ]); |
Психи!!!=) А ещё задачки будут?=)
|
Octane,
и это правильный ответ! :) |
Цитата:
alert(obj.foo); // 5 delete obj.foo; alert(obj.foo); // 5Определить obj. |
function Obj() {} Obj.prototype.foo = 5; var obj = new Obj; alert(obj.foo); delete obj.foo; alert(obj.foo); |
Хм... И правда...
|
Кстати, случайно пришло в голову проверить, оказывается [].toString и [].join не проверяют hasOwnProperty:
Array.prototype[0] = "O_o"; alert([,1,2]); |
Ни один метод массива не проверяет hasOwnProperty.
|
Задача #4:
Надеюсь, хоть она продержится более пары часов :) foo = foo + ""; !!~eval(foo + " / -.5"); /* true */ eval( foo + "+" + foo ) /* 1 */ eval( foo + foo + "+" + foo + foo ) /* 2 */ eval( foo + foo + foo + "+" + foo + foo + foo ) /* 3 */ eval(foo + foo + foo + foo + "+" + foo + foo + foo + foo) /* 4 */ // и так далее Чуть не забыл. eval не переопределять :) |
весь мозг вынес.
самые разные идеи опробовал подозреваю, что мое решение не то, что ты ожидаешь увидеть, но все же var foo=' foo=" + 0.5 " , 1 ' foo = foo + ""; alert( !!~eval(foo + " / -.5") ); // true alert( eval( foo + "+" + foo ) ); // 1 alert( eval( foo + foo + "+" + foo + foo ) ); // 2 alert( eval( foo + foo + foo + "+" + foo + foo + foo ) ); // 3 alert( eval(foo + foo + foo + foo + "+" + foo + foo + foo + foo) ); // 4 |
Gvozd,
Ну, коль скоро оно выполняется, то верно :) Если до завтра не поступит других вариантов, напишу мой вариант. |
Цитата:
но все же мое решение, как если бы на задачу "вывести первых 10 натуральных чисел", я бы написал alert(1); alert(2); alert(3); alert(4); alert(5); alert(6); alert(7); alert(8); alert(9); alert(10); |
#4: Разгадка
[spoiler]
var foo = "-~/ "; foo = foo + ""; alert( !!~eval(foo + " / -.5") ); /* true */ alert( eval( foo + "+" + foo ) ) /* 1 */ alert( eval( foo + foo + "+" + foo + foo ) ) /* 2 */ alert( eval( foo + foo + foo + "+" + foo + foo + foo ) ) /* 3 */ alert( eval(foo + foo + foo + foo + "+" + foo + foo + foo + foo) ) /* 4 */ // и так далее /* поясню */ !!~(-~/ / -.5); /* тут слеш служит «закрывающей скобкой» регулярки, а минус при таком раскладе уже не унарный оператор */ -~/ +-~/; /* тут опять регулярное выражение, причем, в него входит +. При приведении к числу оно вполне себе NaN. -~NaN = 1 */ -~/ -~/ +-~/ -~/; /* когда таких кусков слева и справа четное количество, плюс работает как просто плюс. В принципе, всю задачу можно было сделать и без плюса, но как не запутать мозг уважаемым js-девелоперам? :) */ [/spoiler] |
Запустить! => ошибка: Unexpected token &
Chrome. |
Riim,
Движок форума преобразовал юникодовые неразрывные пробелы в Плохая идея была их использовать Так должно заработать: var foo = "-~/ "; foo = foo + ""; alert( !!~eval(foo + " / -.5") ); /* true */ alert( eval( foo + "+" + foo ) ) /* 1 */ alert( eval( foo + foo + "+" + foo + foo ) ) /* 2 */ alert( eval( foo + foo + foo + "+" + foo + foo + foo ) ) /* 3 */ alert( eval(foo + foo + foo + foo + "+" + foo + foo + foo + foo) ) /* 4 */ // и так далее |
Совсем простенькая
alert(sum()); // ==> 0 alert(sum(2)); // ==> 2 alert(sum(1)(2)(3)); // ==> 6 alert(sum(4)(8)); // ==> 12 // и т.д. Определить sum |
http://javascript.ru/basic/closure#zabavnyy-primer
Вот чему :)))))))))) |
Shaci,
на 3-х и более элементах тот пример не сработал. Длина ряда произвольна. |
function sum(a) { return function(b) { return function(c) { return a + b +c; } } } alert(sum(3)(4)(5)); Вот тебе для трех, я на js давно не писал. но думаю можно переписать с легкостью этот код и на произвольное число аргументов. |
var sum = function(a){ var fnc = function(a){ fnc.value += a || 0; return fnc; }; fnc.value = a || 0; fnc.toString = toString; return fnc; }, toString = function(){ return this.value }; alert(sum()); // ==> 0 alert(sum(2)); // ==> 2 alert(sum(1)(2)(3)); // ==> 6 alert(sum(4)(8)); // ==> 12 // и т.д. |
В поисках логического обоснования:
((0)['constructor']['constructor'](//числа могут быть любыми и не обязательно соответствовать друг-другу ( (0)['constructor']['constructor'] ('return unescape') )() ('al%65rt%28%22Hello%20World%21%22%29') ) )(); Как может вы уже догадались работает по принципу: eval(unescape('al%65rt%28%22Hello%20World%21%22%29')) |
((0)['constructor']['constructor']( ( (0)['constructor']['constructor'] ('return unescape') )() ('al%65rt%28%22Hello%20World%21%22%29') ) )(); (0)['constructor'] == Number Number['constructor'] == Function (Function( ( Function ('return unescape') )() ('al%65rt%28%22Hello%20World%21%22%29') ) )(); Если растянуть (Function((Function('return unescape'))()('al%65rt%28%22Hello%20World%21%22%29')))(); Function('return unescape') == function() { return unescape; } (Function('return unescape'))() == (function() { return unescape })() == unescape (Function(unescape('al%65rt%28%22Hello%20World%21%22%29')))(); (Function('alert("Hello World!")'))(); (function() { alert("Hello World!") })(); |
0 — число. При взятии у него свойства оно преобразовавыется в объект. У объекта есть функция-конструктор. У конструктора есть свой конструктор —
Function .Получаем ( Function( (Function ('return unescape'))()('al%65rt%28%22Hello%20World%21%22%29') ) )(); Уже ближе. (Function ('return unescape'))() создает функцию и сразу же её выполняет. Результатом будет функция unescape , определенная в глобальном скопе.( Function( unescape('al%65rt%28%22Hello%20World%21%22%29') ) )(); ну, и (Function('alert("Hello World!")'))(); Т.е., опять-таки, функция объявляется и сразу запускается. alert("Hello World!") |
Часовой пояс GMT +3, время: 23:59. |