2017-01-11 11 views
0

Мне было интересно, можно ли предположить, что в JavaScript переменная всегда будет иметь свойство «конструктор», если ее значение не «null» или «undefined».Безопасно ли в Javascript предположить существование свойства «constructor» для переменных со значениями, отличными от «null» или «undefined»?

я столкнулся с ситуацией, когда я должен был проверить, если переменная определена, и что, если это массив, и если да проверить, если его длина> 0:

if(variable && variable.constructor === Array && variable.length > 0) { 
    ...loop through the array 
} 

Правильно ли я предположить, что переменная будет всегда имеет конструктор, если он не «неопределен» или «нуль»?

+1

no, Массивы из других контекстов (read: tabs/frames) НЕ будут иметь конструктор === 'window.Array'. – dandavis

+0

@ dandavis: Хорошая точка! Если есть какие-то вещи в кросс-окнах, вы не можете доверять этому ... –

+0

@ dandavis: спасибо за этот полезный совет! – codeAscetic

ответ

0

Ваше if заявление не будет бросать, потому что вы сделали это предположение, потому что все, что проходит ваш первый чек будет поддерживать вашу вторую, даже если нет constructor собственности (вы будете просто получить undefined), а на самом деле даже если это не объект (он получит временное повышение). Таким образом, в этом смысле да, вы можете с радостью сделать то, что делаете   — , если только вы не имеете дело с массивом из другого окна, и в этом случае === Array не будет работать (как dandavis pointed out), потому что в разных окнах есть разные экземпляры Array конструктор.

Обратите внимание, что это не то же самое, что и у каждого объекта, имеющего свойство constructor. Просто, если объект этого не делает, вы получите undefined, а не ошибку. (Вы можете получить объект не constructor собственности путем создания объекта, без прототипа:. var obj = Object.create(null); или с помощью объекта, чей прототип null в качестве прототипа объекта)


Однако, несколько тангенциально, я Wouldn Не используйте этот механизм, чтобы проверить, является ли что-то массив. В любой современной среде я бы использовал Array.isArray; и я бы обманул/полифорировал его в более старых средах. Это также имеет счастливый эффект работы с массивами из других окон.

+0

Благодарим вас за ваш ответ и за ваше предложение использовать 'Array.isArray'. Я приму этот ответ. – codeAscetic

0

undefined или null не имеют конструкторов и будут ошибки, если вы попытаетесь его получить. Просто попробуйте на Ctrl+Shift+I и поиграйте с ним. Хотя, я сомневаюсь, что ваше заявление может вызвать большие проблемы, и это, скорее всего, будет ошибкой при использовании в прак тике.

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

+0

* «undefined' или' null' не имеют конструкторов и будут ошибки, если вы попытаетесь их получить ». * OP управляет теми, что были ранее, в' if'. И проблема действительно заключается не в том, что у них нет конструкторов, а в том, что вы не можете пытаться извлечь из них свойства. –