Zoeken…
soort van
typeof
is de 'officiële' functie die men gebruikt om het type
in javascript te krijgen, maar in bepaalde gevallen kan het onverwachte resultaten opleveren ...
1. Snaren
typeof "String"
of
typeof Date(2011,01,01)
"draad"
2. nummers
typeof 42
"aantal"
3. Bool
typeof true
(geldige waarden true
en false
)
"Boolean"
4. Object
typeof {}
of
typeof []
of
typeof null
of
typeof /aaa/
of
typeof Error()
"voorwerp"
5. functie
typeof function(){}
"functie"
6. Niet gedefinieerd
var var1; typeof var1
"Undefined"
Objecttype ophalen op constructeursnaam
Wanneer een met typeof
exploitant één soort zet object
valt in categorie enigszins waart ...
In de praktijk moet je het misschien beperken tot wat voor soort 'object' het eigenlijk is en een manier om het te doen is om de naam van de constructor van het object te gebruiken om de smaak van het object te krijgen: Object.prototype.toString.call(yourObject)
1. String
Object.prototype.toString.call("String")
"[object String]"
2. Nummer
Object.prototype.toString.call(42)
"[objectnummer]"
3. Bool
Object.prototype.toString.call(true)
"[object Boolean]"
4. Object
Object.prototype.toString.call(Object())
of
Object.prototype.toString.call({})
"[Object Object]"
5. functie
Object.prototype.toString.call(function(){})
"[object Functie]"
6. Datum
Object.prototype.toString.call(new Date(2015,10,21))
"[objectdatum]"
7. Regex
Object.prototype.toString.call(new RegExp())
of
Object.prototype.toString.call(/foo/);
"[object RegExp]"
8. Serie
Object.prototype.toString.call([]);
"[object Array]"
9. Null
Object.prototype.toString.call(null);
"[object Null]"
10. Niet gedefinieerd
Object.prototype.toString.call(undefined);
"[object niet gedefinieerd]"
11. Foutmelding
Object.prototype.toString.call(Error());
"[objectfout]"
De klasse van een object zoeken
Als u wilt weten of een object is gebouwd door een bepaalde constructor of er een heeft geërfd, kunt u de opdracht instanceof
gebruiken:
//We want this function to take the sum of the numbers passed to it
//It can be called as sum(1, 2, 3) or sum([1, 2, 3]) and should give 6
function sum(...arguments) {
if (arguments.length === 1) {
const [firstArg] = arguments
if (firstArg instanceof Array) { //firstArg is something like [1, 2, 3]
return sum(...firstArg) //calls sum(1, 2, 3)
}
}
return arguments.reduce((a, b) => a + b)
}
console.log(sum(1, 2, 3)) //6
console.log(sum([1, 2, 3])) //6
console.log(sum(4)) //4
Merk op dat primitieve waarden niet als instanties van een klasse worden beschouwd:
console.log(2 instanceof Number) //false
console.log('abc' instanceof String) //false
console.log(true instanceof Boolean) //false
console.log(Symbol() instanceof Symbol) //false
Elke waarde in JavaScript heeft naast null
en undefined
ook een constructor
waarin de functie is opgeslagen die is gebruikt om deze te construeren. Dit werkt zelfs met primitieven.
//Whereas instanceof also catches instances of subclasses,
//using obj.constructor does not
console.log([] instanceof Object, [] instanceof Array) //true true
console.log([].constructor === Object, [].constructor === Array) //false true
function isNumber(value) {
//null.constructor and undefined.constructor throw an error when accessed
if (value === null || value === undefined) return false
return value.constructor === Number
}
console.log(isNumber(null), isNumber(undefined)) //false false
console.log(isNumber('abc'), isNumber([]), isNumber(() => 1)) //false false false
console.log(isNumber(0), isNumber(Number('10.1')), isNumber(NaN)) //true true true