JavaScript(JS)函数数组相等是否作为指针?如何使用变量?

时间:2015-11-10 10:45:15

标签: javascript arrays

我正在创建一个代码,我需要使用全局范围内的一些变量,当我创建local = global时,我注意到我在本地范围内所做的更改被修改为全球范围。

这是我所谈论的一个例子

global = [];
load_global();
use_global();

function load_global() {
  for (i = 0; i < 10; i++) {
    global.push(i);
  }
}

function use_global() {
  local = [];
  local = global;
  for (i = 0; i < 5; i++) {
    global.push("x");
  }
  console.log(local);
}

JSbin Example

有没有办法使用全局数组的值,但没有更改它?

4 个答案:

答案 0 :(得分:1)

您可以尝试复制全局数组

var start = [15, 38.70250];
var end = [21.54967, 38.70250];
var total_distance = gis.calculateDistance(start, end); // meters
var percent = 10;
var distance = (percent / 100) * total_distance;
var bearing = gis.getBearing(start, end);
var new_coord = gis.createCoord(icon_coord, bearing, distance);

顺便说一下,您可能想使用local = global.slice() 关键字来使该数组成为本地数据。没有它,&#34;本地&#34;可以从函数外部访问数组

答案 1 :(得分:1)

您需要将数组克隆到局部变量中。您可以使用sliceconcat来执行此操作。

要将clone添加到javascript数组,您可以使用

Array.prototype.clone = function() {
    return this.slice(0);
};

然后

var localArray = globalArray.clone();

另请在此处Javascript fastest way to duplicate an Array - slice vs for loop

查看此问题

答案 2 :(得分:1)

除了旧学校Array#slice之外,您还可以使用专为此类场景设计的ES6方法Array.from

var local = Array.from(global)

此方法可用于类似数组的对象或任何可迭代的值,这些值不具有slice方法。你可以说Array.prototype.slice.call()。哎呀你是对的,但这不是很烦人吗?

此外,您还可以将映射函数传递给它。例如:

Array.from('asdf', c => c.toUpperCase())  // ["A", "S", "D", "F"]

与ES5风格相比,您可以看到ES6的整洁程度:

Array.prototype.slice.call('asdf').map(function(c){return c.toUpperCase()})

阅读Retrofit了解更多信息。

另一方面,该方法目前尚未得到广泛支持,您需要使用babel或polyfill。但ES6是未来,最终它将得到所有主流浏览器的全面支持。

答案 3 :(得分:1)

在Javascript中,与许多其他语言一样,您只处理对象的引用。这也意味着对象&#34;内部&#34;您的数组也可能需要复制。基于Array.slice()的使用的答案非常好,但它不会生成数组中项目的 deep copy (意味着数组中的Object元素是也被复制,因此更改本地对象的状态不会影响您的全局对象)。

一个非常简单(但可能不是非常有效)的解决方案可能是序列化和反序列化您的数组。例如:

var newObj = JSON.parse(JSON.stringify(obj));

请注意,使用JSON不允许您处理函数。 Here是使用这种技术的答案。

修改

要允许深层复制,您还可以像DMaster建议的那样迭代对象的属性,但是您应该使用一些递归方法。我在SO {<3}}中采用了这个例子。

function clone(destination, source) {
    for (var property in source) {
        if (typeof source[property] === "object" && source[property] !== null && destination[property]) { 
            clone(destination[property], source[property]);
        } else {
            destination[property] = source[property];
        }
    }
}