В javascript, что лучше ‘var Obj = Obj || {}` или `if (Obj === ‘неопределенный’ || typeof Obj !== ‘объект’)`

#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 , предполагающие, что это объект, завершатся неудачей. Но я по-прежнему предпочитаю первую версию для простоты; я стараюсь создавать пространства имен таких объектов таким образом, чтобы никто не присвоил этому имени ничего неподходящего.