javaScript中按值传递与按引用传递(传递参数如果是object的话,是按值传递还是按引用传递?)

红太狼 2022-10-23 08:09 260阅读 0赞

javascript传递参数如果是object的话,是按值传递还是按引用传递?

Java和Javascript中的值传递与引用传递

JavaScript函数传参原理详解——值传递还是引用传递

javaScript中按值传递与按引用传递(传递参数如果是object的话,是按值传递还是按引用传递?)

在javaScript中数据类型可以分为两类:

原始数据类型值 primitive type,比如Undefined,Null,Boolean,Number,String。

引用类型值,也就是对象类型 Object type,比如Object,Array,Function,Date等。

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>javaScript中按值传递与按引用传递</title>
  6. <script type="text/javascript">
  7. //javascript传递参数如果是object的话,是按值传递还是按引用传递?
  8. function setName(obj){
  9. obj.name = '令狐冲';
  10. }
  11. var person = new Object();
  12. setName(person);
  13. console.log(person.name);//令狐冲
  14. //再看下面的代码,有意思的来了(参考这篇文章https://www.zhihu.com/question/27114726)
  15. function setName2(obj){
  16. obj.name = '杨幂';
  17. obj = new Object();
  18. obj.name = '刘亦菲';
  19. }
  20. var person2 = new Object();
  21. setName2(person2);
  22. console.log(person2.name); //杨幂
  23. console.log('***********************');
  24. //整数类型
  25. var a = 666;
  26. console.log('a=' + a); //a=666
  27. function fn1(parameter){
  28. parameter = 888;
  29. }
  30. fn1(a);
  31. console.log('a=' + a);//a=666
  32. console.log('***********************');
  33. //浮点类型
  34. var b = 77.86;
  35. console.log('b=' + b);//b=77.86
  36. function fn2(parameter){
  37. parameter = 55.42;
  38. }
  39. fn2(b);
  40. console.log('b=' + b);//b=77.86
  41. console.log('***********************');
  42. //boolean类型
  43. var c = true;
  44. console.log('c=' + c);//c=true
  45. function fn3(parameter){
  46. parameter = false;
  47. }
  48. fn3(c);
  49. console.log('c=' + c);//c=true
  50. console.log('***********************');
  51. //数组类型
  52. var d = ['韦小宝', '阿珂', '建宁公主', '双儿', '苏荃', '曾柔', '方怡', '沐剑屏'];
  53. console.log('d=' + d);//d=韦小宝,阿珂,建宁公主,双儿,苏荃,曾柔,方怡,沐剑屏
  54. function fn4(parameter){
  55. parameter.splice(1, 0, '康熙', '鳌拜', '吴三桂');
  56. }
  57. fn4(d);
  58. console.log('d=' + d);//d=韦小宝,康熙,鳌拜,吴三桂,阿珂,建宁公主,双儿,苏荃,曾柔,方怡,沐剑屏
  59. console.log('***********************');
  60. //Date类型
  61. var myDate = new Date();
  62. console.log('myDate=' + myDate);//myDate=Tue Mar 09 2021 16:22:54 GMT+0800 (中国标准时间)
  63. function fn5(parameter){
  64. parameter.setFullYear(2088, 9, 15);
  65. }
  66. fn5(myDate);
  67. console.log('myDate=' + myDate);//myDate=Fri Oct 15 2088 16:22:54 GMT+0800 (中国标准时间)
  68. console.log('***********************');
  69. </script>
  70. </head>
  71. <body>
  72. <h2>javaScript中值传递与引用传递</h2>
  73. </body>
  74. </html>

运行结果如下:

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2N6aDUwMA_size_16_color_FFFFFF_t_70

落了字符串类型的,补上

  1. //字符串类型
  2. var homeTown = '江西省赣州市于都县';
  3. console.log('homeTown=' + homeTown);//homeTown=江西省赣州市于都县
  4. function fn6(parameter){
  5. parameter = '于都县';
  6. }
  7. fn6(homeTown);
  8. console.log('homeTown=' + homeTown);//homeTown=江西省赣州市于都县
  9. console.log('***********************');

运行结果如下:

20210309164158652.png

再补充一些其它的案例

  1. var testC = {a : 666};
  2. console.log(testC);//Object { a: 666 }
  3. function testObject(example){
  4. example = {b : 57};
  5. }
  6. testObject(testC);
  7. console.log(testC);//Object { a: 666 }
  8. console.log('***************');
  9. var testB = {h : 37};
  10. console.log(testB);//Object { h: 37 }
  11. function testObj(example) {
  12. example.aa = 89;
  13. }
  14. testObj(testB);
  15. console.log(testB);//Object { h: 37, aa: 89 }
  16. console.log('***************');
  17. var names = ['韦小宝', '阿珂', '双儿', '建宁公主', '曾柔', '方怡', '苏荃', '沐剑屏'];
  18. //Array(8) [ "韦小宝", "阿珂", "双儿", "建宁公主", "曾柔", "方怡", "苏荃", "沐剑屏" ]
  19. console.log(names);
  20. function fn1(parm){
  21. var obj1 = parm;
  22. obj1.splice(1, 0, '康熙', '鳌拜');
  23. }
  24. fn1(names);
  25. //Array(10) [ "韦小宝", "康熙", "鳌拜", "阿珂", "双儿", "建宁公主", "曾柔", "方怡", "苏荃", "沐剑屏" ]
  26. console.log(names);
  27. console.log('***************');
  28. var citys = ['于都县', '兴国县', '赣县'];
  29. console.log(citys);//Array(3) [ "于都县", "兴国县", "赣县" ]
  30. function fn2(parm){
  31. var obj1 = parm;
  32. obj1 = new Array("南昌市", "景德镇市", "赣州市");
  33. // obj1 = null;
  34. }
  35. fn2(citys);
  36. console.log(citys);//Array(3) [ "于都县", "兴国县", "赣县" ]
  37. console.log('***************');

运行结果如下:

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2N6aDUwMA_size_16_color_FFFFFF_t_70 1

其它案例

  1. var citys = ['于都县', '兴国县', '赣县'];
  2. var t = citys.slice();
  3. console.log(t);//Array(3) [ "于都县", "兴国县", "赣县" ]
  4. var t2 = citys.slice(1);
  5. console.log(t2);//Array [ "兴国县", "赣县" ]
  6. var t3 = citys.slice(1, 2);
  7. console.log(t3);//Array [ "兴国县" ]

运行结果如下:

20210309193621601.png

Java和Javascript中的值传递与引用传递

按值传递和按引用传递,其它案例

  1. //值传递
  2. var a = 2;
  3. var b = a; // b是a的值的一个副本
  4. console.log(a);// 2
  5. console.log(b);// 2
  6. b++;
  7. console.log(a);// 2
  8. console.log(b);// 3

运行结果如下:

20210309194036828.png

  1. //引用传递
  2. var c = [1,2,3];
  3. var d = c; // d是[1,2,3]的一个引用,同指一块内存区域
  4. console.log(c);//Array(3) [ 1, 2, 3 ]
  5. console.log(d);//Array(3) [ 1, 2, 3 ]
  6. d.push(4);
  7. console.log(d); // Array(4) [ 1, 2, 3, 4 ]
  8. console.log(c); // Array(4) [ 1, 2, 3, 4 ] 修改同指的那片内存区域,因此c也跟着变化了
  9. d = [4,5,6];
  10. console.log(d);//Array(3) [ 4, 5, 6 ]
  11. //d指向一片新的内存区域[4,5,6],不会改变c的指向,因此c还是[1,2,3,4]
  12. console.log(c);//Array(4) [ 1, 2, 3, 4 ]

运行结果如下:

20210309194829904.png

  1. //引用副本传递
  2. function foo(x) {
  3. x.push(4);
  4. console.log(x, "******");
  5. //然后
  6. x.length = 0; // 清空数组
  7. x.push(4, 5, 6, 7);
  8. console.log(x, "######");
  9. }
  10. var a = [ 1, 2, 3 ];
  11. foo(a);
  12. console.log(a); // 是[4,5,6,7],不是[1,2,3,4]
  13. a = [ 1, 2, 3, 4 ];
  14. foo(a.slice());//a.slice()传入的是a的浅复制副本,因此不会改变a的那块内存区域
  15. console.log(a);//还是[1,2,3,4]
  16. foo(a);
  17. console.log(a);//[4,5,6,7]

运行结果如下:

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2N6aDUwMA_size_16_color_FFFFFF_t_70 2

发表评论

表情:
评论列表 (有 0 条评论,260人围观)

还没有评论,来说两句吧...

相关阅读