学习JS的心路历程-参数的传递(下)

今天我们要来探讨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的重要观念

原文地址:https://www.cnblogs.com/lannyQ-Q/p/9913245.html

时间: 2024-11-05 20:24:58

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

学习JS的心路历程-声明

变量 在程序中将一个值指定(assign)给一个符号式的容器(symbolic container),叫做一个变量(variable). 声明在JS中目前提供了三种声明方式: var 声明一个变量,可选择是否给予一个初始值. 作用范围(scope)于该函式之内:但是如果在函式外声明,其作用范围则为全局性(global). var price = 10: price = price * 2: console.log(price): let(ES6新增) 声明一个内存块范围(scope)内的本地变量

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

在上一篇提到了JS有三种声明变量的方式,分别是var.const及let,var和const let最大区别就是范围(scope)的限制.所以在这一篇我们会详谈何谓范围链及他们的复写优先级. 范围Scope 我们先来看一个例子: var globalVar = 'global': function scopeFun(){ globalVar ="change in scopeFun": console.log("1.",globalVar)://1.change i

React+Immutable.js的心路历程

这段时间做的项目开发中用的是React+Redux+ImmutableJs+Es6开发,总结了immutable.js的相关使用姿势: Immutable Data 顾名思义是指一旦被创造后,就不可以被改变的数据.可以通过使用Immutable Data,可以让我们更容易的去处理缓存.回退.数据变化检测等问题,简化我们的开发. 我们知道 react.js很著名的就是它处理dom的做法,它是通过Virtual Dom来查看diff,然后再改动需要改动的Dom.但是有个问题当state更新时,如果数

学JS的心路历程-函式(五)箭头函式

箭头函式arrow function 为了能够以更简短的方式建立函式,ES6变推出了箭头函式. 用说明的可能会不太懂,我们先拿之前的数组排序例子来看: var arr = [2,1,6,12,3,77,100,4]: arr.sort(function(a,b){ return a - b: }): arr.sort()经过箭头函式的修改后: var arr = [2,1,6,12,3,77,100,4]: arr.sort((a,b)=> a-b): 是不是简洁许多了! 现在让我们一步一步来看

学JS的心路历程 -非同步执行

JS是单线程的语言,也就是说同一时间只会执行一行程序,所以如果一段程序执行过久就会造成阻塞(blocking)的现象,必须等到它结束后才能执行下一段程序. 举个例子来说,如果我们今天要买便当,但是老板说要十分钟才会好,那难道我们这十分钟内都不能做任何事情吗? 当然不是,JS本身有非同步执行的功能,也是就说我们会先跟这个函式说,你先到旁边继续跑,好了在「回来呼叫」我,我先继续跑其他程序. 有没有看到熟悉的关键字「回来呼叫」,没错非同步执行基本上都是利用callback达成. 举个例子来说,我们今天

学JS的心路历程-JS支持面向对象?(一)

昨天在看Prototype看到JS支持面向对象,被前辈问到说那什么是面向对象?JS是面向对象语言吗? 便开始了一连串艰辛爬文过程,今天就来看一下两者有什么差异吧(rgwyjc)! 首先面向对象有三大特色,封装.继承及多态,这三个都是抽象的概念. 其中继承这个抽象的概念,是为了避免多个类别间重复定义了相同行为与实作.基本上有两种实作的方式可以实现,「原型继承」与「类别继承」. 这两者分别的特色如下. 类别继承classical inheritance: 可以从同一个类别(class)中实例多个物件

学JS的心路历程 - JS的Class

没错,你没有看错,虽然前面说JS是原型继承,但在ES6以后新增了class关键字!!! 不过底层实作仍然是以原型继承方式进行,所以基本上算是一个语法糖. 今天我们就来看一下如何使用吧! class 首先先来看一个最简单的class例子. class Person{ constructor(val){ this.age = val: } say(){ return"Hi!": } } var Jason = new Person(29): Jason instanceof Person:

js函数中参数的传递

先看一道JS的笔试题: var setObj=function(o){ o.name="xiaoming"; o={}; o.name="xiaohong"; } var p={name:"xixi",age:24}; setObj(p); console.log(p); 答案是{name:xiaoming,age24}: 在JavaScript中函数参数默认为引用类型. 在阅读本章节之前建议参阅一下两章节:1.值类型可以参阅javascript

在js中window.open通过“post”传递参数

在js中window.open通过“post”传递参数的步骤如下: 如:在A.jsp中 有一个js方法 winow.open,目标地址是 xx.do 1.在A.jsp建一个form,把要设置的值通过js动态添加到里面,如: $("#postForm").append('<input type="hidden" name="query.id" value="12"/>'); 2.设置form的target属性: $(