JavaScript基础深入之
JS的数值类型是分为两类:基本数据类型和引用数据类型。
基本类型占据的内存栈空间,引用类型被保存在堆空间。引用类型赋值的变量也是被保存在栈空间的,它的作用类似于电视遥控器,负责操作堆空间内指向的对象。

var num = 10;
var change = function(obj){
obj = obj+10;
return obj;
}
var result = change(num);
console.log(result)//20
console.log(num)//10

上面例子把num作为参数传入函数change里面,但是对参数obj的操作并不会影响num原本的值,因为参数是按照值传递的,对于基本数据类型,这里没有什么疑议。

var a = {value:"teacher"};
var b = a;
b.value = "student";
console.log(a);//{value:"student"}
b = 2;
console.log(a);//{value:"student"}

看上面的代码,a变量指向的是一个对象,将a赋值给b变量,这时a和b同时指向了一块内存地址,所以a和b都可以对对象{value:"teacher"}进行操作。当b的value值修改为"student"时,a变量的value值也发生的改变,因为他们操纵的是一块内存地址。但是当我们给b赋值数值2时候,a变量不会改变。带着这个问题,我们看一下JS函数参数的传递。

var object = new Object();
var change = function(obj){
obj.name = "jim";
}
change(object);
console.log(object);//{name: "jim"}

可以看到和我们预想的效果是一致的,还是那句话,变量object和参数obj指向的是一块内存,改变obj就是改变了object。但是这个例子会给我们一种错觉,就是参数是按照引用传递的。js红皮书里面对此有做解释,不管是基本类型还是引用类型,参数都是值传递。参照上一个例子我们在写一个函数的改变参数引用指向的示范。

var object = new Object();
var change = function(obj){
obj.name = "jim";
obj = new Object();
obj.name = "carry";
}
change(object);
console.log(object);//{name: "jim"}

变量object并没有随着参数obj后续的改变而变化。我们不妨随着红皮书作者的思路深入推算一下,个人认为可以分两个层面理解这种传递信息:
层面1:只要是对对象内部的操作,我们可以认为这是引用,这块内存地址相当于object变量和参数obj的连接桥梁,不管是谁操作它,另一个都会有变化。
层面2:任何一个变量的引用地址发生变化的时候,即参数obj指向了其他的内存地址,这时候可以理解为值传递。相信红皮书作者的意思就是这样。变量object和参数obj之间的连接桥梁断掉了,自然参数obj不会对object变量产生影响。而且,局部变量obj指向的新内存地址也会随着函数调用完成之后被GC回收掉。
相对于红皮书作者的参数按值传递的解释,网友们给出了一个看法,就是介于值传递和引用传递之间还有一个共享传递。
其实共享传递只是一种叫法,你可以认为是引用,也可以认为是值,还可以认为是共享。
但是相对于叫法,我们更应该关注的是它内部的原理,即什么情况下两个变量会相互影响,什么情况下不会影响。
JavaScript基础深入之的更多相关文章
- JavaScript基础
JavaScript基础 JavaScript是一门编程语言,浏览器内置了JavaScript语言的解释器,所以在浏览器上按照JavaScript语言的规则编写相应代码之,浏览器可以解释并做出相应的处 ...
- 一步步学习javascript基础篇(0):开篇索引
索引: 一步步学习javascript基础篇(1):基本概念 一步步学习javascript基础篇(2):作用域和作用域链 一步步学习javascript基础篇(3):Object.Function等 ...
- 前端之JavaScript基础
前端之JavaScript基础 本节内容 JS概述 JS基础语法 JS循环控制 ECMA对象 BOM对象 DOM对象 1. JS概述 1.1. javascript历史 1992年Nombas开发出C ...
- 一步步学习javascript基础篇(3):Object、Function等引用类型
我们在<一步步学习javascript基础篇(1):基本概念>中简单的介绍了五种基本数据类型Undefined.Null.Boolean.Number和String.今天我们主要介绍下复杂 ...
- Javascript基础回顾 之(三) 面向对象
本来是要继续由浅入深表达式系列最后一篇的,但是最近团队突然就忙起来了,从来没有过的忙!不过喜欢表达式的朋友请放心,已经在写了:) 在工作当中发现大家对Javascript的一些基本原理普遍存在这里或者 ...
- Javascript基础回顾 之(二) 作用域
本来是要继续由浅入深表达式系列最后一篇的,但是最近团队突然就忙起来了,从来没有过的忙!不过喜欢表达式的朋友请放心,已经在写了:) 在工作当中发现大家对Javascript的一些基本原理普遍存在这里或者 ...
- Javascript基础回顾 之(一) 类型
本来是要继续由浅入深表达式系列最后一篇的,但是最近团队突然就忙起来了,从来没有过的忙!不过喜欢表达式的朋友请放心,已经在写了:) 在工作当中发现大家对Javascript的一些基本原理普遍存在这里或者 ...
- JavaScript 基础回顾——对象
JavaScript是基于对象的解释性语言,全部数据都是对象.在 JavaScript 中并没有 class 的概念,但是可以通过对象和类的模拟来实现面向对象编程. 1.对象 在JavaScript中 ...
- javascript基础01
javascript基础01 Javascript能做些什么? 给予页面灵魂,让页面可以动起来,包括动态的数据,动态的标签,动态的样式等等. 如实现到轮播图.拖拽.放大镜等,而动态的数据就好比不像没有 ...
- javascript基础02
javascript基础02 1.数据类型 数据类型的描述在上篇的扩展中有写到链接 由于ECMAScript数据类型具有动态性,因此的确没有再定义其他数据类型的必要.这句话很重要. 如果以后再数据类型 ...
随机推荐
- eclipse中egit插件使用(转)
1.eclipse和egit版本 eclipse使用的是kepler的SR1版,egit就是自带的那个版本,要详细的话,我就也只能把文件名贴出来了:eclipse-jee-kepler-SR1-win ...
- Zend Framework(一) windows8.1下配置zend framework1.12
windows8.1下配置zend framework1.12配置步骤: 1. 下载 zend framework1.12库 2. 创建zend frameworkproject 2 ...
- Sencha Touch开发完整流程快速讲解
1.目录 移动框架简介,为什么选择Sencha Touch? 环境搭建 创建项目框架,框架文件简介 创建简单Tabpanel案例 自定义图标的方式 WebApp产品测试和发布 HTML5离线缓存 发布 ...
- 【Java】Java_14 循环结构
循环结构 当型:当P条件成立时(T),反复执行A,直到P为“假”时才停止循环. 直到型:先执行A, 再判断P,若为T,再执行A,如此反复,直到P为F. 1.While循环 while循环的基本格式和流 ...
- Oracle 存储过程调用返回游标的另一个存储过程。
一个扩展存储过程调用另一个存储过程,示例: 被调用存储过程:最后会返回一个游标,游标返回一个值.调用这个存储过程的存储过程同样需要获取它. procedure SearchBill --根据到货单号查 ...
- rabbitmqctl 报错
RabbitMQ 安装成功后,cmd dos命令进入RabbitMQ的安装路径,如 E:\Program Files\RabbitMQ Server\rabbitmq_server-3.6.10\sb ...
- Java设计模式-代理模式之动态代理(附源代码分析)
Java设计模式-代理模式之动态代理(附源代码分析) 动态代理概念及类图 上一篇中介绍了静态代理,动态代理跟静态代理一个最大的差别就是:动态代理是在执行时刻动态的创建出代理类及其对象. 上篇中的静态代 ...
- 简体字丶冯|服务网关kong-docker安装
tags: kong ,服务网关,docker安装教程 grammar_cjkRuby: true --- 作为一名技术探索者,想了解一个未知系统的最有效方法就是去用.然而搭建一个陌生系统的最快捷方法 ...
- TensorFlow学习笔记 补充1——InteractiveSession
InteractiveSession 大家有时候在阅读代码时会看见InteractiveSession而不是熟悉的Session,这是什么东东呢? 其实,它们只有一点不同..... Interacti ...
- Atitit.java swing打印功能 api attilax总结
Atitit.java swing打印功能 api attilax总结 1. 打印方式有三种:2 1.1. 一是不经过任何修改,直接调用javascript中的window.print()打印.2 ...