Проверяем наличие свойства в JS объектах

JavaScript ругают за сильную динамичность и отсутствие встроенных пространств имен, компоновку функций в глобальную область видимости и т.д. С другой стороны именно это язык даёт программисту возможность компоновать код по-собственному. Не так как у всех. За это я и люблю JS.
Одной из повседневной задачей JS-программистов является проверка на существование свойств. В качестве примера сделаем проверку на возможность использовании технологии WebSocket хранящейся в глобальном объекте бразера - window.
JS позволяет делать это по-разному:

1. Проверка с использованием оператора "in" возвращает true если свойство существует в объекте
("WebSocket" in window)

Мой однозначный фаворит. Минусы имеются, но мимичность, лаконичность и простота зашкаливает.

2. Оператор typeof возвращает строковое представление операнда
(typeof WebSocket !== "undefined")

Проверка на тип чуть-ли не одна из самых важных языковых конструкций JS. И для меня - одна из самых спорных и неуклюжих. Результат оператора нужно явно сравнить со строкой. И именно здесь возникают некоторые сложности понимания.
В JavaScript есть два вида равнозначности. Это строгое равенство и идентичность (где интерпретатор сам приведет значение к необходимому типу).
Картину усугубляет монстр носящий гордое имя DOM. Он очень сильно расширяет возможности скрипта.
В JS, в отличие от того же C# все намного сложнее, здесь делать проверку нужно не только на null-пустой объекта.

Примеры:
jQuery селектинг на несуществующий элемент:
$("#trap") => []
Здесь мы получили пустой массив. И логично в дальнейшем проверять на наличие хотя бы одного элемента.

В Vanilla JS (хе-хе), результат будет другим:
document.getElementById('trap') => null
Это пустой результат. Применяя к нему функцию length получим TypeError.

Вполне возможно что некоторые фреймворки могут выдать результат селектинга как undefined.

3. Метод hasOwnProperty возвращает булево значение определяя наличие свойства в объекте
(window.hasOwnProperty('WebSocket'))

В отличие от оператора in, этот метод не проверяет объекты по цепочке прототипов.

4. Проверка на наличие существование индекса
(window['WebSocket'] != void 0)

Доступ по индексу возможно самый быстрый из всех представленных. Но он неизящен, груб и просто неудобен.