Ricerca…
tipo di
typeof
è la funzione 'ufficiale' che si usa per ottenere il type
in javascript, tuttavia in certi casi potrebbe produrre risultati inattesi ...
1. Archi
typeof "String"
o
typeof Date(2011,01,01)
"stringa"
2. Numeri
typeof 42
"numero"
3. Bool
typeof true
(valori validi true
e false
)
"Booleano"
4. Oggetto
typeof {}
o
typeof []
o
typeof null
o
typeof /aaa/
o
typeof Error()
"oggetto"
5. Funzione
typeof function(){}
"funzione"
6. Non definito
var var1; typeof var1
"non definito"
Ottenere il tipo di oggetto in base al nome del costruttore
Quando uno con typeof
operatore si ottiene object
tipo cade in una categoria un po 'sprecata ...
In pratica potrebbe essere necessario restringerlo a quale tipo di "oggetto" sia effettivamente e un modo per farlo è usare il nome del costruttore dell'oggetto per ottenere quale sapore di oggetto sia effettivamente: Object.prototype.toString.call(yourObject)
1. Stringa
Object.prototype.toString.call("String")
"[oggetto String]"
2. Numero
Object.prototype.toString.call(42)
"[numero oggetto]"
3. Bool
Object.prototype.toString.call(true)
"[oggetto Booleano]"
4. Oggetto
Object.prototype.toString.call(Object())
o
Object.prototype.toString.call({})
"[oggetto Oggetto]"
5. Funzione
Object.prototype.toString.call(function(){})
"[Funzione oggetto]"
6. Data
Object.prototype.toString.call(new Date(2015,10,21))
"[oggetto Data]"
7. Regex
Object.prototype.toString.call(new RegExp())
o
Object.prototype.toString.call(/foo/);
"[oggetto RegExp]"
8. Matrice
Object.prototype.toString.call([]);
"[oggetto Array]"
9. Null
Object.prototype.toString.call(null);
"[oggetto Null]"
10. Non definito
Object.prototype.toString.call(undefined);
"[oggetto non definito]"
11. Errore
Object.prototype.toString.call(Error());
"[oggetto errore]"
Trovare la classe di un oggetto
Per scoprire se un oggetto è stato costruito da un determinato costruttore o se ne eredita uno, è possibile utilizzare il comando instanceof
:
//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
Nota che i valori primitivi non sono considerati istanze di alcuna classe:
console.log(2 instanceof Number) //false
console.log('abc' instanceof String) //false
console.log(true instanceof Boolean) //false
console.log(Symbol() instanceof Symbol) //false
Ogni valore in JavaScript oltre a null
e undefined
ha anche una proprietà del constructor
memorizza la funzione che è stata utilizzata per costruirlo. Funziona anche con i primitivi.
//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