Учитывая этот метод (машинописный текст, извините, я предполагаю, что es6 похож):
private static Foo(test: string, bar?: string): void
{
let args = arguments && arguments.length ? arguments.length : 0;
console.log(test, {
bar: bar,
type: typeof bar,
isUndefined: bar === undefined,
arguments: args,
value: (bar === undefined && args == 2) ? undefined : (bar === null && args == 2) ? null : bar ? bar : ""
});
}
Вызывается с помощью этого:
let u;
let v = undefined;
this.Foo("no parameter");
this.Foo("null", null);
this.Foo("empty", "");
this.Foo("non-empty", "non-empty");
this.Foo("undefined", undefined);
this.Foo("undefined parameter", u);
this.Foo("parameter with value of undefined", v);
Мы получаем следующие результаты:
no parameter
{bar: undefined, type: "undefined", isUndefined: true, arguments: 1, value: ""}
null
{bar: null, type: "object", isUndefined: false, arguments: 2, value: null}
empty
{bar: "", type: "string", isUndefined: false, arguments: 2, value: ""}
non-empty
{bar: "non-empty", type: "string", isUndefined: false, arguments: 2, value: "non-empty"}
undefined
{bar: undefined, type: "undefined", isUndefined: true, arguments: 2, value: undefined}
undefined parameter
{bar: undefined, type: "undefined", isUndefined: true, arguments: 2, value: undefined}
parameter with value of undefined
{bar: undefined, type: "undefined", isUndefined: true, arguments: 2, value: undefined}
Таким образом, мы видим, что мы не можем отличить переменную, которая не определена, и переменную, которая содержит значение undefined.
Посмотрев на количество аргументов, мы можем определить, отсутствует ли аргумент, а затем, если он точно (===) undefined или null.