#javascript
#javascript
Вопрос:
Я хочу знать, какой из этих методов лучше:
var Obj = Obj || {};
или
if (Obj === undefined || typeof Obj !== 'object') {
Obj = {};
}
Мне сказали, что 2-й метод лучше, но я не знаю почему. Пожалуйста, не могли бы вы объяснить мне, каковы плюсы и минусы каждого из них.
Большое спасибо
Комментарии:
1. Эти фрагменты кода не делают то же самое… Также я не думаю, что вы хотели написать
Obj === 'undefined'
, а скорееObj === undefined
илиtypeof Obj === 'undefined'
.2. @AlinPurcaru: Даже
Obj === undefined
иtypeof Obj === 'undefined'
не имело бы смысла, потому что второе условие все равно поймало бы его. Мне кажется, что автор второй вещи не думал о коде.3. @thejh: Да, я думал о коде, вот почему я задаю вопрос. Я уже использовал 1-й метод раньше, но кто-то сказал мне, что это плохая идея… И он сказал мне использовать вместо этого 2-й метод.
4. Ваш второй метод избыточен, потому
typeof undefined
что «не определен», что, конечно, не равно «объекту».
Ответ №1:
Второй метод просто более специфичен, поэтому для целей создания объекта (если он еще не существует) он лучше. Первый метод проверяет только, является ли объект «правдивым», то есть, если Obj
бы было число 5, он все равно вернул бы оригинал Obj
, тогда как во втором методе он Obj
должен иметь тип ‘object’, чтобы его значение было сохранено.
Практически говоря, особой разницы нет, потому что вы редко сталкиваетесь с ситуациями, подобными описанным выше; второй метод просто сообщает читателю, что вы хотите, более конкретно. Мне нравится первый метод, потому что он короче, но это зависит от того, насколько конкретно вы хотите быть.
Ответ №2:
Единственная проблема, которую я вижу с первым методом, заключается в том, что если кто-то определил Obj
ссылаться на что-то, что не является объектом, но также не является falsey — скажем, ненулевое целое число, — то Obj
будет продолжать указывать на эту вещь, и последующие вызовы Obj
, предполагающие, что это объект, завершатся неудачей. Но я по-прежнему предпочитаю первую версию для простоты; я стараюсь создавать пространства имен таких объектов таким образом, чтобы никто не присвоил этому имени ничего неподходящего.