Fork me on GitHub

演算子にもstrict modeを "use restrict";

Edit on GitHub 編集履歴を見る

JavaScriptの演算子の扱いに対するstrict modeという名目で作成されたRestrict modeというものが公開されていました。これはJavaScriptの演算子の扱いは暗黙な変換などもあり、意図通りではない場合も存在してしまっている。それに対するJavaScript(ECMAscript)のサブセットのようなものです。

JSMentorsにて作者のOlov LassusさんがRestrict Modeとはどのようなものかを説明していたので、簡単に取り出してみました。(スピリチュアル翻訳なので、意図をつかみたいからは原文を)
======

strict modeのように
"use restrict";
という文字列があるとき、JavaScriptの複雑な演算子の扱いを制限させて書きやすくするrestrict modeというサブセットを作成した事について。
多くの人が==よりも===を推奨している。事実、厳密演算子のみでプログラムは書ける。
なぜ厳密演算子のみにするか?というのは、より強固なプログラムを書くため。
同じように>, <= , >=,+, -演算子があるがこれは緩いものしかないため、これらを使用した時に型変換が起きてしまう。
ここが重要なポイントでこれらが破壊的な挙動をしてるのを検知して修正する必要がある。そこで作成したのがrestrict modeというサブセットです。
ES5 strict modeと同じように簡単にオプト(イン|アウト)できます。このツールはrestricterと呼び、JSShaperのプラグインとして作成されました。
restrict modeのルール

  1. === と !==
    これらはデフォルトでstrictだ。なのでrestrict modeでも同じ
  2. == と !=
    restrict modeでは
    undefined == null;// true
    undefined != null;// false
    以外の場合は===と!==と同じ結果を得られる
  3. + < <= >= >
    restrict modeではプリミティブなstringとnumberに対して使える。(しかしmixはできない)
  4. - * / % & | ^ ~v << >> >>> -v ++v v++ --v v--
    restrict modeではプリミティブなnumberに対して使える。
  5. +v !v && || ?: o[k]
    ほかの演算子はrestrict modeでも同一

(もっと詳しいルールや理由についてはRestrict Modeのclick for why?に書いてあります)

======

使い方

JSShaperをダウンロードして、その中にrestricter pluginが含まれているのでV8エンジンで実行するようです。

git clone git://github.com/olov/jsshaper.git
cd jsshaper
git submodule init
git submodule update
cd src
d8 run-restricter.js -- myfile.js # or js/node

対象となるJavaScriptプログラム(myfile.js)にはstrict modeと同じように、プログラム内や関数内に

"use restrict";

と書いておく必要があります。strict modeと併用できるので、

"use strict"; "use restrict";// 対応してないエンジンはただの文字リテラルと認識

という風に書いておく事もできるため、より強固なプログラムを書くためにこれを推奨しています。またTry restrict modeにてオンラインで試すこともできます。

感覚的にはJSLintをかけるつもりでrestricterにかける感じになっているみたいです。
JavaScriptでできることが多くなっているため、こうした厳格なJavaScriptをかけるようにするためのツールはとても意味があると思います。

この記事へ修正リクエストをする
JSer.info Slackに参加する