TL;DR: вы можете ссылаться на более ранние аргументы в аргументах по умолчанию в ES6
Допустим, у вас есть функция foo
, которая принимает два аргумента, contactInfo
и phoneNumber
. Вы хотите иметь возможность передать номер телефона. Но если вы не передадите один, вы хотите, чтобы функция просто продолжала и использовала любой номер телефона, который есть в файле для этого человека.
Для этого вы можете использовать аргументы по умолчанию, которые ссылаются на более ранние аргументы для того же вызова функции:
Функция будет использовать необязательный аргумент, если вы его передадите, или доступный в contact_info, если вы этого не сделаете (т. е. вы оставите phone_number
аргумент undefined
):
Но что, если вы хотите, чтобы номер телефона этого человека не использовался? Аргументы по умолчанию игнорируются при передаче null
. Это может показаться нелогичным, поскольку и undefined
, и null
ложны. Однако различие между null
и undefined
весьма полезно для этого случая:
Примечание. Аргументы имеют ту же область действия и this
контекст, что и остальная часть вызова функции. Следовательно, было бы совершенно правильно написать такую функцию, как:
Это оказывается особенно полезным для построения рекурсивных функций, где аргументы, передаваемые функции при первом и/или последнем вызове, значительно отличаются от аргументов, передаваемых промежуточным вызовам.
Например, вот два класса, Node
и Tree
. Удобно, что Node
использует null
для пометки «нет дочерних элементов» на конечных листах. Таким образом, экземпляры Tree
могут использовать аргументы по умолчанию для всех трех методов обхода: