Вы можете использовать typeof
, но оно возвращает вводящее в заблуждение результаты иногда. Вместо этого используйте Object.prototype.toString.call(obj)
, который использует внутреннее свойство [[Class]]
объекта. Вы даже можете сделать для него простую обертку, так что она действует подобно typeof
:
function TypeOf(obj) {
return Object.prototype.toString.call(obj).slice(8, -1).toLowerCase();
}
TypeOf("String") === "string"
TypeOf(new String("String")) === "string"
TypeOf(true) === "boolean"
TypeOf(new Boolean(true)) === "boolean"
TypeOf({}) === "object"
TypeOf(function(){}) === "function"
Не используйте obj.constructor
, потому что оно будет изменено, хотя вы могли бы иметь возможность использовать instanceof
, чтобы проверить, правильно ли это:
function CustomObject() {
}
var custom = new CustomObject();
//Check the constructor
custom.constructor === CustomObject
//Now, change the constructor property of the object
custom.constructor = RegExp
//The constructor property of the object is now incorrect
custom.constructor !== CustomObject
//Although instanceof still returns true
custom instanceof CustomObject === true