2016-05-20 1 views
1

私は最近、いくつかのJavaScriptの動作を学んでいて、配列に接続されていると思われるパフォーマンスの問題ではないことに少し気づいています。 配列が参照渡しされたかどうかをテストするためだけの短いテスト関数を書きました。 彼らはそうです。私の唯一の憂慮は:JSでの配列の受け渡しはどのように機能しますか?

どのように正確に渡されますか?

javascriptにはポインタがありません。

はここでテスト機能です:

function arr_test(arr) { 
    for (var i = 0; i < arr.length; i++) { 
     arr[i] = 50; 
    } 
} 

function num_test(num) { 
    num = 50; 
} 

var array = [10, 9, 8, 7, 6, 5, 4, 3, 2, 1]; 
arr_test(array); 
console.log(array); 

var num = 10; 
num_test(num); 
console.log(num); 

出力は以下のように期待されている:

Array [ 50, 50, 50, 50, 50, 50, 50, 50, 50, 50 ] 
10 
+0

'num'を50に出力しないのでしょうか。 –

+0

[Javascriptは参照渡しですか?](http://stackoverflow.com/questions/13104494/does-javascript-pass-by-reference) –

+0

ONCEのJavaScriptはJavaのように動作します!ポインターは表示されていませんが、その使用方法ははっきりとわかります。 – 4castle

答えて

1

JavaScriptは値per references(文字列や数字などのプリミティブ値を除く)を渡します。 JSにはポインタがありますが(実際にはプリミティブ以外のほとんどすべてが参照です)、それらは隠されて自動的に管理されます(たとえばJavaやPythonなど)。

アレイはコピーされません。関数arr_testの中に入るものは、関数の外にあるものと同じです。その結果、値を変更すると、関数の外に反映されます。

ただし、num_test関数では、パラメータとして取得している数値の値は更新されません。あなたがしているのは、関数内のnum変数をメモリ内の別の数に割り当てることです。関数外の変数numは変更されません。 これは実際にはnumが参照または変数として渡されるという事実とは無関係です。もしarr[i]arr_testに更新するのではなく、arr = [50, 50](つまり、指定されたパラメータを更新するのではなく、指定されたパラメータに割り当てる)しただけでは、関数外のarrayの値も更新されません。

+0

文字列は、オブジェクトまたはプリミティブのいずれかになります。 Javascriptはプリミティブを必要に応じてオブジェクトに変換し、オブジェクトのメソッドをプリミティブ文字列で使用できるようにします。 [ここ](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)を参照してください。 –

+0

したがって、すべての非プリミティブ変数は参照渡しされます。偉大な、それは私のためにいくつかのものをクリアした。ありがとう – Sorbet

0

ほとんどすべては、JavaScriptがオブジェクトです。

オブジェクトは参照渡しされます。

したがって、配列(オブジェクト)を関数に渡して変更すると、それはそのままです。

関連する問題