【问题标题】:Does JavaScript have a language construct similar to the php list command?JavaScript 是否具有类似于 php list 命令的语言结构?
【发布时间】:2015-02-19 21:43:16
【问题描述】:

JavaScript 是否有语言结构或类似于 php list 命令的东西? http://php.net/manual/en/function.list.php

此命令将在单个语句中将数组的值分配给变量。例如,给定数组:

$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.

因此,这是一种在一个语句中为多个变量赋值的简单方法。

JavaScript 是否有等效的东西,每个变量不必单独分配?

有没有办法使用对象的属性或数组的元素来做到这一点?如果没有,是否可以编写一个可以做到这一点的函数?如果这样做的唯一方法是通过函数,那么函数将需要访问定义变量的范围。

我在这个五年前的问题中尝试了解决方案:Javascript equivalent of PHP's list(),但它们不起作用。数组原型更改无法在我的 node.js 环境中分配变量,左手数组分配是 Chrome 中的引用错误。有人谈论一种实验性的新技术,但这种说法已经有好几年了。我想知道是否有比链接问题中列出的更好的解决方案。

【问题讨论】:

  • 当然可以编写一个函数来执行此操作,但为什么不跳过中间步骤,直接创建一个具有命名属性的对象呢?自从我真正使用 PHP 以来已经有一段时间了,但我不记得曾经有过这种场景的用例。
  • 很遗憾听到这个消息,克里斯;我会暂时重新打开这个问题,但请edit你的问题添加该信息(“我尝试了这个问题的答案[链接],他们没有工作,因为......”)以防止其他人关闭为再次被骗,一旦你的问题重新打开。祝你好运!
  • @DavidThomas:你很幸运,我通读了 cmets,我差点又重提了这个问题 :-) 解构仍然是最先进的,所以这个问题需要添加很多新东西.也许对另一个问题给予赏金会更合适。
  • 我不太愿意将其发布为答案(因为我不是 node.js 方面的专家),但似乎 node 还没有解构:stackoverflow.com/q/17379277/899126
  • 我认为 node (v8) 将在不久的将来实现这一点,因为它在 ES6 中。在那之前,你只能手动分配(或交叉编译器)。

标签: javascript php node.js symbol-table language-construct


【解决方案1】:

我刚刚写了一个简单的函数,它可以工作。只是不完全像 php 中的列表。在这里

function list(fn,array){
   if(fn.length && array.length){
       for(var i=0;i<array.length;i++){
            var applyArray = [];
            for(var j=0;j<array[i].length;j++){
                fn[j] = array[i][j];
                applyArray.push(fn[j]);
            }
            fn.apply(this,applyArray);
       }
   }
}

这没什么了不起的,但是如果您正在为自己寻找一些简单的用例,那就可以了。

这个怎么用?

//array array mixture for composure
var arrayMixture = [ ["coffee","sugar","milk"], ["tea","sugar","honey"] ];
//call our function
list(function(treat,addin,addin2){
   console.log("I like "+treat+" with " + addin + " and " + addin2);
},arrayMixture);
//output:
//I like coffee with sugar and milk
//I like tea with sugar and honey

希望这就是你要找的东西

【讨论】:

    【解决方案2】:

    这在 ECMAScript 6 中称为“解构赋值”。Mozilla Developer Network 有一些示例:

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

    Node.js 至少从版本 8 开始支持它,并且在某些浏览器中也支持,正如您在 ECMAScript compatibility table 中看到的那样。如果您使用 Babel 之类的代码将代码转换为 ECMAScript 5,您仍然可以使用它。

    【讨论】:

      【解决方案3】:

      php.js写了一个实验函数,试图将php的list函数适配到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;
      }
      

      【讨论】:

        【解决方案4】:

        我认为EasyBB 接受的answer 在没有嵌套数组的情况下可以大大简化。

        var info = [ "Coffee", "brown", "caffeine" ];
        
        (function(drink, color, power) {
            console.log(drink + " is " + color + " and " + power + " makes it special.");
        }.apply(this, info));
        

        现在您不必定义额外的函数来完成工作。当然,如果采用 ES6 会更好,我们可以使用数组解构。同时,我可能只会使用老式的var drink = info[0], color = info[1], power = info[2];;它更具可读性并且使用更少的内存。

        【讨论】:

          猜你喜欢
          • 2010-11-30
          • 2013-07-29
          • 1970-01-01
          • 2011-05-21
          • 1970-01-01
          • 2015-05-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多