js中的函数里:
1.如果传入的参数为基本类型(number, string, boolean)时,传入实际的值(而不是地址)
2.如果传入的参数为引用类型(object, array,map等)时,传入内存地址,此时对形参的修改才相当于对原值的修改。

例1:

  1. var a =10
  2. function test(a){ //a作为形参,不会被外部的全局a代替
  3. a = a + 10 //a是数字类型,传入时只传入值,而不传入地址
  4. }
  5. test(a)
  6. console.log(a) //输出10

解析:本例中 a作为一个全局变量被赋值为10,而在函数test中 a 则是一个形参,作为形参的a不会去寻找作为全局变量的 a ,在调用test函数时,传入的是全局变量a 的值(10),而函数并不会影响到实际的变量 a ,所以输出为10.

例2:

  1. var a =10
  2. function test(b){
  3. a = b + 10 //由于函数域中没有变量a,则会在全局范围内查找变量a
  4. }
  5. test(a)
  6. console.log(a) //输出20

解析:本例中之所以输出20,是test函数中的形参不再是 a 而是 b ,此时在调用test函数时,函数中的a会优先查找函数域中是否有变量a,如果没有则去全局变量中查找,而此时全局变量中有一个 a=10 ,则使用实际的变量a进行运算,修改的也是a实际上的值,所以a被修改为了20

例3:

  1. a = { name: 'zhangsan' }
  2. function test(a){
  3. a.name = 'lisi'
  4. }
  5. test(a)
  6. console.log(a.name) //打印lisi

解析:由于a是一个对象类型,在传入函数时传入的是内存地址,所以对新参的修改就是对原本对象的修改,故a对象的name属性被修改了。