为什么一个数组会受到我对另一个数据的更改的影响?

时间:2017-02-13 20:36:44

标签: javascript arrays

我有这段代码:

function titleCase(str) {
  str=str.toLowerCase();
  str=str.split("");
  var evilstr=str;
  var counter = [];
  for (i=0;i<150;i++) {
  counter.push(evilstr.findIndex(function(character){    
    return character===" ";

  }));
    evilstr[i]="x";
  }
     return str;
}

titleCase("I'm a little tea pot");

它产生了这个结果:

'['x','x','x','x','x','x','x','x','x','x','x','x','x','x','x','x','x',...'

为什么str受到for循环的影响?在我把它分成不同的字符之后,我根本不会改变它,是吗?

1 个答案:

答案 0 :(得分:0)

请勿更改str的值。只需将```evilstr``设置为要从输入字符串生成的数组:

var evilstr = str.toLowerCase().split('')

然后你需要实际返回evilstr而不是```str``。

return evilStr.join('')

或者,您根本不创建evilStr

function titleCase(str) {
  str = str.toLowerCase().split(' ');
  for (var i = 0; i < str.length; i++) {
    str[i] = str[i].charAt(0).toUpperCase() + str[i].slice(1); 
  }
  return str.join(' ');
}
titleCase("I'm a little tea pot");

但要真正回答你的问题:javascript中的数组和对象总是通过引用存储,除非你专门创建一个新的。

// this creates a new array with 4 items
var arr = [1,2,3,4]
// this creates a new variable that points to the array referenced in arr
var arr2 = arr
// add a value to arr2
arr2.push(5)
// check the value of arr
console.log(arr) /// shows [1,2,3,4,5]

因此,当您将str的值更改为数组,然后将evilStr指向该数组时,您对evilStr所做的任何更改都会转到str同样。