JavaScript是否有类似于php list命令的语言结构?

JavaScript是否有类似于php list命令的语言结构?,javascript,php,node.js,symbol-table,language-construct,Javascript,Php,Node.js,Symbol Table,Language Construct,JavaScript是否有语言结构或类似于php list命令的东西 此命令将数组的值分配给单个语句中的变量。例如,给定数组: $info = array('Coffee', 'brown', 'caffeine'); list命令将每个数组元素值分配给命名变量: list($drink, $color, $power) = $info; 以便: echo "$drink is $color and $power makes it special."; // results in:

JavaScript是否有语言结构或类似于php list命令的东西

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

$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是否有一些等价物,其中每个变量不必单独分配

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


我尝试了这个五年前的问题的解决方案,但都不起作用。数组原型更改无法在my node.js环境中分配变量,左手数组分配是Chrome中的一个参考错误。有人在谈论一种实验性的新技术,但这个话题已经有好几年的历史了。我想知道是否有比链接问题中列出的更好的解决方案

有一个由编写的实验函数,尝试将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;
}
函数列表(){
// http://kevin.vanzonneveld.net
//+原件:Brett Zamir(http://brett-zamir.me)
//%注1:仅适用于全局环境,并(根据需要)偏离
//%note 1:PHP版本,添加数组(在PHP中是一个右值
//%note 1:作为最后一个参数与list()左值分开
//*示例1:var饮料、颜色、功率;
//*示例1:列表(‘饮料’、‘颜色’、‘力量’、[‘咖啡’、‘棕色’、‘咖啡因’);
//*示例1:drink+'是'+color+',而'+power+'使其特别。\n';
//*返回1:'咖啡是棕色的,咖啡因使它特别。\n'
var i=0,arr=[];
arr=参数[arguments.length-1];
如果(arr&&typeof-arr=='object'&&arr.change\u key\u case){//Duck-type检查我们自己的数组()-创建的PHPJS\u数组
返回arr.list.apply(arr,Array.prototype.slice.call(arguments,0,-1));
}
if(arr&&typeof arr==='object'&&arr.length&&!arr.propertyIsEnumerable('length')){
对于(i=0;i
我刚刚编写了一个简单的函数,它可以工作。只是和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);
       }
   }
}
希望这就是您想要的

这在ECMAScript 6中称为“解构赋值”。有一些例子:

var a, b;
[a, b] = [1, 2]
{a, b} = {a:1, b:2}
Node.js至少从版本8开始就支持它,在某些浏览器中也支持它,如本文所示。如果您使用类似的方式将代码传输到ECMAScript 5,您仍然可以使用它。

我认为,对于没有嵌套数组的情况,可以大大简化Accept by

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];它的可读性更强,占用的内存更少。

当然可以编写函数来实现这一点,但是为什么不跳过中间步骤,直接创建一个具有命名属性的对象呢?我已经有一段时间没有真正使用PHP了,但是我想不起来有过这个场景的用例;我将立即重新打开该问题,但请您的问题添加该信息(“我尝试了此问题[链接]中的答案,它们不起作用,因为…”),以防止其他人在重新打开您的问题后再次关闭。祝你好运@戴维托马斯:你很幸运,我看完了评论,我几乎又一次敲出了这个问题:-)解构仍然是最先进的,所以这个问题需要添加很多新的东西。也许在另一个问题上悬赏会更合适。我不太愿意把它作为一个答案(因为我不是node.js方面的专家),但node似乎还没有解构:我认为node(v8)将在不久的将来实现它,因为它在ES6中。在那之前,您只需要手动分配(或交叉编译器)。
var info = [ "Coffee", "brown", "caffeine" ];

(function(drink, color, power) {
    console.log(drink + " is " + color + " and " + power + " makes it special.");
}.apply(this, info));