Могу ли я использовать constructor.name для обнаружения типов в JavaScript - PullRequest
6 голосов
/ 12 августа 2011

Могу ли я использовать свойство конструктора для обнаружения типов в JavaScript?Или есть что-то, что я должен знать об этом.

Например: var a = {}; a.constructor.name; //outputs Object

или var b = 1; b.constructor.name; //outputs Number

или var d = new Date(); d.constructor.name; //outputs Date not Object

или var f = new Function(); f.constructor.name; //outputs Function not Object

только если использовать его в аргументах arguments.constructor.name; //outputs Object like first example

Я часто вижу разработчиков, использующих: Object.prototype.toString.call([]) или

Object.prototype.toString.call({})

Ответы [ 2 ]

6 голосов
/ 12 августа 2011

Вы можете использовать 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
1 голос
/ 12 августа 2011

Вы можете использовать typeof Пример: typeof("Hello")

...