gruss Ihr Beiden,
alert("list ist ein String: " + ((typeof list) == 'string'));
es ist auch moeglich, die "constructor"-eigenschaft
eines objekts abzufragen:
(list.contructor == String) bzw. (list.contructor == Array)
generell ist bei typ-erkennung auch immer darauf zu achten,
ob das zu pruefende objekt mit dem wert [null] belegt ist,
ob es ueberhaupt definiert ist und ob eigenschaften, welche
abgefragt werden sollen, ueberhaupt existieren;
der operator "typeof" - den man im uebrigen auch funktional
verwenden kann: "typeof()" - liefert nur die typen "string",
"boolean", "number", "function", "object" und "undefined";
zurueck, wobei "typeof(null)" ebenfalls "object" ergibt;
aehnlich wie im beispiel von [null] verhaelt es sich mit dem
definierten nichtwert fuer Number-objekte [NaN]; ein "typeof"
fuer diesen wert liefert "number" - hier hilft auch nicht die
"constructor"-eigenschaft weiter, die "function Number(){...}"
liefert;
ausserdem ist der zurueckgelieferte wert fuer einunddenselben
objekt-typ konstruktionsbedingt:
var x = new String(12345); alert(typeof(x)); // ergibt "object";
var x = "12345"; alert(typeof(x)); // ergibt "string";
weiterhin haengt der zurueckgelieferte objekt-typ von der
browserimplementation ab:
MSIE und opera liefern fuer:
var x = new RegExp("\s+","g"); alert(typeof(x)); // "object";
var x = /\s+/g; alert(typeof(x)); // "object";
wohingegen mozilla folgende implemtierung offenbart:
var x = new RegExp("\s+","g"); alert(typeof(x)); // "function";
var x = /\s+/g; alert(typeof(x)); // "function";
die in js vorhandenen bordmittel fuer exakte "type detection" sind
also nicht immer ausreichend - die gerade beschriebenen faelle sollten
dabei immer im auge behalten werden;
bei grossen objekt-orientierten js-projekten kommt dann sicher schnell
der wunsch nach detaillierteren methoden zur typ-bestimmung von objekten
auf - zumindest war das bei mir der fall - hier das ergebnis:
//typen-ermittlung;
this.isUndefined = function(obj) {
return (typeof(obj) == "undefined");
};
this.isNull = function(obj) {
return ((typeof(obj) == "object") && (obj === null));
};
//liefert [true] fuer jedes ECMA-object, welches das argument dieser globalen funktion ist;
this.isNative = function(obj) {
return (!isUndefined(obj) && !isNull(obj) && (typeof(obj.constructor) == "function"));
};
//der rueckgabewert haengt von der browser-implementation ab:
//z.b. sind alle DOM-knoten im MSIE "Aliens", da diese objekte nicht die "constructor"-
//eigenschaft unterstuetzen (jedes native objekt sollte aber diese eigenschaft haben,
//wobei der konstruktor eine funktion sein muss);
this.isAlien = function(obj) {
return (isObject(obj) && (typeof(obj.constructor) != "function"));
};
//gilt browseruebergreifend fuer alle DOM-knoten, deren eigenschaften, methoden und
//prototypen-objekte (bzw. deren konstruktor-funktionen, falls es solche gibt) noch
//im unveraenderten originalzustand vorliegen;
this.isNode = function(obj) {
return (((isAlien(obj) && isUndefined(obj.prototype) && isUndefined(obj.constructor)) || (isNative(obj) && isUndefined(obj.prototype) && (obj.constructor == Object))) ? ((obj.nodeType&&obj.cloneNode) ? (true) : (false)) : (false));
};
this.isBoolean = function(obj) {
return (isNative(obj) && (obj.constructor == Boolean));
};
this.isNumber = function(obj) {
return (isNative(obj) && (obj.constructor == Number) && isFinite(obj));
};
this.isString = function(obj) {
return (isNative(obj) && (obj.constructor == String));
};
//gibt [true] zurueck, falls das argument dieser globalen funktion
//eines der ECMA-objekte "Boolean", "Number" und "String" ist;
this.isPrimitive = function(obj) {
return (isString(obj) || isNumber(obj) || isBoolean(obj));
};
//gibt [true] zurueck, falls das argument dieser globalen funktion
//eines der ECMA-objekte "Date", "Error", "RegExp", "Function",
//"Array" bzw. "Object", ein ueber eine selbstdefinierte
//konstruktor-funktion erzeugtes objekt oder aber ein DOM-knoten
//des clients ist;
this.isObject = function(obj) {
return (!isUndefined(obj) && !isNull(obj) && !isPrimitive(obj));
};
this.isDate = function(obj) {
return (isNative(obj) && (obj.constructor == Date));
};
this.isError = function(obj) {
return (isNative(obj) && (obj.constructor == Error));
};
this.isRegExp = function(obj) {
return (isNative(obj) && (obj.constructor == RegExp));
};
this.isFunction = function(obj) {
return (isNative(obj) && (obj.constructor == Function));
};
this.isArray = function(obj) {
return (isNative(obj) && (obj.constructor == Array));
};
//gibt [true] zurueck, falls es sich beim konstruktor ausschliesslich um das globale objekt "Object" handelt;
this.isObjectObject = function(obj) {
return (isNative(obj) && !isNode(obj) && (obj.constructor == Object));
};
//gibt [true] zurueck, falls es sich beim konstruktor ausschliesslich um eine selbstdefinierte konstruktor-funktion handelt;
this.isConstructedObject = function(obj) {
return (isNative(obj) && !isNode(obj) && (obj.constructor != String) && (obj.constructor != Number) && (obj.constructor != Boolean) && (obj.constructor != Object) && (obj.constructor != Array) && (obj.constructor != Function) && (obj.constructor != RegExp) && (obj.constructor != Error) && (obj.constructor != Date));
};
by(t)e by(t)e - peterS. - pseliger@gmx.net
sh:| fo:) ch:? rl:| br:& n3:} n4:# ie:| mo:{ va:| de:[ zu:] fl:) ss:) ls:& js:)