Javascript 参数传递:输入和输出

Javascript 参数传递:输入和输出,javascript,Javascript,考虑: 基本数据类型在JavaScript中按值传递。这意味着 将变量传递给 函数,因此该函数的任何局部操作都会离开 未触及原始变量 函数小提琴(arg1){ arg1=“摆弄”; console.log(“在函数fiddle str=“+arg1+””); } var str=“原始值”; log(“函数调用前str=“+str+””; 小提琴(str); log(“函数调用str=“+str+””)之后; 简单 组合类型,如数组和对象(如果使用),将传递它们 通过引用而不是价值 考虑以下

考虑:

基本数据类型在JavaScript中按值传递。这意味着 将变量传递给 函数,因此该函数的任何局部操作都会离开 未触及原始变量

函数小提琴(arg1){
arg1=“摆弄”;
console.log(“在函数fiddle str=“+arg1+”
”); } var str=“原始值”; log(“函数调用前str=“+str+”
”; 小提琴(str); log(“函数调用str=“+str+”
”)之后;

简单

组合类型,如数组和对象(如果使用),将传递它们 通过引用而不是价值

考虑以下修改 在上一个fiddle()函数中:

function fiddle(arg1) {
       arg1[0] = "Fiddled with";
       console.log("In function fiddle arg1 = "+arg1+"<br>");
}
var arr = ["Original", " Original ", " Original "];
console.log("Before function call arr = "+arr+"<br>");
fiddle(arr);
console.log("After function call arr ="+arr+"<br>");
函数小提琴(arg1){
arg1[0]=“摆弄”;
console.log(“在函数fiddle arg1=“+arg1+”
”); } var arr=[“原件”、“原件”、“原件”]; console.log(“函数调用前arr=“+arr+”
”; 小提琴(arr); console.log(“函数调用后arr=“+arr+”
”;

在这里之前都很好

从这里我发现自己很困惑

function fiddle(arg1) {
      arg1 = ["Blasted!","Blasted!"];
      console.log("In function fiddle arg1 = "+arg1+"<br>");
}
var arr = ["Original", " Original ", " Original "];
console.log("Before function call arr = "+arr+"<br>");
fiddle(arr);
console.log("After function call arr ="+arr+"<br>"); // Why this hasn't changed?
函数小提琴(arg1){
arg1=[“爆炸!”,“爆炸!”];
console.log(“在函数fiddle arg1=“+arg1+”
”); } var arr=[“原件”、“原件”、“原件”]; console.log(“函数调用前arr=“+arr+”
”; 小提琴(arr); console.log(“函数调用后arr=“+arr+”
”);//为什么这一点没有改变?

有什么建议吗?可以说吗

组合类型,如数组和对象(如果使用),将传递它们 通过引用而不是价值


同样在这种情况下?

似乎很清楚,在
fiddle
内部,您正在使用您当场创建的数组覆盖对
arr
的引用。您从未通过引用接触过
arr
本身,只是引用,因此,一旦您再次外出,
arr
仍然是原始数组。

这是因为括号表示法(用于数组)或点表示法(用于对象)允许您在数组/对象中变异对象,即使“父”对象是按值传递的,当它们通过引用传递时,也会向上和向外传播函数的范围。此功能称为。简言之:

  • 一切都是通过价值传递的,但是
  • “everything”(如果存在,即数组和对象)中的对象通过引用传递
如果要在
fiddle()
函数的范围之外修改
arr
,则必须返回它,即:
returnarr1
然后分配
arr=fiddle(arg1[,arg2,…])
,如下所示:

函数小提琴(arg1){
arg1=[“爆炸!”,“爆炸!”];
$('body').append(“函数中的fiddle arg1=“+arg1+”
”); 返回arg1; } var arr=[“原件”、“原件”、“原件”]; $('body').append(“函数调用前arr=“+arr+”
”); arr=小提琴(arr); $('body').append(“函数调用后arr=“+arr+”
”);//为什么这一点没有改变?

如果执行
arg1.push(“Blasted!”,“Blasted!”),则可能存在重复的
然后对原始对象进行更改,但您正在使用
arg1=[]
在fiddle中创建一个新数组。指定名称与更改名称所引用的对象不同。前者仅更改名称绑定。后者是目标。谢谢你的回答,特里。@盲目地:我感谢你的回答。
function fiddle(arg1) {
      arg1 = ["Blasted!","Blasted!"];
      console.log("In function fiddle arg1 = "+arg1+"<br>");
}
var arr = ["Original", " Original ", " Original "];
console.log("Before function call arr = "+arr+"<br>");
fiddle(arr);
console.log("After function call arr ="+arr+"<br>"); // Why this hasn't changed?