Непонимание логических операторов в конкретной c ситуации - PullRequest
0 голосов
/ 17 февраля 2020

Я искал код другого человека и нашел эту специфическую c часть, где я не понимаю, для чего используются операторы logi c. (Имейте в виду, что я все еще начинаю с JavaScript, но также провел столько исследований, сколько мог, прежде чем обратиться за вашей помощью.)

const createStream = (options) => {
  const stream = new PassThrough({
    highWaterMark: options && options.highWaterMark || null,
  });
  stream.destroy = () => { stream._isDestroyed = true; };
  return stream;
}; 

Так что, насколько я понимаю, это Функция createStream (options), в основном, и она создает переменную с именем stream, которая является объектом stream.PassThrough.

Теперь, часть, которая меня беспокоит, это часть highWaterMark: options && options.highWaterMark || null,. Я просто не понимаю ничего из этого. Я знаю, как использовать логические операторы, например, в операторах if (), но это просто не имеет смысла для меня, и я не мог найти много онлайн, чтобы объяснить мне это.

Ценю любую помощь, которую я можно получить.

1 Ответ

0 голосов
/ 17 февраля 2020

Оба && и || имеют одинаковый приоритет оператора и работают слева направо. Таким образом,

highWaterMark: options && options.highWaterMark || null,

эквивалентно

highWaterMark: (options && options.highWaterMark) || null,

Кроме того, имейте в виду, что && разрешается в левую сторону, если левая сторона ложная, в противном случае - в правую сторону , Поэтому, если options равно undefined, (options && options.highWaterMark) разрешается до undefined.

. Здесь необходим &&, потому что, если параметр options не существует (например, undefined или null), простое выполнение

highWaterMark: options.highWaterMark || null,

вызовет ошибку, потому что вы не можете получить доступ к свойствам undefined или null.

Затем для части || : он разрешится в левую сторону, если левая сторона правдива, иначе он перейдет в правую сторону. Таким образом, есть два возможных пути:

// options starts out undefined
  highWaterMark: options && options.highWaterMark || null,
// equivalent to
  highWaterMark: (options && options.highWaterMark) || null,
  highWaterMark: (undefined && options.highWaterMark) || null,
  highWaterMark: undefined || null,
  highWaterMark: null,

Или:

// options starts out as an object
  highWaterMark: options && options.highWaterMark || null,
// equivalent to
  highWaterMark: (options && options.highWaterMark) || null,
  highWaterMark: (options.highWaterMark) || null,
  highWaterMark: options.highWaterMark,

Итак, что код делает, это

  • проверяет, чтобы увидеть если переменная options является истинной

  • Если это так, то ей присваивается свойство highWaterMark options свойству highWaterMark объекта

  • В противном случае он присваивает null этому свойству

Это эквивалентно следующему:

let highWaterMark;
if (options) {
  highWaterMark = options.highWaterMark;
} else {
  highWaterMark = null;
}
const stream = new PassThrough({ highWaterMark });

Это позволяет абонентам createStream быть либо типа:

createStream();

или

createStream({ highWaterMark: 'foo' });
...