Javascript取代c++.——当用作函数调用的参数时,函数调用更新变量并返回它

Javascript replace ++.-- when used as a parameter with a function call that both updates the variable and returns it

本文关键字:函数调用 更新 变量 返回 c++ 取代 Javascript 参数      更新时间:2023-09-26

在下面的示例中,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中,您可以像function addx(var i:integer) : integer;一样声明函数,在这种情况下,参数将是变量,因此在函数中包含i := i+1;也将更新调用变量。

这是参考的地方。

像风箱

function addx(i)
{
   return i.val++;
}
var j={val:0};
arr[addx(j)] = "a1";
arr[addx(j)] = "a2";

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

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

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";

NumberWrapper对象保持自己的状态,它暴露的唯一功能是增加自己并返回该值(一步)。

EDIT好,有趣的用例,嗯-可以扩展上面的包装器,为其他数字操作提供一个干净的实现:

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

你可以这样做:

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没有宏,所以没有办法缩短冗长的代码。

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

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

这使得不需要j,并且还避免了数组索引中的空白。