Знать, является ли переменная нативным объектом в JavaScript - PullRequest
2 голосов
/ 12 мая 2010

есть ли способ узнать, является ли переменная, переданная в функцию, нативным объектом? Я имею в виду, у меня есть функция, которая требует только нативные объекты в качестве аргументов, для любого другого типа переменной она выдает ошибку. Итак:

func(Array); //works
func(String); //works
func(Date); //works
func(Object); //works
...
func([]); //Throwr error
func({}); //Throws error

Я хочу знать, есть ли способ отличить нативные объекты от всего остального.

Ответы [ 3 ]

3 голосов
/ 12 мая 2010

Вы должны были бы сделать === (или !==) против списка принятых значений (который не будет таким длинным, исходя из вашего вопроса), зная, что это можно обмануть, заставив думать, что что-то было это был натив (просто из другого окна).

Но в основном:

if (obj !== Array &&
    obj !== String &&
    obj !== Date &&
    /* ...and so on, there are only a few of them... */
   ) {
    throw "your error";
}

Редактировать Мой комментарий о вещах из других окон: Помните, что конструкторы из одного окна не === для конструкторов из другого окна (включая фреймы), например ::

var wnd = window.open('blank.html');
alert("wnd.Array === Array? " + (wnd.Array === Array));

alerts "wnd.Array === Array? False" , поскольку Array в wnd не совпадает с Array в текущем окне, даже если оба они построены конструкторы для массивов.

2 голосов
/ 12 мая 2010

Насколько я знаю, в настоящее время наилучшим способом получения типа чего-либо является

var theType = Object.prototype.toString.call(theObject);

Это даст вам строку, которая выглядит как "[объектный массив]".

Теперь имейте в виду, что [] является экземпляром Array, а {} является экземпляром Object.

0 голосов
/ 12 мая 2010

В JavaScript есть оператор "typeof", который может помочь.

alert (typeof arg)

Другой (немного более сложный) подход заключается в использовании

arg.prototype.constructor

это даст ссылку на функцию, которая использовалась для создания объекта

...