web-dev-qa-db-ja.com

式評価のためのJavaScriptのeval()の代替

私はeval()およびnew Function() javascriptテクニックの使用を置き換えることができる代替案を探しています。私はJavaScriptを使用してソリューションビルドを開発しており、それが構築されているプラ​​ットフォーム(Salesforce)はeval()の使用をブロックするCSP(コンテンツセキュリティポリシー)やその他の安全でないものを導入すると発表しました関数。

私の解決策は、eval関数を使用して文字列式を評価し、その他の魔法のことを行うことです。私は、理想的には自分のパーサーを作成せずに、いくつかの代替手段を探しています。

前述のとおり、私はevalを使用して式を評価します。サポートされるべき表現は通常次のようなものです。

  • 文字列比較eval("'something' == 'something'") // return true
  • 計算eval("2 + 2 * 3)" // return 8
  • _&&_および_||_サポートeval("1 == 1 && 'cat' == 'dog'") // return false
  • 条件演算子、
    • 少なくとも三項eval("(1 == 2 ? 'dog' : 'cat')") // return "cat"
    • 完全な_if-else_は本当に素晴らしいでしょう:eval("if(1 == 2) { 'dog' } else if (1 == 3) { 'dog' } else { 'nothing' }") // return "nothing"
  • いくつかの基本的なMathクラスメソッド、例:eval("Math.ceil(12.313)"); // return 13

本当に素晴らしい機能

  • 変数を挿入new Function("var item = this; item.number = 10;", item); // item is variable defined outside of eval and I want to dynamically modify it within eval()
  • 関数定義の挿入eval("invert('123')") // return 321, invert() is a function defined somewhere else

私は次のものを探しています:

  • JavaScript構文に比較的近い(ただし、CSPに準拠した一部のjsライブラリで解釈できる別の言語である場合は受け入れる)
  • 他のライブラリにあまり依存していません
  • Node.jsなどなしでロードできます(スタンドアロンのjsライブラリ)
5
Maciek Simm

探しているのは、ECMAScript内から評価できる単純な式言語です(これは、ECMAScriptで記述されたインタープリターが存在することを示すもう1つの方法です)。ありがたいことに、そのような言語とインタープリターはすでに存在しています: Jexl

JexlはシンプルなECMAScript式言語であり、リストしたほとんどすべての機能を備えています。

  • 単項演算子と二項演算子、数学、論理、文字列演算、
  • 比較演算子、
  • 条件演算子、および
  • 式のグローバル変数のようにプロパティにアクセスできるコンテキストオブジェクトを渡すことができます。

最後の1つは、正確ではありません任意のECMAScript識別子へのアクセスについて尋ねていたためですが、間違いなくより安全です。明示的に渡されたものにアクセスします。reallyが必要な場合は、コンテキストオブジェクト_{ window: window }_を渡せば、式にアクセスできます。グローバルwindowオブジェクトに追加し、想像もしなかったあらゆる悪事を行うことができます。

また、リストになかった機能もいくつかあります。

  • フィルター操作を含むコレクション:_listOfPeople[.name == "John"]_は、listOfPeopleプロパティが_"John"_である人々のみを含むnameのサブ配列を返します。
  • 変換パイプライン:"A;B;C"|lower|split(";") // => ["a", "b", "c"]

これはまさにあなたが探しているもののようです。

5
Jörg W Mittag