今天我们要来探讨JS到底是透过何种参数传递方式呢?

废话不多说,上示例!!

我们先声明原始型别和物件型别来看看两者是否会有不一样的差异:

var myStr = 'Hola';

var myObj = {name:'Ann'};

再来,声明另一个变量去复制他们:

var myStr = 'Hola';

var myObj = {name:'Ann'};

var copyStr = myStr;

var copyObj = myObj;

然后,去修改复制过的变量内容并印出所有作比较:

var myStr = 'Hola';

var myObj = {name:'Ann'};

var copyStr = myStr;

var copyObj = myObj;

copyStr =“Im change!!“;

copyObj.name = 'Pandora';

console.log(myStr);//Hola

console.log(copyStr);//Im change!!

console.log(myObj);//{name:“Pandora”}

console.log(copyObj);//{name:“Pandora”}

恩?怎么会两个行别的结果会不一样呢!

那这样到底是哪一种参数传递方式啊!!

在估狗浩瀚的大海下寻找了很久,发现JS的圣经ECMAScript并没有说明他到底是使用何种参数传递方式,

不过大部分人认为是Call by sharing。

好,但这还是不能解释为什么myStr不等于copyStr啊!

这怎么看都像Call by value吧。

后来发现MDN在JS在基本型别有说明到:

所有的基本型别都是不可变的(immutable),即不可修改的。

所以在复制基本型别的值时候回直接给予一个新的值,而不是参考原本的值。

再回到我们一开始的示例来看:

var myStr = 'Hola';

var myObj = {name:'Ann'};

var copyStr = myStr;

var copyObj = myObj;

copyStr =“Im change!!“;

copyObj.name = 'Pandora';

console.log(myStr);//Hola

console.log(copyStr);//Im change!!

console.log(myObj);//{name:“Pandora”}

console.log(copyObj);//{name:“Pandora”}

我们用图片来说明事情是怎么发生的:

总结:

JS本身并没有说明自己是用何种参数传递方式来实作的,只能用各种示例去反推勉强得出是Call by sharing,单这终究只是推测!!

如果有人说JS“就是”用Call by sharing做的,只能用微笑看着他。

参考资料:

深入探讨JavaScript中的参数传递:call by value还是reference?

JavaScript -参数传递方式(1)

C语言:超好懂的指标,初学者请进~

[笔记]谈谈JavaScript中by reference和by value的重要观念

学习JS的心路历程-参数的传递(下)的更多相关文章

  1. 学习JS的心路历程-参数传递方式(上)

    很多人认为JS的传递方式是值是Call by value, 物件及数组是Call by Reference.甚至还有人宣称其实JS是Call by sharing,那到底是哪一个呢? 这两天我们一一来 ...

  2. 学习JS的心路历程-声明

    变量 在程序中将一个值指定(assign)给一个符号式的容器(symbolic container),叫做一个变量(variable). 声明在JS中目前提供了三种声明方式: var 声明一个变量,可 ...

  3. 学习JS的心路历程-函式(一)

    前几天有间单提到该如何声明函式及在Hositing中会发生什么事,但是函式的奥妙不仅于此. 身为一个使用JS的工程师,我们一定要熟悉函式到比恋人还熟! 这几天将会把函式逐一扒开跟各位一起探讨其中的奥妙 ...

  4. 学习JS的心路历程-范围Scope和提升(Hoisting)

    在上一篇提到了JS有三种声明变量的方式,分别是var.const及let,var和const let最大区别就是范围(scope)的限制.所以在这一篇我们会详谈何谓范围链及他们的复写优先级. 范围Sc ...

  5. 学习JS的心路历程-类型

    前言 之前学JS时候都是靠着谷狗一路跌跌撞撞的学过来,从来没有去翻过MDN的文件,导致留了许多技术债给自己. 最近有幸遇到一位前辈并开始从头学JS,前辈表示学程序不看文件是想作死自己?于是我的第一份功 ...

  6. 学JS的心路历程-函式(六)其余参数及预设参数

    今天我们要来介绍ES6新增的其余参数及预设参数! 其余参数rest parameter …numbers可以让我们表示不确定数量的参数,并将其视为一个数组: function getVal(…numb ...

  7. 学JS的心路历程 -函式(三)this

    this是什么,取决于被呼叫的呼叫地点. 昨天有提到说,呼叫函式时候会传递隐含参数:arguments和this并讲解了arguments,今天我们就来探讨this吧! 什么是this 我们都会呼叫函 ...

  8. 学JS的心路历程-函式(二)arguments

    参数(argument)与函式参数(parameter) 在讨论函式时,很多人都会把这两个搞混,我自己也不例外. 虽然讲错别人也听得懂,但是我们还是要搞清楚这两个的定义到底是什么! 参数是当我们呼叫函 ...

  9. 学JS的心路历程-物件与原型(一)

    前两天说明面向对象的三大特性及JS不符合面向对象,只能称作支持面向对象而已,今天我们来看看JS的原型继承. 首先我们先来看,什么是原型(vmwork): 两个物件之间的原型关系(prototype r ...

随机推荐

  1. C# .NET ToList()分页

    ViewData.Model = Limodel.ToList().Skip((page - ) * ).Take().ToList(); //page 当前页,10:每页几条数据

  2. JQ替换标签与内容

    JQ: $('#Status').replaceWith(function () { return $("<select ><option value='0'>未认证 ...

  3. windows下mvn verify异常

    [ERROR] Failed to execute goal org.apache.maven.plugins:maven-jarsigner-plugin:1.4:sign (sign) on pr ...

  4. openStack queens

  5. 50.纯 CSS 创作一个永动的牛顿摆

    原文地址:https://segmentfault.com/a/1190000015270808#articleHeader0 感想: 动画效果 + ::before + 2D转换 HTML code ...

  6. Mybatis七(MBG 逆向工程)

    官方地址:http://www.mybatis.org/generator/ https://github.com/mybatis/generator/releases <1>编写mbg. ...

  7. [Writeup]百度一下,你就知道

    [Writeup]百度一下,你就知道 谢邀@宋雨田 人在607,刚下床 育才上网,信号不好 实名diss,能人宋雷 ---------------------- 以下是原答案 ------------ ...

  8. PyCharm 安装使用

    服务器激活地址(转载)http://www.cnblogs.com/littlehb/p/7784517.html   PyCharm 服务器激活地址: 最近用edu邮箱申请了一个JetBrains针 ...

  9. javascript页面刷新的几种方法

    javascript refresh page 几种页面刷新的方法 本节内容:Javascript刷新当前页面的方法与实例. window.location.reload(),window.histo ...

  10. Shell 编程(实例二)

    创建一个脚本,为指定硬盘创建分区 1.列出当前系统所有磁盘,让用户选择,如果选择quit则退出脚本:如果选择错误,则重新选择 2.当用户选择完成后,询问是否继续 3.抹除选择磁盘上的分区,为其创建三个 ...