Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Правильная проверка на существование стандартного объекта (https://javascript.ru/forum/misc/32121-pravilnaya-proverka-na-sushhestvovanie-standartnogo-obekta.html)

mrWong 04.10.2012 10:23

Правильная проверка на существование стандартного объекта
 
Возник вопрос, как правильно проверять на существование стандартного объекта в браузере.
if(window.console) console.log('Я живой!');
if (typeof console != "undefined") console.log('Я живой!');
if('console' in window) console.log('Я живой!');
if(window.hasOwnProperty('console')) console.log('Я живой!');

Еще есть вариант, оборачивать в try...catch.

Кто чем пользуется?

Hoshinokoe 04.10.2012 23:02

Мне нравится более простой вариант:
if(window.console && console.log) console.log('test');

Maxmaxmахimus 05.10.2012 10:47

2 строчка че за херня?

а вообще Hoshinokoe правильный метод показал. потому что так obj.key мы делаем обращение к обьекту и спрашиваем у него key и он сам решает что ответить. А остальными способами мы не спрашивая обьект проверяем его внутреннее состояние, что иногда противоречит сути обьектов (инкапсуляции) КЭП. Иными словами получать знчаение которое дежит по ключу надо именно через аксессоры. а потом уже првоерять удовлетворяет тебя это значение или нет.

Но я написал которая определяет можно ли достучаться до конца цепочки и получить значение отличное от (неопределенного) undefined , функция возвращает true или false.


function has( context, patch ) {
	var keys = patch.split( '.' );

	for ( var i = 0; i < keys.length; i++ ) {
		try {
			var value = context[keys[i]];
		} catch ( e ) {
			return false
		}

		if ( value !== undefined )context = value;
		else return false;
	}

	return true;
}


а вот монада get которая возвращает то что на конце цепочки, если не может до туда достучаться возвращает undefined

function get( context, patch ) {
	var keys = patch.split( '.' );

	for ( var i = 0; i < keys.length; i++ ) {
		try {
			var value = context[keys[i]];
		} catch ( e ) {
			return
		}

		if ( value !== undefined )context = value;
		else return;
	}

	return context;
}


get
var obj = {a:{b:{c:{d:11}}}};

var value = get( obj, 'a.b.c.d' );
alert( value ); // 11


Часовой пояс GMT +3, время: 00:55.