2017-02-13 12 views
-1

私はこのコードを持っている: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の値を変更しないでください。そして、あなたが実際に `` `str``の代わりにevilstrを返す必要が

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

:ちょうどあなたが入力文字列から生成したい配列に` `` evilstr``設定。

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に作られています。

+0

Thnaksので、他のオブジェクトのプロパティをコピーするオブジェクトを作成できますか? – stkro

+0

はい、それはさまざまな方法で行うことができます。例えば、 '' 'someArray.slice()' ''のような配列のコピーを得るには、 '' '.slice()' ''を使うことができます。 '' Object.assign({}、someObj、someOtherObject)のように、最初のオブジェクトを空のリテラルにすると、まったく新しいオブジェクトが得られます。 '' '' – shadymoses

関連する問題