2017-02-13 48 views
-1

我有这样的代码:为什么一个数组受到我对另一个数组的更改的影响?

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循环?在我将其分成不同的角色后,我根本不会改变它,是吗?

+6

'evilstr = str'不会创建'str'的​​新副本。 –

+0

是的,它的确如此。基元总是作为副本存储。 – shadymoses

+1

但str = str.split .... –

回答

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指向该阵列,您所作的任何更改evilStrstr做出很好。

+0

Thnaks,所以我可以创建一个Object来复制另一个的属性,但是从那时起没有以任何方式链接到该对象? – stkro

+0

是的,这可以通过多种方式完成。例如,你可以使用'''.slice()'''获得一个数组的副本,比如'''someArray.slice()'''。你可以使用'''Object.assign'''来合并对象,如果你使第一个对象成为一个空文本,你将得到一个全新的对象,例如Object.assign({},someObj,someOtherObject) ''' – shadymoses

相关问题