Szukaj…
typ
typeof
to „oficjalna” funkcja używana do uzyskania type
w javascript, jednak w niektórych przypadkach może przynieść nieoczekiwane rezultaty ...
1. Struny
typeof "String"
lub
typeof Date(2011,01,01)
"strunowy"
2. Liczby
typeof 42
"numer"
3. Bool
typeof true
(prawidłowe wartości true
i false
)
„boolean”
4. Obiekt
typeof {}
lub
typeof []
lub
typeof null
lub
typeof /aaa/
lub
typeof Error()
"obiekt"
5. Funkcja
typeof function(){}
"funkcjonować"
6. Niezdefiniowany
var var1; typeof var1
"nieokreślony"
Pobieranie typu obiektu według nazwy konstruktora
Kiedy jeden z operatorem typeof
dostaje object
typu, to należy do kategorii odpadów ...
W praktyce może być konieczne zawężenie go do tego, czym faktycznie jest „obiekt”, a jednym ze sposobów jest użycie nazwy konstruktora obiektu, aby uzyskać smak tego obiektu: Object.prototype.toString.call(yourObject)
1. Ciąg
Object.prototype.toString.call("String")
„[ciąg obiektowy]”
2. Liczba
Object.prototype.toString.call(42)
„[numer obiektu]”
3. Bool
Object.prototype.toString.call(true)
„[obiekt Boolean]”
4. Obiekt
Object.prototype.toString.call(Object())
lub
Object.prototype.toString.call({})
„[Object Object]”
5. Funkcja
Object.prototype.toString.call(function(){})
„[funkcja obiektu]”
6. Data
Object.prototype.toString.call(new Date(2015,10,21))
„[data obiektu]”
7. Regex
Object.prototype.toString.call(new RegExp())
lub
Object.prototype.toString.call(/foo/);
„[obiekt RegExp]”
8. Tablica
Object.prototype.toString.call([]);
„[obiekt Array]”
9. Brak
Object.prototype.toString.call(null);
„[obiekt Null]”
10. Niezdefiniowane
Object.prototype.toString.call(undefined);
„[obiekt niezdefiniowany]”
11. Błąd
Object.prototype.toString.call(Error());
„[błąd obiektu]”
Znajdowanie klasy obiektu
Aby sprawdzić, czy obiekt został skonstruowany przez określonego konstruktora, czy dziedziczącego po nim, możesz użyć komendy 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
Zauważ, że wartości pierwotne nie są uważane za wystąpienia żadnej klasy:
console.log(2 instanceof Number) //false
console.log('abc' instanceof String) //false
console.log(true instanceof Boolean) //false
console.log(Symbol() instanceof Symbol) //false
Każda wartość w JavaScript oprócz null
i undefined
ma również właściwość constructor
przechowującą funkcję użytą do jej skonstruowania. Działa to nawet z prymitywami.
//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