言われてみればそうだねと思う人も多いと思いますが、JavaScriptではオブジェクトのプロパティ名に予約キーワードを使えます。
動く
const obj = {};
obj.if = 1;
console.log(obj.if); // 1
他の言語だと、例えばPythonだと使えません。
動かない
class A:
pass
obj = A()
obj.if = 1 # SyntaxError: invalid syntax
他にも使えない言語の方が多い気がします。
ただしJavaScriptでも変数や関数の宣言時の識別子としては使えません。
動かない
const if = 1; // SyntaxError: Unexpected token 'if'
function for() {
return 2;
} // SyntaxError: Unexpected token 'for'
当然オブジェクトのプロパティにしてしまえば使えます。
動く
const if_ = 1;
function for_() {
return 2;
}
const obj = { if: if_, for: for_ };
console.log(obj.if, obj.for()); // 1 2
さらにいうとclass構文のメンバー定義はローカル変数・ローカル関数宣言っぽいですがあくまでオブジェクトのプロパティなのでキーワードが使えます。
動く
class A {
if = 1;
for() {
return 2;
}
}
const obj = A();
console.log(obj.if, obj.for()); // 1 2
雑記
JavaScriptはオブジェクトを辞書型のように扱うという特徴があります。
オブジェクトを辞書型のように扱っている例
const obj = { prop: 1 }; // 辞書っぽいオブジェクト作成
obj['prop'] === obj.prop; // []を使った辞書っぽいプロパティアクセス
この特徴はあまり注目されていないような気がしますが、私は非常に重要な特徴だと思ってます。JavaScriptの好きなところ3選には絶対入りますね。
この特徴が現れているのが今回のネタでもあります。