JS - 按值传递&&引用传递

基本类型和引用类型

JavaScript中基本类型为简单类型:
● string
● number
● boolean
● undefined
● null

引用类型为复合类型:
● Date
● Arry
● Number
● String
● Boolean
● Math
● RegExp

还有两个核心类:
● Object
● Function
其中Number,String,Boolean为简单类型number,string,boolean的包装类型。
基本类型的变量和引用类型的变量最大区别在变量本身保存的值。基本类型的变量保存的就是数据本身,而引用类型的变量保存的是数据的引用,这个引用指向真实的数据地址。数据结构如图所示:


111.jpg

基本类型在复制操作事将变量的值拷贝一份副本赋值给另一个变量,两个变量除了值相同之外无任何联系。

var num1 = 5;
var num2 = num1;
num2 ++;
alert(num1); //5
alert(num2); //6

num2的值不管怎么改变都不影响num1。
引用类型的变量的值是引用,指向数据本身。所以赋值的时候将引用赋值给另一个变量,两个变量指向同一个数据。所以改变一个内容另一个也跟着改变。

var person = new Object();
person.name = "landmine";
var person2 = person;alert(person2.name); //landmine
person2.name = "asd";
alert(person.name ); //asd

可以看到person2复制了person后对person2的name属性进行改变后,person的值也会改变。

参数传递

接下来进入重头戏,如何理解参数传递的都是以数值传递。通过上面的代码我们可以发现引用类型的复制就是将本身的引用地址赋值给另一个变量。这句话对于理解参数的传递很重要。第一次看js高程的时候由于忽略了这句话导致我一整个小节都看的半懂不懂。

首先是基本类型的参数传递:

var num = 10;
function fn(num2) {
     num2 +=10;
     return num2;
}
var num3 = fn(num);
alert(num); //10
alert(num3); //20

基本类型很好理解,参数以值类型传递进入函数内。复制的时候是复制值的副本,复制完后两个变量没有任何关联。

接下来是引用类型:
function fn(obj) {
obj.name = "dilei";
}
var person = new Object();
person.name = "landmine";
fn(person);
alert(person.name); //dilei

在我以前的理解中,按值传递就是将数据拷贝一份副本赋值给形参。这样不管是引用类型还是值类型,传递进函数后对形参进行修改数值都不会影响外部的变量。然而在上面的演示demo中可以看到,函数内修改数值会影响到函数外的变量。如今再次细读高程的这一小节后才发现,人家一开始就明明白白的写了,在向参数传递引用类型的值时,会把这个值在内存中的地址复制给一个局部变量,因此这个局部变量的变化会反映在函数的外部,参考我之前的图片,参数传递的时候并不是将变量的数据拷贝一份副本赋值给形参。而是将变量的值拷贝一份副本赋值给形参。

从我上面的图片可以看出,基本类型的变量的数据和值是相同的,而应用类型的变量的值保存的是数据的引用,可以抽象对图片中的箭头。所以在参数传递的时候将按值传递给函数的形参,也就是把引用传递给函数的形参。


222.jpg

从上面的图片中可以看到,person和obj指向的是一个数据,所以可以通过修改obj来修改person的name属性。

也可以通过以下demo验证:

function fn(obj) {
obj = {};
}
var person = new Object();
person.name = "landmine";
fn(person);
alert(person.name); //landmine

上面的代码先将obj赋值一个空的object对象。如果是引用传递的话person会和object一样将会被重新赋值为一个空的object对象。但是参数的传递是值传递的,也就是说obj本身只不过是引用而已,重新赋值不过是将引用指向了另一块内存空间,原来的person以及person的值指向的内存空间的数据并没有被修改,所以person.name的值还是landmine。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,236评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,867评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,715评论 0 340
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,899评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,895评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,733评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,085评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,722评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,025评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,696评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,816评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,447评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,057评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,009评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,254评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,204评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,561评论 2 343

推荐阅读更多精彩内容