JavaScript дреболии
При четене на спецификацията на 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>
Това важи и за другите езици разбира се и задава типа по подразбиране на скриптовете в документа.
Полезно. Браво, че си ги събрала на едно място тези неща.
Comment by Боян Юруков — 19/8/2007 @ 6:02 pm