Dlaczego new Boolean jest złym pomysłem

Javascript to język w pełni obiektowy. Obiektem jest wszystko: funkcja – obiekt, obiekt – obiekt, zmienna – obiekt… Eh, no i ta pełność ma swoje „widzimisie” i problemy.

Wartości logiczne

W klasycznej logice są dwie: true i false (prawda i fałsz). W JS istnieje jednak konstruktor dla wartości logicznych:

[javascript]var oBool = new Boolean(false);[/javascript] Czytaj dalej Dlaczego new Boolean jest złym pomysłem

Mierzenie czasu wykonania skryptów JS

Czasem przydatna staje się wiedza o tym, które ze znanych rozwiązań jest szybsze. Oczywiście można polegać na teoretycznej wiedzy, podpierać się nawet złożonością algorytmów itd. itd. Często jednak starczy kilka prostych testów. Oto obiekt pozwalający w banalny sposób sprawdzić jak szybko wykonał się skrypt. Nazwałem go yProfiler.

Kod

[javascript]// obiekt yProfiler – zliczanie czasu wykonania skryptu
// autor: Patryk yarpo Jar
var yProfiler = function()
{
var nTimeStart = 0,
nTimeStop  = 0,
nLastDuration = -1,
oDate = null;

function fStart()
{
oDate = new Date();
nTimeStart = oDate.getTime();
return nTimeStart;
}
function fStop()
{
oDate = new Date();
nTimeStop = oDate.getTime();
nLastDuration = nTimeStop-nTimeStart;
return nLastDuration;
}
function fTime()
{
// nie wystartowano jeszcze :/
if (!nTimeStart)
{
return false;
}
// nie skonczono jeszcze
if (!nTimeStop)
{
fStop();
}
if (nLastDuration < 0 || isNaN(nLastDuration))
{
nLastDuration = nTimeStop – nTimeStart;
}
return nLastDuration;
}
function fGetStart()
{
return (nTimeStart) ? nTimeStart : false;
}
function fGetStop()
{
return (nTimeStop) ? nTimeStop : false;
}
function fLoop(func, n)
{
fStart();
for(i = 0; i < n; i++)
{
func();
}
fStop();
return nLastDuration;
}

// konstruktor:
fStart(); // domyslnie startuje
return {
start   : fStart,
stop    : fStop,
time    : fTime,
getStart: fGetStart,
getStop : fGetStop,
loop    : fLoop
};
};[/javascript]

W tym obiekcie można dostrzec właściwości private, o których więcej przeczytasz na stronie Douga Crockforda. Wykorzystałem tu także wzorzec modułowy do stworzenia obiektu (kiedyś opiszę kilka sposobow na produkcję obiektów) dzięki czemu nie trzeba, a nawet nie należy używać operatora new (przeczytaj dlaczego – blog YUI).

Zastosowanie

[javascript]var time = yProfiler();

function test1()
{
var n = 10000;
for(var i=0; i < n; i++)
{
var a = a+a;
}
}
time.start();
test1();
alert(time.stop());[/javascript]

Powyższy kod pozwala na wykorzystanie metody yProfiler.loop(). Przyjmuje ona dwa parametry – pierwszy to referencja na funkcję, która ma być wywołana, drugi – liczba wywołań tej funkcji (patrz prywatną metodę yProfiler.fLoop()). Na koniec wszystko jest wyświetlane za pomocą alertów. Jest jeszcze drugi sposób wywołania.

Zastosowanie 2

[javascript]var time = yProfiler();
var n = 10000;
alert(time.loop(function(i) { var a = i+i; } ), n);[/javascript]

Jeśli zajrzysz do środka tego obiektu to pierwsza metoda jest niejawnym wywołaniem drugiej. Przyjemnych testów wydajności. Pamiętaj, że nie można traktować wyników jako wyroczni. Wiele zależy od przeglądarki, sprzętu i innych czynników. Nie gwarantuję także, że obiekt ten jest wolny od błędów – używasz na swoją odpowiedzialność.

Sposoby tworzenia funkcji w JS

Javascript jest niezwykle ekspresyjnym językiem. Istnieje w niej wiele ciekawych rozwiązań pozwalających tworzyć krótszy lub bardziej czytelny kod. W tej poradzie pokażę dwa różne podejścia do tworzenia funkcji / metod.

Sposób 1 – tradycyjny

[javascript]function nazwa_funkcji_1()
{
    alert("nazwa_funkcji_1: Ja istnieje!");
}[/javascript]

Jeśli kiedykolwiek tworzyłeś swoje funkcje, to z pewnością zapis ten jest ci dobrze znany. Zapis ten jest używany także w PHP. Po słowie kluczoowym function należy podać ciąg znaków spełniający odpowiednie warunki (nie może zaczynać się od liczby, nie może mieć spacji itp, i td.) po czym należy podać parę nawiasów. W nawiasach można podać argumenty, ale nie trzeba. Czytaj dalej Sposoby tworzenia funkcji w JS

Literał obiektowy zamiast konstruktorów

O literale obiektowym  kilka razy pisałem już. Tym razem napiszę o przewadze literału nad konstruktorami `Array’ oraz` Object’.

W JS można stworzyć obiekt na dwa sposoby:

Sposób I

[javascript]var o = new Object();[/javascript]

Sposób II

[javascript]var o = {};[/javascript]

Zaletą pierwsze sposobu jest czytelność. Każdy, nawet nie znając JS programista będzie wiedział, że `new Object()’ stworzy nowy obiekt… No chyba, że nie, zobaczmy taki przykład:

[javascript]function example() { alert(1); }
example();
example = function() { alert(2); }
example();[/javascript]

Czytaj dalej Literał obiektowy zamiast konstruktorów