0

JavaScript には、php list コマンドに似た言語構造または何かがありますか? http://php.net/manual/en/function.list.php

このコマンドは、1 つのステートメントで配列の値を変数に割り当てます。たとえば、次の配列があるとします。

$info = array('Coffee', 'brown', 'caffeine');

list コマンドは、各配列要素の値を名前付き変数に割り当てます。

list($drink, $color, $power) = $info;

そのような:

   echo "$drink is $color and $power makes it special."; // results in:

   Coffee is brown and caffeine makes it special.

したがって、これは 1 つのステートメントで多くの変数に値を割り当てる簡単な方法です。

JavaScript には、各変数を個別に割り当てる必要がない同等のものがありますか?

オブジェクトのプロパティまたは配列の要素を使用してこれを行う方法はありますか? そうでない場合、それを行う関数を作成できますか? これを行う唯一の方法が関数経由である場合、関数は変数が定義されているスコープにアクセスする必要があります。

この 5 年前の質問: PHP の list()に相当する Javascript の解決策を試しましたが、うまくいきません。Array プロトタイプの変更は、私の node.js 環境では変数の割り当てに失敗し、左側の配列割り当ては Chrome での参照エラーです。実験的な新しい技術についての話がありますが、話は数年前です。リンクされた質問に記載されている解決策よりも優れた解決策があるかどうかを知りたいです。

4

4 に答える 4

3

これは、ECMAScript 6 では「分割代入」と呼ばれます。Mozilla Developer Networkにはいくつかの例があります。

var a, b;
[a, b] = [1, 2]
{a, b} = {a:1, b:2}

このECMAScript 互換性テーブルで確認できるように、少なくともバージョン 8 以降の Node.js でサポートされており、一部のブラウザーでもサポートされています。コードをBabelなどで ECMAScript 5 にトランスパイルすれば、引き続き使用できます。

于 2016-03-15T18:27:21.817 に答える
1

php.jsによって書かれた実験的な関数があり、php のリスト関数を js に適合させようとします。おそらくこれに基づいて構築できます。

function list() {
  // http://kevin.vanzonneveld.net
  // +   original by: Brett Zamir (http://brett-zamir.me)
  // %        note 1: Only works in global context and deviates (by necessity) from
  // %        note 1: PHP version by adding the array (which in PHP is an rvalue
  // %        note 1: separate from the list() lvalue) as the last argument
  // *     example 1: var drink, color, power;
  // *     example 1: list('drink', 'color', 'power', ['coffee', 'brown', 'caffeine']);
  // *     example 1: drink +' is '+color+' and '+power+' makes it special.\n';
  // *     returns 1: 'coffee is brown and caffeine makes it special.\n'

  var i = 0, arr = [];

  arr = arguments[arguments.length - 1];

  if (arr && typeof arr === 'object' && arr.change_key_case) { // Duck-type check for our own array()-created PHPJS_Array
    return arr.list.apply(arr, Array.prototype.slice.call(arguments, 0, -1));
  }
  if (arr && typeof arr === 'object' && arr.length && !arr.propertyIsEnumerable('length')) {
    for (i = 0; i < arr.length; i++) {
      this.window[arguments[i]] = arr[i];
    }
  }
  else {
    for (i in arr) {
      if (i.length === parseInt(i).toString().length && parseInt(i) < arguments.length - 1) {
        this.window[arguments[i]] = arr[i];
      }
    }
  }

  return arr;
}
于 2015-02-20T00:34:45.427 に答える