2015-11-26 2 views
4

В моем коде есть переменная, которая иногда является одним из:Как проверить, является ли переменная объектом без собственных свойств, определенных разработчиком?

  • число,
  • булево,
  • строка,
  • регулярное выражение,
  • дата,
  • объект с 0 или более "собственный" Недвижимость.

Я хочу проверить, является ли эта переменная "элементарный объект". Я определяю "элементарный объект" либо как:

  • число,
  • булево,
  • строка,
  • регулярное выражение,
  • дата,

или, другими словами, объект без «собственный» свойства, определенные develo пер.

Я использовал условие Object.getOwnPropertyNames(obj).length === 0 но строки (которые, согласно приведенному выше определению, являются «элементарные объекты») имеют «собственного» свойства для каждого символа и для длины строки. Например, если я запустил Object.getOwnPropertyNames("test") в Chrome (46.0.2490.86 (64-разрядный) на Ubuntu 15.10) Консоль DevTools и Firefox 42 на Ubuntu 15.10, он печатает ["0", "1", "2", "3", "length"] (в Chrome) и [ "length", "0", "1", "2", "3" ] (в Firefox).

Итак, что является наиболее читаемым способом проверить, является ли переменная «элементарным объектом» в качестве объяснения выше? Меня не интересует производительность, а читаемость и легкость отладки.

спасибо! :-)

Update:

Я начал использовать эту функцию, хотя я надеюсь, что кто-то даст мне решение, которое совместимо с новыми типами без каких-либо изменений.

function isElementaryValue(x) { 
    return typeof x === "number" || 
     typeof x === "boolean" || 
     typeof x === "string" || 
     x instanceof RegExp || 
     x instanceof Date; 
} 
+0

Числа, булевы и строки обычно отсутствуют объекты? – Bergi

+0

Вместо этого вы можете попробовать 'Object.keys', который учитывает только перечисленные свойства – Bergi

+0

@Bergi, как в Firefox, так и в Chrome,' Object.keys («test») 'возвращает' ["0", "1", "2" , "3"] ', поэтому мне это не полезно. Чтобы быть полезным для меня, он должен возвращать пустой массив. – silviubogan

ответ

2

Вам придется написать довольно сделанную на заказ функцию для этого, потому что эти типы не имеют много общего:

function isElementary (arg) { 
    return arg === null 
    || arg === undefined 
    || (typeof arg !== 'object' && typeof arg !== 'function') 
    || arg instanceof RegExp 
    || arg instanceof Date; 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^