JS 函数的按值传递
来源:互联网 发布:汉朝历史 知乎 编辑:程序博客网 时间:2024/06/05 02:47
学过又忘了,于是网上搜了一下,发现网上很多都说得不够具体,于是翻了下红宝书,现在算是明白了(希望别忘得太快= _=!!)!
个人比较水,还是拿网上网友的例子来说吧,毕竟问题是从这里开始。
function changeObj(o) { o.name = "changeobj"; } var p = {}; changeObj(p); console.log(p.name); var o = { name: 'tt' }这里应该没什么问题了,因为在JS中,所有函数的参数都是按值传递(ECMAScript中规定的),不过传递的参数类型分为基本数据类型和引用类型。
基本数据类型包括:Undefined,String,Number,Null,Boolean;引用类型为:Object,Array,Function
基本数据类型的传参是将变量复制一个副本,然后赋值到另一个变量,两个变量之间没有联系;而当一个变量向另一个变量复制引用类型的值时,同样也会将存储在变量对象中的值复制一份放到新变量分配的空间中。这个值的副本实际上是一个指针,而这个指针指向存储在堆对象中的一个对象。复制结束后,两个变量实际上引用的是同一个对象。
var o = { name: 'tt' } var b = new Object(); b.name = 'b'; o = b; console.log(o.name);这里也能理解了,这里创建了一个对象o,然后创建了对象b,并为b添加name属性,接着把b赋值给o(这里o引用的是b的地址,所以打印结果是‘b’);
function quoteFn(obj) { var o = new Object(); obj = o; obj.name = "tony"; obj.age = 24; obj.sex = "Men"; } var person = { name: "miracle", age: 12 } console.log(person.name); console.log(person.age); console.log(person.sex);
一开始让我懵逼的地方来了,这里比较难理解的地方是红色加粗字体部分,一开始总以为和上面两段代码一样,quoteFn传入person作为参数,运行之后打印出来的结果是quoteFn里面修改后的结果,但是结果不是我想象的那样。这是因为var o = new Object()这里创建了新对象o,此时o已经在内存中生成一个地址了,obj = o 让obj指向了新创建的对象o,所以跟原来传入person的时候指向的不是同一个地址(一开始还以为是作用域问题),最后打印出来的结果是“miracle”,“12”,“undefined”。
0 0
- JS 函数的按值传递
- JS函数参数都是按值传递的!
- [读书笔记]js函数参数的按值传递
- js中函数参数的值传递和引用传递
- js函数:参数的传递
- JS的函数参数传递
- JS得到地址栏传递参数的函数
- js得到地址栏传递参数的函数
- js中函数参数是按值传递的
- JS中函数参数的传递
- js第五节-函数参数的传递
- js函数中参数的传递
- 关于js函数的参数传递问题
- js函数中参数的传递
- js函数中参数的传递
- js中函数的传递参数
- JS 函数和参数的传递
- 【08】js函数中参数的传递
- 关于windows环境下MySQL命令行的重启
- POJ 2623 Sequence Median G++ 错了25+ 别人的程序一点也不敢改才通过
- Android 自定义View起步(转载)
- Wikiot-DIY笔记(1)Jlink-OB-072
- HTML5历史状态管理history API-pushState/replaceState与popstate事件
- JS 函数的按值传递
- 命令行中的一些知识
- 在javaScript中检测数据类型的几种方式
- 多线程_进程概述及多进程的意义
- 1002
- MySQL中的unsigned
- Greenplum视频---01Greenplum架构的课堂笔记
- 基于EasyDarwin云平台实现的EasyClient客户端与EasyCamera摄像机之间的对讲与云台控制功能
- 获得程序当前路径System.getProperty("user.dir")