如何减少范围以防止变量被修改

时间:2015-06-24 17:55:22

标签: javascript arrays function

我有以下变量:

var a = [30,6,26,49,3,9,28];

以下两个功能:

function init(data) {
  var modifiedData = data.reverse().slice(1, data.length).reverse();
  return modifiedData;
}

// Output should be:
// Init: 30,6,26,49,3,9,28
// [30, 6, 26, 49, 3, 9]

function last(data) {
  var modifiedData = data.reverse().slice(0, 1);
  return modifiedData;
}

// Output should be:
// Last: 30,6,26,49,3,9,28
// [28]

如果我按照这样的方式调用每个函数:

init(a);
last(a);

我从第二个函数得到以下输出:

Last: 28,9,3,49,26,6,30
[30]

因为第一个函数显然是在数据上应用了 reverse(),而第二个函数似乎从第一个函数继承了 reverse()

如何使用相同的变量作为参考来连续使用这两个函数?

3 个答案:

答案 0 :(得分:2)

Array.prototype.reverse反转实际数组(在使用.slice()克隆之前)。忘掉反转,你可以直接用array.slice做到这一点:

var a = [30,6,26,49,3,9,28];

function init(data) {
  console.log("Init: " + data);
  var modifiedData = data.slice(0, -1);
  console.log(modifiedData);
  return modifiedData;
}

// Output should be:
// Init: 30,6,26,49,3,9,28
// [30, 6, 26, 49, 3, 9]

function last(data) {
  console.log("Last: " + data);
  var modifiedData = data.slice(-1);
  console.log(modifiedData);
  return modifiedData;
}

// Output should be:
// Last: 30,6,26,49,3,9,28
// [28]

init(a);
last(a);

运行时,请查看浏览器控制台以查看结果。

-1data.length - 1相同。

答案 1 :(得分:1)

插入第一行功能:

data = data.slice(0); // make copy

答案 2 :(得分:1)

尝试在切片后使用反向Slice克隆数组。



var a = [30,6,26,49,3,9,28];

function init(data) {
  document.write("Init: " + data);
  var modifiedData = data.slice(0, data.length - 1);
  document.writeln(" " + modifiedData);
  return modifiedData;
}

// Output should be:
// Init: 30,6,26,49,3,9,28
// [30, 6, 26, 49, 3, 9]

function last(data) {
  document.writeln("Last: " + data);
  var modifiedData = data.slice(data.length - 1, data.length);
  document.writeln(" " + modifiedData);
  return modifiedData;
}

// Output should be:
// Last: 30,6,26,49,3,9,28
// [28]

init(a);
last(a);