Javascript:在数组中设置一个值会将所有其他值设置为该值
Javascript: Setting one value in an array sets all others to that value
当我尝试用javascript在数组中设置值时,所有其他"相邻"值也会发生变化。
var screenData = [];
function init() {
var properties = { "property": "value" }
for( i = 0; i < 35; i++ ) {
var row = [];
for( j = 0; j < 19; j++ ) {
row.push(properties);
}
screenData.push(row);
}
}
init();
screenData[0][0].property = "othervalue";
alert(screenData[0][1].property);
警报将返回othervalue
,尽管它应该是value
:(
是我刚刚监督了什么,还是这是一个bug?
如有任何帮助,我们将不胜感激:3
这是因为您引用了同一个对象(properties
),因此每次修改property
时,它都会到处更新。
function init() {
for( i = 0; i < 35; i++ ) {
var row = [];
for( j = 0; j < 19; j++ ) {
row.push({ property: 'value' });
}
screenData.push(row);
}
}
这是因为在每次迭代中都要推送相同的对象,所以应该克隆该对象,然后push
克隆的对象。当前,数组的所有元素都指向同一个对象。
这不是一个bug。您正在将属性对象的引用推送到数组中。这意味着您的数组包含对同一对象的多个引用。可以通过重置for循环中的属性变量来解决此问题。
function init() {
for( i = 0; i < 35; i++ ) {
var row = [];
for( j = 0; j < 19; j++ ) {
var properties = { "property": "value" }
row.push(properties);
}
screenData.push(row);
}
}
我认为,相反,这是:
for( j = 0; j < 19; j++ ) {
row.push(properties);
}
screenData.push(row);
可能是:
for( j = 0; j < 19; j++ ) {
row.push(_clone(properties));
}
screenData.push(row);
其中_.clone(object)是Underscore库函数:Underscore_clone引用
请注意,正如您在这里所读到的,嵌套对象(在这种情况下不是,因为这是字符串)被引用而不是复制。
相关文章:
- 对象获胜'如果qml中的其他地方定义了数字动画属性,则t设置动画
- 无法在其他调用上设置jQuery对话框选项
- 如何使用CSS设置所选选项的样式,而不设置所有其他选项的样式
- 为数组元素的属性赋值将设置所有其他类似元素的属性
- 设置操作系统特定的键绑定 - Mac 上的 cmd 并在其他所有内容上按 Ctrl
- 如何停止一个函数并将其他函数设置为在 html5 的 javascript 中加载时运行
- 在页面加载时创建/设置活动的默认链接,但在单击其他链接时删除活动链接
- 这个关键字位于$.ajax()中,用于调用其他函数来设置url
- 根据其他属性返回的值设置属性
- 如何设置观察程序将文件复制到同一文件夹中的其他文件
- Angular Highcharts ng如何将其他数据系列设置为工具提示
- jQuery平滑滚动到相同页面和其他页面上的ID:如何设置偏移量
- 将列表项设置为负顶部的动画会使其他列表项下降
- 如何在jquery中使用其他下拉菜单来设置下拉菜单的文本和值
- 根据其他输入设置最大值
- 在环铆钉 js 中设置其他属性
- HTML5 -webkit-transition如果我在Chrome上使用javascript设置其他内容之前设置正确,
- 设置其他输入字段值的Sql查询结果(动态输入字段)
- 在“角度”中,在所选选项上设置其他选项的默认值
- 在Object Literal表示法中设置其他属性时如何获取属性