Оба &&
и ||
имеют одинаковый приоритет оператора и работают слева направо. Таким образом,
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' });