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
GitHubで編集を提案

Discussion