Поиск…
тип
typeof
- это «официальная» функция, которая используется для получения type
в javascript, однако в некоторых случаях это может привести к неожиданным результатам ...
1. Строки
typeof "String"
или
typeof Date(2011,01,01)
«Строка»
2. Числа
typeof 42
"число"
3. Bool
typeof true
(действительные значения true
и false
)
«Логическое»
4. Объект
typeof {}
или
typeof []
или
typeof null
или
typeof /aaa/
или
typeof Error()
«Объект»
5. Функция
typeof function(){}
«Функция»
6. Неопределенный
var var1; typeof var1
«Неопределенные»
Получение типа объекта по имени конструктора
Когда один с typeof
оператором получает object
типа, он попадает в некоторую категорию категории ...
На практике вам может понадобиться сузить его до какого-то «объекта», который есть на самом деле, и один из способов сделать это - использовать имя конструктора объекта, чтобы получить тот вкус объекта, который он на самом деле: Object.prototype.toString.call(yourObject)
1. Строка
Object.prototype.toString.call("String")
"[object String]"
2. Номер
Object.prototype.toString.call(42)
"[номер объекта]"
3. Bool
Object.prototype.toString.call(true)
"[object Boolean]"
4. Объект
Object.prototype.toString.call(Object())
или
Object.prototype.toString.call({})
"[Объект Object]"
5. Функция
Object.prototype.toString.call(function(){})
"[функция объекта]"
6. Дата
Object.prototype.toString.call(new Date(2015,10,21))
"[дата объекта]"
7. Регулярное выражение
Object.prototype.toString.call(new RegExp())
или
Object.prototype.toString.call(/foo/);
"[объект RegExp]"
8. Массив
Object.prototype.toString.call([]);
"[object Array]"
9. Null
Object.prototype.toString.call(null);
"[объект Null]"
10. Неопределенные
Object.prototype.toString.call(undefined);
"[объект Undefined]"
11. Ошибка
Object.prototype.toString.call(Error());
"[ошибка объекта]"
Поиск класса объекта
Чтобы определить, был ли объект сконструирован определенным конструктором или наследованием от него, вы можете использовать команду 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
Обратите внимание, что примитивные значения не считаются экземплярами любого класса:
console.log(2 instanceof Number) //false
console.log('abc' instanceof String) //false
console.log(true instanceof Boolean) //false
console.log(Symbol() instanceof Symbol) //false
Каждое значение в JavaScript, кроме null
и undefined
также имеет свойство constructor
сохраняющее функцию, которая была использована для его построения. Это даже работает с примитивами.
//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