Javascript替换++。--当作为参数与更新变量并返回变量的函数调用一起使用时

Javascript替换++。--当作为参数与更新变量并返回变量的函数调用一起使用时,javascript,variables,Javascript,Variables,在下面的示例中,j++既充当变量又充当函数 var j = 0; var arr = []; arr[j++] = "a1"; arr[j++] = "a2"; console.log(arr[0]); console.log(arr[1]); 有没有一种方法可以在不使用++的情况下编写此文件,如: function addx(i) { return i+1; } var j=0; arr[addx(j)] = "a1"; arr[addx(j)] = "a2"; 问题

在下面的示例中,j++既充当变量又充当函数

 var j = 0;
 var arr = [];
 arr[j++] = "a1";
 arr[j++] = "a2";

 console.log(arr[0]);
 console.log(arr[1]);
有没有一种方法可以在不使用++的情况下编写此文件,如:

function addx(i)
{
   return i+1;
}

var j=0;
arr[addx(j)] = "a1";
arr[addx(j)] = "a2";
问题是我只能更改括号[]之间的空格。我不允许在函数上方声明j变量并在其中更新它,因此此解决方案是不可接受的

var j=0;
function addx(i)
{
   j = i+1;
   return j-1;
}
arr[addx(j)] = "a1";
arr[addx(j)] = "a2";
在Pascal中,可以声明函数addxvar i:integer:integer;在这种情况下,参数将是变量,因此i:=i+1;函数内部也会更新调用变量。

您可以这样做:

var oldj;
var j = 0;
var arr = [];
arr[oldj = j, j = addx(j), oldj] = "a1";
arr[oldj = j, j = addx(j), oldj] = "a2";
这就利用了很少使用的逗号运算符将一系列表达式组合成一个表达式。我们保存j的旧值,用addx的结果更新j,然后使用旧值作为数组中要分配给的索引


不幸的是,Javascript没有宏,因此无法缩写那些冗长的代码。

这是引用帮助的地方

像吼叫

function addx(i)
{
   return i.val++;
}

var j={val:0};
arr[addx(j)] = "a1";
arr[addx(j)] = "a2";

可以使用push方法将后续元素添加到数组中:

arr.push("a1");
arr.push("a2");

这使得j变得不必要,也避免了数组索引中的间隙。

根据约束条件,我假设这是某种家庭作业问题?否则,它似乎是一个完全人为的约束

一种解决方案是使用闭包来维护支持增量后函数的变量状态:

function NumberWrapper() {
    var value;  // initially undefined
    return {
        assign: function(n) {
            return value = n;
        },
        postincrement: function() {
            var result = ++value;
            ...
            return result;  // to emulate post-increment semantics
        }
    };
};

var i = new NumberWrapper();
var arr = [];
arr[i.next()] = "a1";
arr[i.next()] = "a2";
NumberRapper对象保持自己的状态,它公开的唯一功能是增加自身并在一个步骤中返回该值

编辑ok,有趣的用例,嗯-可以扩展上面的包装,为其他数值操作提供干净的实现:

 return {
     postincrement: ...
     preincrement: function() { return ++value; }
     plusequals: function(n) { value += n; return value; }
     minusequals: function(n) { value -= n; return value; }
     etc...
 };

函数参数是按值传递的,它们不能修改调用方的变量。j++只是j=j+1的简写形式。+++不充当变量和函数。它只是一个函数。不,据我所知,不幸的是,在javascript中无法通过引用传递变量,除非您使用的是对象。此外,您的addx函数是错误的代码,因为它不断更改传入的全局变量。这将变得很难维护和解释。@Barmar这不是真的。j++是j的缩写,将j增加一倍,然后返回副本。@Alxandr哦,对了,我的答案对++j是正确的。它是一个调试工具,用于解析javascript代码并对其进行更改,以便在另一个页面上实时观察变量。使用=+=-=的赋值很容易替换为既记录值又设置值的函数,++通常可以替换为i=函数。。,但当它被用作数组中的参数或函数调用时,使用++作为参数对我来说似乎有风险,但人们仍然这样做,我想找到一种方法使它工作that@Ekim有趣的是,如果您碰巧有一个像上面那样封装变量状态的类,那么添加一个后增量函数就不会那么难了。唯一需要记住的是,x++运算符的计算结果是x在递增之前的值。此外,如果您在问题中实际解释了这一点,您可能会收到该问题的赞成票而不是反对票,否则,它看起来像是一个相当奇怪和人为的问题。我最初添加了它,但后来删除了它,因为它对问题本身没有影响@Ekim没问题,但任何能给出一个问题的基本原理的东西,如果没有它,看起来都是毫无意义或人为的,在这里都是有用的。它还可以产生更有用或更周到的答案。这可以根据我的需要工作,无论是在数组中还是作为函数参数,testfunc oldj=j,j=addxj,oldj,hi而不是testfunc j++,没错,你可以在任何允许表达式的地方使用它。正如您所注意到的,在函数参数中需要一组额外的括号,否则逗号将被视为参数分隔符而不是逗号运算符。谢谢,这是我不知道的一种方式。该代码是更大的调试库的一部分,更改正在调试的代码中变量的性质可能会使代码以后无法工作。对不起,我应该提一下。