JavaScript是按值传递的,但是要分情况才知道传递之后原来的值会不会变,不然会出现你想都想不出来的bug

一、按值传递--元类型输入
tip:元类型( number, string, boolean, null, undefined ) 传入的参数,无论函数内部怎样对其操作,调用传入的变量都不会受影响。
例如:

var arr = [1, 2, 3, 4]
var str = '1234' function guangboticao7 (input) {
input = input + '5678'
console.log('时代在召(zhaò)唤', input)
return input;
} console.log('第七套广播体操', guangboticao7(str), str);

输出值为 时代在召(zhaò)唤 12345678

二、按值传递--引用类型输入
又要分两种情况
1.当函数内部对其property(属性)做修改时,调用传入的变量会受影响,被改变!!!如下面代码的第八套广播体操,push(在末尾添加数组,返回索引号)传入的arr数组,arr会被改变。

2.当函数内部对arr为其重新赋值,即newValue!==oldValue(完全不相等),传入外部变量不会受影响,即不会被改变!!!如下面代码的第九套广播体操,arr为[1, 2, 3, 4, [5, 6, 7, 8]]时,函数内部重新赋值了,arr不会被改变,仍然输出[1, 2, 3, 4, [5, 6, 7, 8]]。且concat拼接数组,返回一个新数组。

例子代码:

var arr = [1, 2, 3, 4]

function guangboticao8 (input) {
return input.push([5, 6, 7, 8])
} function guangboticao9 (input) {
input = '2234'
return [input].concat([5, 6, 7, 8])
} console.log('第八套广播体操', guangboticao8(arr), arr)
//输出 "第八套广播体操" 5 [1, 2, 3, 4, [5, 6, 7, 8]] console.log('第九套广播体操', guangboticao9(arr), arr)
// "第九套广播体操" ["2234", 5, 6, 7, 8] [1, 2, 3, 4, [5, 6, 7, 8]]

总结:js是按值传递,但是以防混淆,通常分为三种情况
1.元数据类型为传递值时,当当内部函数对传递值做了任何的修改,都不会改变其外部的传递值。
2.引用数据类型为传递值时,当内部函数对传递值做了属性修改,即push(),unshift(),concat(),pop(),shift(),splice(),slice(),reverse(),sort()就会使得传递值改变。
3.引用数据类型为传递值时,当内部函数对传递值重新赋值,即使得newValue!==oldValue(完全不相等),传递值不会被改变。

练习题:

var liLei = { name: 'Li Lei'}
var hanMeimei = { name: 'Han Meimei'}
var jim = {name: 'Jim' }

var students = [ liLei, hanMeimei ]

function change (s) {
s[0] = jim;
s[1].name = 'Lucy'
}

change(students);

console.log(students)
console.log(liLei)
console.log(hanMeimei)
console.log(jim)

结果是??!!!!

 
作业结果

参照知乎:https://zhuanlan.zhihu.com/p/24080761

最新文章

  1. laraver mongo 查询操作
  2. vim+slimv+sbcl搭建lisp的IDE
  3. Art Gallery - POJ 1279(求内核面积)
  4. MySQL主主复制+LVS+Keepalived实现MySQL高可用性1
  5. 1104解决ecos挂件中数组传递的相关问题。
  6. 取得phpcms网站下所有栏目的内容链接
  7. QTP的基本功能介绍
  8. Linux下基于Erlang的高并发TCP连接压力实验
  9. Nginx均衡负载(IP_HASH)未生效
  10. 美国总统大选,黑客组织“匿名者”(Anonymous)也来凑热闹
  11. 【Kafka源码】KafkaConsumer
  12. Java公开课-05.log4j
  13. Java开发笔记(八十一)如何使用系统自带的注解
  14. 『C编程』学习笔记(1)
  15. 第一册:lesson fifty nine。
  16. 反射入门-浅谈反射用途_根据Ado游标对象创建list集合
  17. 网络基础协议part 1
  18. 乘风破浪:LeetCode真题_040_Combination Sum II
  19. hdu 3289 最大独立集
  20. ScheduledThreadPoolExecutor的scheduleAtFixedRate方法探究

热门文章

  1. Unittest加载执行用例的方法总结
  2. 学习MPI并行编程记录
  3. 爬虫文件存储:txt文档,json文件,csv文件
  4. Linux系统学习之 一:新手必须掌握的Linux命令1
  5. 使用 Cordova 打包 app
  6. Python中的可迭代对象/迭代器/For循环工作机制/生成器
  7. hdu 5176 The Experience of Love
  8. 【Codeforces 474D】Flowers
  9. [置顶] Java基础学习总结(34)——HTTP协议详解
  10. POJ River Hopscotch 二分搜索