Неожиданные результаты в javascript

javascript, 21.02.2010 Воскресенье, 19:06
Теги: изврат, интересное, WTF, факапы, javascript
     Это мой достаточно вольный перевод одного очень интересного материала который просто не мог оставить меня равнодушным. Наслаждайтесь.
     Javascript -  язык, который мы любим несмотря на многочисленные поводы его ненавидеть. Это коллекция различных неисправностей, непостоянств и просто очень неинтуитивных моментов в языке сети.
Code
<script>
"3" + 1 // '31'
"3" - 1 // 2
"222" - -"111" // "333" (⊙﹏⊙)
</script>

Веселье с конкатенацией.

Code
<script>
function laugh()
{
  return
  {
  haha: "ha!"
  };
}
laugh();
// возвратит undefined
   
function laugh() {
  return { haha: "ha!" };
}
laugh();
// возвратит Object: { haha: "ha!" }

function laugh()
{
  return /*
  */{
  haha: "ha!"
  };
}
laugh();
// возвратит Object: { haha: "ha!" } в Хроме,
// что ещё больше всё запутывает...
</script>

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

Code
<script>
// В Safari, попробуйте...
var enum;
//-> SyntaxError: Parse error
</script>

У JavaScript есть смехотворный список зарезервированных слов; большинство из них даже не используется как ключевые слова в языке. Современные браузеры позволяют использовать большинство этих слов как идентификаторы, несмотря на то, что говорят спецификации. Но Сафари не нравится enum по некоторым причинам.

Code
<script>
// числа слева от 'e' - 7 и 8
alert( 1.7976931348623157e+308 === 1.7976931348623158e+308 ); // true!
</script>

В моих поисках, была ли Бесконечность конечным числом, я нашел это. Два числа, которые являются различными, являются в то же время одинаковыми..

Code
<script>
(true + 1) === 2;​ ​// true
(true + true) === 2; // true
true === 2; // false
true === 1; // false
</script>

Показывает что true иногда имеет значение.. ух, что за черт!

Code
<script>
3=="03" // true!
</script>

А, подумаешь что там ноль, это ерунда..
Мухаха!

Code
<script>
// пока вы в firebug, попробуйте:
var console = {}; // или в общем что ни будь...
</script>

Firebug ни за что не позволит вам создать переменную с именем console. Попробуйте и он вдарит вам по яйцам..

Code
<script>
(function(){
  var x = y = 1;
})();
alert(x); // undefined
alert(y); // 1 - оппачки, глобальная!
</script>

Это веселый и неочевидный пример. Обрабатывается как: переменная x = (y = 1); таким образом, "y=1” создает глобальную переменную, так как нет никакого связывающего "переменного" оператора для него. Затем это значение копируется в должным образом определенную локальную переменную "x”.

Code
<script>
Object.prototype.foo = 10;  
console.log(foo); // 10
</script>

@kriskowal, указывает, что лексическая проверка могла бы решить эту проблему. А, JavaScript маленький грязный язычок! Грязная грязная … неряха! Как ты любишь эти глобальные переменные… оооооо да! …

Code
<script>
3 == "3" // true
</script>

Напоминает нам почему === гораздо лучше...

Code
<script>
// Только для ff
setTimeout(function(rand){ alert(rand); },10); // FF получает "магический" параметр, который мы назовем "rand"
for (var i=0; i<100000; i++) { i; } // тратим время
</script>

Только в Firefox, в любую функцию, выполняемую в setTimeout или setInterval, передастся (хотите ли Вы это к или нет), таинственная переменная "rand", которая представляет число миллисекунд в течение которых функция выполняется. Это полный отсос, потому что это может затереть преднамеренно непереданную "дефолтную" переменную в вашей функции. Ещё больший отсос, если эта переменная предназначена, чтобы быть булевской переменной, потому что вы заканчиваете со "случайными" значениями true/false.

Code
<script>
(function(){
  alert(window); // "undefined"
  var window = window;
})();
</script>

Из за "(подъема|всплытия)" все объявления переменных будут произведены в самом верху массива функции. Меж тем инициализация не всплывает. Поэтому локальная переменная window объявлена но не инициализирована! Что за... веселье.

Code
<script>
// В JavaScript, undefined это ни что иное как глобальная переменная. Поэтому,хоть её начальное значение и undefined, вы можете его изменить:
   
var a = {};
a.b === undefined; // true потому что b не объявлено
undefined = 42;
a.b === undefined; // false
   
// Из за этой переменчивости undefined лучше проверять через typeof:
   
var a = {};
typeof a.b == 'undefined'; // always true
</script>

Да, что за черт!

Code
<script>
[] == ![] // true
</script>

Массивы оцениваются как булевская истина и это имеет значение, хотя и фигово читается.

Code
<script>
"string" instanceof String; // false.  
   
// хотя это и не строка, это может быть похоже на строку
// а вообще это закос под банан...
</script>

Когда строка - не строка...

Code
<script>
[] == false; // true
"" == false; // true
null == false; // false, это гораздо большее =)
</script>

Без комментариев..

Code
<script>
typeof null // object
null === Object // false
</script>

Ноль это не объект...

Code
<script>
parseInt('06'); // 6
parseInt('08'); // 0
</script>

Это потому что parseInt принимает второй параметр для основания системы счисления. Если он не поставляется, и строка начинается с 0, она будет анализироваться как восьмеричное число. Именно так!

Code
<script>
Number.MIN_VALUE > 0;
// да? правда? какого хрена...
// Это показывает, что MIN_VALUE - меньшее из всех чисел
// БОЛЬШЕ ЧЕМ НОЛЬ, что естественно имеет глубокий смысл.
</script>

Гхм..

Code
<script>
typeof NaN // number конечно...
</script>

Ну теперь то всё ясно!

Code
<script>
alert(11111111111111111); // выдаст 11111111111111112
</script>

Это происходит потому что число превышает максимально допустимое значение и начинает сбоить в младших разрядах (от Aleko)

Code
<script>
("foo" + + "bar") === "fooNaN" // true
</script>

Выглядит интересно но на самом деле вполне логично

Code
<script>
NaN === NaN // false
</script>

Некоторые говорят что это имеет смысл, другие любят нюхать клей..

Code
<script>
(x=[].reverse)() === window // true
</script>

Спасибо http://twitter.com/tobeytailor за эту красоту

Code
<script>
Infinity === 1/0 // true
0.1 + 0.2 === 0.3 // false
</script>

На чистоту: яваскрипт это не самый красивый и интуитивный язык для мат-вычислений..

Источник wtfjs.com .

Жми на пятую!
15, 5, 4039
№3
Заметил ещё один косяк:

javascript: alert(navigator.appCodeName);

В Opera 10.00 возвращает 'Mozilla'.

№2
Видно у создателей джавы с математикой было не все в порядке :)
№1
Я просто рыдал от смеха когда читал это в первый раз! Надеюсь вам тоже понравится.
    © Блог StudioAD.ru 2024 год нашей эры. Не все права защищены... Копирование любой информации и материалов с обратной ссылкой приветствуется! Хостинг от uCoz.

    Если вам пришлись по душе материалы моего блога - подпишитесь на RSS дабы получать обновления незамедлительно! Я рад что вы читаете и комментируете мои экзерсисы, приятного времяпрепровождения.