javascript代码实例教程-Javascript的赋值是引用or复制,及参数传递

发布时间:2019-02-10 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了javascript代码实例教程-Javascript的赋值是引用or复制,及参数传递脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。
小宝典致力于为广大程序猿(媛)提供高品质的代码服务,请大家多多光顾小站,小宝典在此谢过。 先来看2014年阿里巴巴前端线上笔试题:

 

复制代码

VAR a = 1;

var obj = {

    b: 2

};

var fn = function () {};

fn.c = 3;

 

function test(x, y, z) {

    x = 4;

    y.b = 5;

    z.c = 6;

    return z;

}

test(a, obj, fn);

alert(a + obj.b + fn.c);

复制代码

答案是12,如果回答得正确,就没必要看下去。If not,就跟我一起来学习下好啦~

 

(一)基本类型

 

由于学js没多久,对赋值究竟是引用还是复制不是很清楚(如果是引用,那一个值改变会影响另一个,如果是复制,那各玩各的,互不影响),遇到这类问题往往就很迷糊。花了天时间参阅了一些资料,整理如下。

 

首先,Javascript的基本类型有Boolean,String,Number,还有Undefined和Null,啊你肯定会说干嘛又扯最无聊的any Book的语法第一章内容,了解这个又怎么样,还真的有用呢。首先得明白的是,只有字面量的Boolean,String和Number,以及undefined+null(exact undefined null,区分大小写)才是属于基本类型的,new出来的不算。

 

即:

 

alert(tyPEof false);//"boolean"

var b = new Boolean(false);

alert(typeof b);//"object"

同样,new String('aaa')这种都不是基本类型,直接的a='aaa',a是基本类型,这就是:字面量的才是基本类型。

 

另一方面,Object,Function,Array其实都是构造函数,因为可以直接new Object()等,所以它们都是函数,so (Object instanceof Function === true) &&(Function instanceof Object===true).

 

要注意的是,基本类型没有属性和方法,但它们可以调用对应基本包装类型的方法,可以来看下面的例子:

 

var a = 'ot';

a.age = 18;//hahahahaha,yeah,forever 18

alert(a.age);//undefined

a.length = 160;

alert(a.length);//2

第二步的a.age = 18其实在实现的时候分成三步:

 

var s1 = new String('ot');

s1.age = 18;

s1 = null;

即基本类型每次调用类型或方法都会创建新对象,随后便销毁。

 

同样,在alert(a.age)的时候,分为下列步骤:

 

var s2 = new String('ot');

alert(s2.age);

s2=null;

因为没有对s2定义age方法,所以输出为undefined。在alert(a.length)的时候,由于s3=new String('ot'),String有length方法,所以,会输出结果,当然,上一步的赋值操作的对象也一定已经被销毁了。

 

(二)引用Or Copy

 

Clear about基本类型后,要了解的是,基本类型变量存在栈内部,每赋值一次就创建一个新的copy,然后play wITh itself. 而除了基本类型之外的引用类型,则存在堆内存中,只能引用。可以来看下面的例子:

 

复制代码

var ot = new Object();//创建一个对象,把地址赋值给ot,即ot指向这个地址

var op = ot;//把ot的值赋给op,所以op也是指向那个对象

op.age = 18;

alert(ot.age);//18

 

op = new String('sunshine');//把新创建对象的地址赋给op,ot当然不变

alert(ot.length);//undefined

复制代码

看了注释部分,相信已经能理解了。

 

(三)参数传递

 

Javascript的参数传递为值传递,我们来看下面的例子:

 

复制代码

function setAge(i)

{

    alert(i);//24

    i = 18;

    alert(i);//18

};

 

var ot = 24;

setAge(ot);

 

alert(ot);//24

复制代码

把ot的值24传递进去,赋值给i,于是第一个alert的是24,然后i重新赋值,于是alert出来的是18,但外层的ot不受影响,因为传递值,也就是复制了份内容给i而已。

 

那传递的值为引用类型时会怎么样呢?先看例子:

 

复制代码

function setName(obj)

{

    obj.name = 'ot';

};

 

var obj2 = new Object();

setName(obj2);

alert(obj2.name);//ot

复制代码

这看起来很像是传递的是引用,因为obj.name受到改变了,但其实不是,其实还是值,因为obj2本身的值就是新对象的地址,所以传进去的就是这个地址。

 

(四)回到面试题

 

我们现在再来看前面的面试题:

 

复制代码

var a = 1;

var obj = {

    b: 2

};

var fn = function () {};

fn.c = 3;

 

function test(x, y, z) {

    x = 4;

    y.b = 5;

    z.c = 6;

    return z;

}

test(a, obj, fn);

alert(a + obj.b + fn.c);

复制代码

首先test传递进去的实参中,a是基本类型(啊对了,复制了一份值喔喔),obj是object(指向地址呼啦啦,你动我也动呢),fn也当然不是基本类型啦。在执行test的时候,x被赋值为4(跟a没关系,各玩各的嘛,a仍然为1),y的b被赋值为5,那obj的b也变为5,z的c变为6,那fn的c当然也会是6. 所以alert的结果应该是1+5+6 =12. (其实test不返回z也一样,z仍然改变的)。

觉得可用,就经常来吧! 脚本宝典 欢迎评论哦! js脚本,巧夺天工,精雕玉琢。小宝典献丑了!

脚本宝典总结

以上是脚本宝典为你收集整理的javascript代码实例教程-Javascript的赋值是引用or复制,及参数传递全部内容,希望文章能够帮你解决javascript代码实例教程-Javascript的赋值是引用or复制,及参数传递所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。