博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
js变量传递
阅读量:5085 次
发布时间:2019-06-13

本文共 1782 字,大约阅读时间需要 5 分钟。

基本类型、引用类型

基本类型: undefined、Null、Boolean、Number、String五种 (简单的数据段);

引用类型: object (由多个值构成)。

两种类型在使用上的区别:

复制变量

// 基本类型var num1 = 5;var num2 = num1;num2 = 10;console.log(num1 + ' | ' + num2); // 5 | 10// 引用类型var obj1 = new Object();obj1.num = 5;var obj2 = obj1;obj2.num = 10;console.log(obj1.num + ' | ' + obj2.num); // 10 | 10

一句话,引用类型复制的是指针的指向。

传递参数

抛出一个例子:

function addTen(num) {num += 10;return num;}var count = 20;var result = addTen(count);console.log(count + ' | ' + result); // 20 | 30

看完这个例子,秒懂按值传递。紧接着又来一段代码:

function setName(obj) {obj.name = 'aaa';return obj;}var person = new Object();person.name = 'bbb';var newPerson = setName(person);console.log(person.name + ' | ' + newPerson.name); // aaa | aaa

看完这个例子,我就懵逼了。这段代码不是解释成按引用传递更合理吗?

然后又给了一个证明就算参数是引用类型也是按值传递的例子:

function setName(obj) {obj.name = 'aaa';var obj = new Object(); // 如果是按引用传递的,此处传参进来obj应该被重新引用新的内存单元obj.name = 'ccc';return obj;}var person = new Object();person.name = 'bbb';var newPerson = setName(person);console.log(person.name + ' | ' + newPerson.name); // aaa | ccc

从结果看,并没有显示两个'ccc'。这里是函数内部重写了obj,重写的obj是一个局部对象。当函数执行完后,立即被销毁。

到这里,js高程解释完了按值传递和按引用传递。然而对于我这样智商略平的同学而言,还是一脸懵逼。于是去网上深入地了解了下。

引用值:对象变量它里面的值是这个对象在堆内存中的内存地址。因此如果按引用传递,它传递的值也就是这个内存地址。那么var obj = new Object();会重新给obj分配一个地址,比如是0x321了,那么它就不在指向有name = 'aaa';属性的内存单元了。相当于把实参obj和形参obj的地址都改了,那么最终就是输出两个ccc了。

最后看个例子,弄懂了也就差不多理解了。

var a = {num:'1'};var b = {num:'2'};function change(obj){obj.num = '3';obj = b;return obj.num;}var result = change(a);console.log(result + ' | ' + a.num); // 2 | 3

走一遍思路:

首先把a的值传到change函数内,obj.num = '3';a.name被修改为3;
a的地址被换成b的地址;
返回此时的a中a.num

按共享传递

在网上还看到一种叫 按共享传递 的说法,而且特别好理解。
大致概念是这样的:调用函数传参时,函数接受对象实参引用的副本(既不是按值传递的对象副本,也不是按引用传递的隐式引用)。 它和按引用传递的不同在于:在共享传递中对函数形参的赋值,不会影响实参的值。

 

转载于:https://www.cnblogs.com/tkzc2013/p/10640715.html

你可能感兴趣的文章
javascript闭包
查看>>
@Column标记持久化详细说明
查看>>
创建本地yum软件源,为本地Package安装Cloudera Manager、Cloudera Hadoop及Impala做准备...
查看>>
mysql8.0.13下载与安装图文教程
查看>>
站立会议08(冲刺2)
查看>>
url查询参数解析
查看>>
http://coolshell.cn/articles/10910.html
查看>>
[转]jsbsim基础概念
查看>>
DIV和SPAN的区别
查看>>
第一次使用cnblogs
查看>>
C#语法糖之 session操作类 asp.net
查看>>
2015 Multi-University Training Contest 3
查看>>
使用Gitblit 在windows 上部署你的Git Server
查看>>
217. Contains Duplicate
查看>>
vue2.0 关于Vue实例的生命周期
查看>>
jenkins 更换主数据目录
查看>>
Silverlight中恼人的g.i.cs错误
查看>>
SQLite 数据库增删改查
查看>>
<s:iterator>的status
查看>>
C++入门--1.0输入输出
查看>>