Могу ли я использовать имя_конструктора для обнаружения типов в JavaScript?

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

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

or var b = 1; b.constructor.name; //outputs Number

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

or 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({})


person orustammanapov    schedule 12.08.2011    source источник


Ответы (2)


Вы можете использовать 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
person Digital Plane    schedule 12.08.2011
comment
@gruentee [нужна цитата] У меня отлично работает в IE11 - person Kael Watts-Deuchar; 11.01.2018

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

person Ankur    schedule 12.08.2011
comment
typeof на самом деле не будет таким точным, потому что alert ( typeof new Number() ) // Object - person veidelis; 12.08.2011
comment
Согласитесь, поскольку JavaScript не является типизированным языком, вы не можете ожидать, что его typeof будет точным :) - person Ankur; 12.08.2011
comment
Нет, JavaScript — это свободно типизированный язык. - person veidelis; 12.08.2011
comment
Уверены ли вы??? typeof opertaor - лучший выбор, чтобы узнать, установлена ​​ли переменная или нет (или она существует, тоже есть некоторые проблемы), но если у меня есть что-то вроде этого: var a = function() {}; var b = new a(); typeof a; //outputs object или typeof new Array(); //outputs object. так как я могу использовать, чтобы сделать это точно? - person orustammanapov; 12.08.2011