Irina’s Weblog

18/8/2007

JavaScript дреболии

Filed under: Computers,Daily — Izida @ 10:30 pm

При четене на спецификацията на ECMAScript 2.0 и на книгата “JavaScript: The Definitive Guide /5th edition/” на O’Reilly попаднах на някои забавни дреболии :

  • Мислите ли, че има разлика между следните две парчета код?
    function myFunc() {
    return 5;
    }
    alert(myFunc());

    function myFunc() {
    return
    5;
    }
    alert(myFunc());

    Предлагам ви преди да кажете “Не!” да тествате. Оказа се, че според спецификацията JavaScript, явявайки език за програмиране насочен и към професионални програмисти, и към аматьори, се опитва да “мисли” вместо програмиста. И да слага ‘;’ там, където прецени, че липсва. Е, ако между return/throw и следващия ги израз, или между break/continue и етикета, или между променлива и постинкремент/постдекремент имате нов ред, то JavaScript вмъква точка и запетая преди новия ред. Така че пишете тези изрази на един ред ако не искате сума време да се чудите какво не е наред в иначе кристално ясния ви код.
  • В описанието на типа Number срещнах следния текст:

    Note that these two infinite number values are produced by the program expressions +Infinity (or simply Infinity) and
    -Infinity, assuming that the globally defined variable Infinity has not been altered by program
    execution.

    Това провокира у мен следния тест:

    alert(5 == +Infinity); // резултат : false
    Infinity=5;
    alert(5 == +Infinity); // резултат : true

  • оператор === : сравнява не само стойностите, но и типовете; Например :
    var a = 5;
    alert(a == "5"); // вярно
    alert(a === "5") // лъжа - различни типове;
  • Трябва да се внимава когато искаме да разберем дали една променлива е изрично установена на null и кога просто не е инициализирана, т.е. има стойност undefined. Простото сравнение :
    unknownVar == null;
    където unknownVar е локална променлива, спомената за първи път, връща истина! За това ако искаме да сме убедени, че стойността е наистина undefined, а не null, трябва да сравняваме променливата с null чрез оператор===:
    unknownVar === null;
  • Булевият оператор ИЛИ (||) работи доста сходно на същия оператор в C/C++/Java – ако десния операнд е true или може да се конвертира до тази стойност, то изобщо не се изчислява левия, защото така или иначе логическото условие е удовлетворено (една от стойностите е true). До тук нищо ново. Само че се оказва, че JavaScript не присвоява за стойност на оператора ИЛИ булева стойност – true или false, а стойността на самия операнд! Т.е. стойност на израза е първия от двата операнда (от ляво на дясно), който не може да се преобразува до false – не е undefined, не е null и т.н. Така че може да се използва по следния начин :
    var width = minWidth || averageWidth || 50;
    Ако никоя от първите стойности не е зададена, то на width ще се присвои стойност 50;
  • Можем да изтрием последните N елемента на масив по следния начин:
    var a = [1, 2, 3, 4, 5, 6];
    var n = 2;
    a.length = a.length - n;
    alert(a.join(", "));
  • Функцията Array.slice() връща подмасив, започвайки от посочения първи индекс до втория индекс. Какво става обаче ако подадем отрицателно число като индекс?
    var a = [1, 2, 3, 4, 5, 6];
    var n = 2;
    var b = a.slice(1, -1);
    alert(b.join(", "));

    Връща подмасив, започващ от елемента с индекс 1 (т.е. втория елемент), като спира без да включва на последния елемент.
  • Ако искате да пропуснете досадния атрибут type=”text/javascript” в HTML документа, то включете следното в head секцията:
    <meta http-equiv="Content-Script-Type" content="text/javascript"></meta>
    Това важи и за другите езици разбира се и задава типа по подразбиране на скриптовете в документа.

1 Comment »

  1. Полезно. Браво, че си ги събрала на едно място тези неща.

    Comment by Боян Юруков — 19/8/2007 @ 6:02 pm

RSS feed for comments on this post. TrackBack URI

Leave a comment

п»ї