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数据类型具有动态性,因此的确没有再定义其他数据类型的必要.这句话很重要. 如果以后再数据类型 ...
随机推荐
- react-navigation 页面跳转 及 传参
1.配置路由 export const AppNavigator = createStackNavigator ( { Guide: { // 引导页 screen: GuidePage }, Lau ...
- Android开发之用双缓冲技术绘图
双缓冲技术主要用在画图,动画效果上,其原理就是:将资源先载入到缓冲区,然后再将缓冲区整个载入到View上面去. 双缓冲技术可以有效防止闪烁,提高显示质量. DrawView.java: package ...
- 请实现一个函数,把字符串中的每一个空格替换成“%20”,比如输入 “We are Happly。” 则输出“we%20are%20happy。”
请实现一个函数,把字符串中的每一个空格替换成"%20",比如输入 "We are Happly." 则输出"we%20are%20happy. &q ...
- C++程序设计(第4版)读书笔记_C++概览:基础知识
变量赋值 常用的变量赋值都是用“=”去赋值的 ; 但是如果把一个浮点数赋值给i的话,就会造成精度损失,在C++中最好使用初始化列表的方式“{}”给变量赋值,这样可以保证不会发生某些可能导致信息丢失的类 ...
- 657. Judge Route Circle【easy】
657. Judge Route Circle[easy] Initially, there is a Robot at position (0, 0). Given a sequence of it ...
- 简单使用shell 自动打包,发布项目 脚本
(1)打包,发布脚本 deploy.sh packagepath=/home/admin/testProject/project application=testProject mkdir -p $p ...
- spring boot 打包报错
[ERROR] Failed to execute goal org.springframework.boot:spring-boot-maven-plugin:1.3.0.RELEASE:repac ...
- python 分支结构
if 语句 if语句 计算机之所以能做很多自动化的任务,因为它可以自己做条件判断. 比如,输入用户年龄,根据年龄打印不同的内容,在Python程序中,可以用if语句实现: age = 20 if ag ...
- js和jquery触发按钮点击事件
js触发按钮点击事件 function load(){ //下面两种方法效果是一样的 document.getElementById("target").onclick(); do ...
- FreeBSD安装MySQL5.7.17
[root@tuhooo /usr/ports/databases/mysql57-server]# make install===> Installing for mysql57-serve ...