Jedna z vlastností, ktorá sa mi páči na javascripte je Weak Typing. Nie že by som to pokladal za nejakú super výhodu. Na otázku, či je lepší pogramovací jazyk
podporujúci Strong Typing alebo Weak Typing, by som si za víťaza zvolil určite toho skôr menovaného.
Na druhej strane to, že v javascripte sa môže dátový typ premennej meniť počas behu programu umožňuje písať kód tak, ako by sme ho napríklad v C# nikdy
nenapísali.
|
var x;
x = 1;
console.info(x);
console.log(typeof(x));
x = "some string";
console.info(x);
console.log(typeof(x));
x = {};
console.info(x);
console.log(typeof(x));
|
|
Príklad zmeny dátového typu premennej
|
Častým takýmto prípadom využitia je metóda, ktorá na základe dátového typu vstupného parametra vykoná rôzne operácie. Ja som si takúto metódu vyrobil. Moja metóda
mala jeden vstupný parameter. Ak tento bol typu string, tak to znamenalo, že parameter reprezentuje id html elementu, ale ak bol typu object, tak
to bol priamo html element. A konečne sa dostávam k jadru problému. Zistiť, či je premenná typu string je jednoduché použitím operátora typeof (viď.
Príklad zmeny dátového typu premennej). Ak je však premenná handle na html element, operátor typeof
zahlási že je to object. No dobre, ale objekt môže byť aj niečo iné ako len html element. Po relatívne krátkej dobe, som našiel spôsob, ako overiť či premená
predstavuje handle na html element. Výsledok mojej snahy je možné vidieť na nasledovnej úkážke:
|
var isHtmlNode = function (o) {
if (typeof (Node) === "object") {
return o instanceof Node;
}
else {
return (typeof (o) === "object") && (typeof (o.nodeType) === "number")
&& (typeof (o.nodeName) === "string");
}
};
var isHtmlElement = function (o) {
if (typeof (HTMLElement) === "object") {
return o instanceof HTMLElement;
}
else {
return (typeof (o) === "object") && (o.nodeType === 1)
&& (typeof (o.nodeName) === "string");
}
};
|
|
Metódy overujúce, či je premenná html element
|
Prvá metóda overí, či je vstupný objekt inštanciou triedy Node a druhá či je vstupný objekt inštanciou triedy HTMLElement. Ich použitie môže vyzerať aj takto:
|
var setContent = function (o) {
if (isHtmlElement(content) || isHtmlNode(content)) {
// o is an html element
}
else if (typeof(o) === "string") {
// o is id of an html element
}
else {
// throw an error
}
};
|
|
Príklad použitia metód pre detekciu objektu typu HTMLElement
|
Takto si môžeme vyrobiť aj oveľa presnejšie metódy pre detekciu konkrétnych elementov, či už to podľa atribútu tagName alebo detekciou na konkrétne
triedy, ktoré dedia z triedy HTMLElement (HTMLAnchorElement, HTMLAppletElement, HTMLAreaElement, HTMLBaseElement, HTMLBaseFontElement, HTMLBlockquoteElement, HTMLBodyElement, HTMLBRElement, HTMLButtonElement, HTMLDirectoryElement, HTMLDivElement, HTMLDListElement, HTMLFieldSetElement, HTMLFontElement, HTMLFormElement, HTMLFrameElement, HTMLFrameSetElement, HTMLHeadElement, HTMLHeadingElement, HTMLHRElement, HTMLHtmlElement, HTMLIFrameElement, HTMLImageElement, HTMLInputElement, HTMLIsIndexElement, HTMLLabelElement, HTMLLayerElement, HTMLLegendElement, HTMLLIElement, HTMLLinkElement, HTMLMapElement, HTMLMenuElement, HTMLMetaElement, HTMLModElement, HTMLObjectElement, HTMLOListElement, HTMLOptGroupElement, HTMLOptionElement, HTMLParagraphElement, HTMLParamElement, HTMLPreElement, HTMLQuoteElement, HTMLScriptElement, HTMLSelectElement, HTMLStyleElement, HTMLTableCaptionElement, HTMLTableCellElement, HTMLTableColElement, HTMLTableElement, HTMLTableRowElement, HTMLTableSectionElement, HTMLTextAreaElement, HTMLTitleElement, HTMLUListElement).