TL;DR: вы можете ссылаться на более ранние аргументы в аргументах по умолчанию в ES6

Допустим, у вас есть функция foo, которая принимает два аргумента, contactInfo и phoneNumber. Вы хотите иметь возможность передать номер телефона. Но если вы не передадите один, вы хотите, чтобы функция просто продолжала и использовала любой номер телефона, который есть в файле для этого человека.

Для этого вы можете использовать аргументы по умолчанию, которые ссылаются на более ранние аргументы для того же вызова функции:

Функция будет использовать необязательный аргумент, если вы его передадите, или доступный в contact_info, если вы этого не сделаете (т. е. вы оставите phone_number аргумент undefined):

Но что, если вы хотите, чтобы номер телефона этого человека не использовался? Аргументы по умолчанию игнорируются при передаче null. Это может показаться нелогичным, поскольку и undefined, и null ложны. Однако различие между null и undefined весьма полезно для этого случая:

Примечание. Аргументы имеют ту же область действия и this контекст, что и остальная часть вызова функции. Следовательно, было бы совершенно правильно написать такую ​​функцию, как:

Это оказывается особенно полезным для построения рекурсивных функций, где аргументы, передаваемые функции при первом и/или последнем вызове, значительно отличаются от аргументов, передаваемых промежуточным вызовам.

Например, вот два класса, Node и Tree. Удобно, что Node использует null для пометки «нет дочерних элементов» на конечных листах. Таким образом, экземпляры Tree могут использовать аргументы по умолчанию для всех трех методов обхода: