我正在创建一个代码,我需要使用全局范围内的一些变量,当我创建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);
}
有没有办法使用全局数组的值,但没有更改它?
答案 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)
您需要将数组克隆到局部变量中。您可以使用slice
或concat
来执行此操作。
要将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];
}
}
}