2011-08-12 12 views
5

Czy mogę użyć właściwości konstruktora do wykrywania typów w JavaScript? Czy jest coś, co powinienem o tym wiedzieć.Czy można użyć constructor.name do wykrywania typów w JavaScript

Na przykład: var a = {}; a.constructor.name; //outputs Object

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

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

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

tylko jeśli używać go na argumentach arguments.constructor.name; //outputs Object like first example

widzę dość często programistów używających: Object.prototype.toString.call([]) lub

Object.prototype.toString.call({})

Odpowiedz

5

Można użyć typeof, ale zwraca misleadingresults czasami. Zamiast tego należy użyć Object.prototype.toString.call(obj), która wykorzystuje wewnętrzną właściwość obiektu obiektu [[Class]]. Można nawet zrobić prosty wrapper dla niego, więc to działa podobnie do 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" 

Nie używaj obj.constructor bo ona zostać zmieniona, chociaż może móc korzystać instanceof aby sprawdzić, czy jest to poprawne :

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 
+0

'constructor.name' nie działa w IE. – gruentee

+0

@gruentee [potrzebne źródło] Działa dobrze dla mnie w IE11 –

1

Można użyć typeof Ex: typeof("Hello")

+0

typeof won't faktycznie tak precyzyjny, ponieważ 'alert (typeof nowy numer()) // Object' – veidelis

+0

Zgadzam się, ponieważ JavaScript nie jest językiem wpisywanych cannt można oczekiwać jego typeof być precyzyjne :) – Ankur

+1

nie , JavaScript jest luźnym językiem. – veidelis

Powiązane problemy