Неожиданные результаты в javascript
Это мой достаточно вольный перевод одного очень интересного материала который просто не мог оставить меня равнодушным. Наслаждайтесь.
Javascript - язык, который мы любим несмотря на многочисленные поводы его ненавидеть. Это коллекция различных неисправностей, непостоянств и просто очень неинтуитивных моментов в языке сети.
Веселье с конкатенацией.
Я уверен что это прекратит все дебаты о том, к чему принадлежат изогнутые скобки... а?
У JavaScript есть смехотворный список зарезервированных слов; большинство из них даже не используется как ключевые слова в языке. Современные браузеры позволяют использовать большинство этих слов как идентификаторы, несмотря на то, что говорят спецификации. Но Сафари не нравится enum по некоторым причинам.
В моих поисках, была ли Бесконечность конечным числом, я нашел это. Два числа, которые являются различными, являются в то же время одинаковыми..
Показывает что true иногда имеет значение.. ух, что за черт!
А, подумаешь что там ноль, это ерунда..
Мухаха!
Firebug ни за что не позволит вам создать переменную с именем console. Попробуйте и он вдарит вам по яйцам..
Это веселый и неочевидный пример. Обрабатывается как: переменная x = (y = 1); таким образом, "y=1” создает глобальную переменную, так как нет никакого связывающего "переменного" оператора для него. Затем это значение копируется в должным образом определенную локальную переменную "x”.
@kriskowal, указывает, что лексическая проверка могла бы решить эту проблему. А, JavaScript маленький грязный язычок! Грязная грязная … неряха! Как ты любишь эти глобальные переменные… оооооо да! …
Напоминает нам почему === гораздо лучше...
Только в Firefox, в любую функцию, выполняемую в setTimeout или setInterval, передастся (хотите ли Вы это к или нет), таинственная переменная "rand", которая представляет число миллисекунд в течение которых функция выполняется. Это полный отсос, потому что это может затереть преднамеренно непереданную "дефолтную" переменную в вашей функции. Ещё больший отсос, если эта переменная предназначена, чтобы быть булевской переменной, потому что вы заканчиваете со "случайными" значениями true/false.
Из за "(подъема|всплытия)" все объявления переменных будут произведены в самом верху массива функции. Меж тем инициализация не всплывает. Поэтому локальная переменная window объявлена но не инициализирована! Что за... веселье.
Да, что за черт!
Массивы оцениваются как булевская истина и это имеет значение, хотя и фигово читается.
Когда строка - не строка...
Без комментариев..
Ноль это не объект...
Это потому что parseInt принимает второй параметр для основания системы счисления. Если он не поставляется, и строка начинается с 0, она будет анализироваться как восьмеричное число. Именно так!
Гхм..
Ну теперь то всё ясно!
Это происходит потому что число превышает максимально допустимое значение и начинает сбоить в младших разрядах (от Aleko)
Выглядит интересно но на самом деле вполне логично
Некоторые говорят что это имеет смысл, другие любят нюхать клей..
Спасибо http://twitter.com/tobeytailor за эту красоту
На чистоту: яваскрипт это не самый красивый и интуитивный язык для мат-вычислений..
Javascript - язык, который мы любим несмотря на многочисленные поводы его ненавидеть. Это коллекция различных неисправностей, непостоянств и просто очень неинтуитивных моментов в языке сети.
Code
<script>
"3" + 1 // '31'
"3" - 1 // 2
"222" - -"111" // "333" (⊙﹏⊙)
</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>
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>
// В Safari, попробуйте...
var enum;
//-> SyntaxError: Parse error
</script>
У JavaScript есть смехотворный список зарезервированных слов; большинство из них даже не используется как ключевые слова в языке. Современные браузеры позволяют использовать большинство этих слов как идентификаторы, несмотря на то, что говорят спецификации. Но Сафари не нравится enum по некоторым причинам.
Code
<script>
// числа слева от 'e' - 7 и 8
alert( 1.7976931348623157e+308 === 1.7976931348623158e+308 ); // true!
</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 + 1) === 2; // true
(true + true) === 2; // true
true === 2; // false
true === 1; // false
</script>
Показывает что true иногда имеет значение.. ух, что за черт!
Code
<script>
3=="03" // true!
</script>
3=="03" // true!
</script>
А, подумаешь что там ноль, это ерунда..
Мухаха!
Code
<script>
// пока вы в firebug, попробуйте:
var console = {}; // или в общем что ни будь...
</script>
// пока вы в firebug, попробуйте:
var console = {}; // или в общем что ни будь...
</script>
Firebug ни за что не позволит вам создать переменную с именем console. Попробуйте и он вдарит вам по яйцам..
Code
<script>
(function(){
var x = y = 1;
})();
alert(x); // undefined
alert(y); // 1 - оппачки, глобальная!
</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>
Object.prototype.foo = 10;
console.log(foo); // 10
</script>
@kriskowal, указывает, что лексическая проверка могла бы решить эту проблему. А, JavaScript маленький грязный язычок! Грязная грязная … неряха! Как ты любишь эти глобальные переменные… оооооо да! …
Code
<script>
3 == "3" // true
</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>
// Только для 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>
(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>
// В 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>
[] == ![] // true
</script>
Массивы оцениваются как булевская истина и это имеет значение, хотя и фигово читается.
Code
<script>
"string" instanceof String; // false.
// хотя это и не строка, это может быть похоже на строку
// а вообще это закос под банан...
</script>
"string" instanceof String; // false.
// хотя это и не строка, это может быть похоже на строку
// а вообще это закос под банан...
</script>
Когда строка - не строка...
Code
<script>
[] == false; // true
"" == false; // true
null == false; // false, это гораздо большее =)
</script>
[] == false; // true
"" == false; // true
null == false; // false, это гораздо большее =)
</script>
Без комментариев..
Code
<script>
typeof null // object
null === Object // false
</script>
typeof null // object
null === Object // false
</script>
Ноль это не объект...
Code
<script>
parseInt('06'); // 6
parseInt('08'); // 0
</script>
parseInt('06'); // 6
parseInt('08'); // 0
</script>
Это потому что parseInt принимает второй параметр для основания системы счисления. Если он не поставляется, и строка начинается с 0, она будет анализироваться как восьмеричное число. Именно так!
Code
<script>
Number.MIN_VALUE > 0;
// да? правда? какого хрена...
// Это показывает, что MIN_VALUE - меньшее из всех чисел
// БОЛЬШЕ ЧЕМ НОЛЬ, что естественно имеет глубокий смысл.
</script>
Number.MIN_VALUE > 0;
// да? правда? какого хрена...
// Это показывает, что MIN_VALUE - меньшее из всех чисел
// БОЛЬШЕ ЧЕМ НОЛЬ, что естественно имеет глубокий смысл.
</script>
Гхм..
Code
<script>
typeof NaN // number конечно...
</script>
typeof NaN // number конечно...
</script>
Ну теперь то всё ясно!
Code
<script>
alert(11111111111111111); // выдаст 11111111111111112
</script>
alert(11111111111111111); // выдаст 11111111111111112
</script>
Это происходит потому что число превышает максимально допустимое значение и начинает сбоить в младших разрядах (от Aleko)
Code
<script>
("foo" + + "bar") === "fooNaN" // true
</script>
("foo" + + "bar") === "fooNaN" // true
</script>
Выглядит интересно но на самом деле вполне логично
Code
<script>
NaN === NaN // false
</script>
NaN === NaN // false
</script>
Некоторые говорят что это имеет смысл, другие любят нюхать клей..
Code
<script>
(x=[].reverse)() === window // true
</script>
(x=[].reverse)() === window // true
</script>
Спасибо http://twitter.com/tobeytailor за эту красоту
Code
<script>
Infinity === 1/0 // true
0.1 + 0.2 === 0.3 // false
</script>
Infinity === 1/0 // true
0.1 + 0.2 === 0.3 // false
</script>
На чистоту: яваскрипт это не самый красивый и интуитивный язык для мат-вычислений..
Источник wtfjs.com .
15, 5, 4108
javascript: alert(navigator.appCodeName);
В Opera 10.00 возвращает 'Mozilla'.