Scott Tiger Tech Blog

Blog technologiczny firmy Scott Tiger S.A.

Dziwactwa JavaScriptu

Autor: Piotr Karpiuk o poniedziałek 18. Lipiec 2016

Programując w JavaScripcie i czytając różne książki na temat tego języka, natknąłem się na szereg mało intuicyjnych i dość zabawnych zachowań interpretera. Poniżej moja lista – jeśli ktoś ma inne propozycje, proszę o komentarz.

[1,3,20].sort() // [1,20,3]

Wyjaśnienie: Domyślny komparator sortuje leksykograficznie.


var a = [1,2,3];
var b = [1,2,3];
var c = "1,2,3";

a == c; // true
b == c; // true
a == b; // false

Wyjaśnienie: Zwracaj szczególną uwagę na reguły porównywania za pomocą operatorów == i ===, jeżeli porównujesz dwie wartości typów innych niż proste, takie jak obiekty (typ object, łącznie z function i array). Ponieważ wartości te są w rzeczywistości przechowywane przez odniesienie, więc oba operatory == i === po prostu sprawdzają, czy odniesienia są takie same; nie sprawdzają faktycznych wartości wskazywanych przez te odniesienia. Z kolei gdy porównujemy typ prosty (np. łańcuch) z obiektem (np. tablicą), tablica jest konwertowana do łańcucha przez po prostu połączenie przecinkami (,) wszystkich wartości.


5 in [4,5,6] // false
2 in [4,5,6] // true

Wyjaśnienie: operator in sprawdza, czy w obiekcie występuje klucz o podanej nazwie. Tablica w JavaScripcie jest rodzajem obiektu (mapy), w którym kluczami są kolejne liczby całkowite.


var a = 'foo';
a[1] = 'X';
console.info(a, a[1]);// 'foo', 'o'

Wyjaśnienie: łańcuchy w JS są niemodyfikowalne (w trybie ścisłym poleci błąd).


42.toFixed( 3 );   // SyntaxError
(42).toFixed( 3 ); // "42.000"
42..toFixed(3)     // "42.000"

Wyjaśnienie: kropka jest interpretowana przez skaner jako element literału liczbowego.


0.1 + 0.2 == 0.3 // false

var a = new Boolean(false);
var b = new Number(0);
var c = new String('');
console.info( new Boolean(a && b && c) ); // true

parseInt( 1/0, 19 ); // 18

Wynikiem 1/0 jest Infinity, konwertowane na łańcuch "Infinity"; litera "I" to w systemie liczbowym o podstawie 19 liczba o wartości 18, z kolei litera "n" jest już nieprawidłową cyfrą więc na niej parseInt kończy działanie, zwracając 18.


[] + {} // [object Object]
{} + [] // 0

[] == ![]          // true
"42" == true       // false
undefined == false // false
null == false      // false
42 == [42]         // true
false == []        // true
"" == []           // true
0 == []            // true
2 == [2]           // true
0 == "\n"          // true
"true" == true     // false

Jeżeli którakolwiek wartość (strona wyrażenia) w operacji porównania może być 0, "", [], true lub false, to unikaj operatora == i zamiast niego stosuj ===.


var a = { b: 42 };
var b = { b: 43 };

a < b; // false
a == b // false
a <= b // true
a >= b // true
Share and Enjoy:
  • del.icio.us
  • Facebook
  • Google Bookmarks
  • Śledzik
  • Blip
  • Blogger.com
  • Gadu-Gadu Live
  • LinkedIn
  • MySpace
  • Wykop

Zostaw komentarz

XHTML: Możesz użyć następujących tagów: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>