【问题标题】:Return of the javascript function without reference [duplicate]返回没有引用的javascript函数[重复]
【发布时间】:2019-02-16 08:48:12
【问题描述】:

在下面的代码中,我预计 3 个日志的结果会相同。

但他们不是。

var m = (function () {
  var arr = [
    {a: 1, b: 2}, 
    {c: 3, d: 4}
  ];

  return {
    getArr: function () {
      return arr;
    }
  };
})();

var myArr = m.getArr();

console.log(myArr);

myArr.pop();

console.log(m.getArr());

确保数组不作为引用传递的最佳方法是什么?

使用return arr.map()?

【问题讨论】:

  • 您可以使用 return arr.slice() - 但是请注意,这只是一个浅拷贝,您仍然会遇到问题。
  • 在 Javascript 中,所有对象都有效地“通过引用传递”。 (这并不完全正确,但可以很容易地想到它。)数组也是对象,所以这就是发生这种情况的原因。请注意,原始值(字符串、数字、布尔值)总是“按值传递”。 This question 可能有助于进一步解释

标签: javascript


【解决方案1】:
var m = (function () {
  var arr = [
    {a: 1, b: 2}, 
    {c: 3, d: 4}
  ];

  return {
    getArr: function () {
      return Array.from(arr);
    }
  };
})();

确保闭包返回 arr 的副本。

【讨论】:

  • 这也返回了一个浅拷贝,所以如果数组有多层深度,使用Array.from仍然会遇到问题
【解决方案2】:

JSON.parse(JSON.stringify(arr)) 将为您提供对象或数组的深层副本。

var m = (function () {
  var arr = [
    {a: 1, b: 2}, 
    {c: 3, d: 4}
  ];

  return {
    getArr: function () {
      return JSON.parse(JSON.stringify(arr));
    }
  };
})();

var myArr = m.getArr();

console.log(myArr);

myArr.pop();

console.log(m.getArr());

【讨论】:

  • 虽然它在大多数情况下都有效,但绝对应该让使用此方法的任何人注意一些事项:1. 它仅适用于 JSON 可序列化的内容(即也就是说,您的数组和对象不能包含函数/方法,也不能包含 Infinitynullundefined)。 2. 它将date 值转换为string3. 效率很低。也就是说,如果您的数组很小(相对而言)并且仅包含基元和/或仅包含基元的对象 (string/number/boolean),则此方法将非常有效。
猜你喜欢
  • 2012-09-27
  • 2021-07-02
  • 2013-10-23
  • 2012-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-21
相关资源
最近更新 更多