✨
jsのundefinedは予約語ではないよ
tr;dr
- js の undefined は予約語ではない
- 変数名としても使えるよ
undefined
予約語(よやくご)とは、プログラミング言語やソフトウェアにおいて、すでに定められた特別な意味を持つ単語や識別子で、変数名や関数名などとして自由に使用できないものを指します。
undefined はキーワードでもリテラルでもなく、歴史的にグローバルオブジェクトのプロパティ名でした(対して null, true, false はリテラル)。
しかし 識別子としての undefined は予約語ではない ので、ローカル変数・引数でシャドーイングできます。
グローバルの globalThis.undefined は non-writable なので再代入はできません。
(どうしてこうなったかの経緯は調べたけど、複雑で追うのが面倒。。。時間ある時にスクラップにまとめようかな)
例えば null や true, false はリテラルなので変数名にできません。
(リテラル: ソースコード上に“値”そのものを書く記法)
const null = 1
const true = true
const false = false
// x is not allowed as a variable declaration name.
一方 undefined はリテラルではなく識別子として扱われます。
この識別子 undefined がグローバルオブジェクトのプロパティ globalThis.undefined を指しています。
const obj = Object.getOwnPropertyDescriptor(globalThis, 'undefined');
console.log(obj);
// => { value: undefined, writable: false, enumerable: false, configurable: false }
console.log(globalThis.undefined === undefined); // true
なので、undefined は変数名としても使えます。
function f() {
const undefined = 1; // ローカル変数名として宣言できる
console.log(undefined);
}
f(); // => 1
引数名としても使えるので、呼び出し側が値を渡せば、その値になる
function f(undefined) {
console.log(undefined);
}
f(123); // => 123
Discussion