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,就跟我一起来学习下好啦~
 
(一)基本类型
 
 
首先,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题(引用类型、基本类型、包装对象、函数赋值)的更多相关文章

  1. 一道js题

    <script> var a = 5; function test(){ this.a = 10; a = 15 this.func = function(){ var a = 20 ; ...

  2. JavaScript 基本包装类型,包装对象

    前言 javascript对象是一种复合值,它是属性或已命名值的集合.通过'.'符号来引用属性值.当属性值是一个函数时,称其为方法.通过o.m()来调用对象o中的方法.我们发现,字符串也同样具有属性和 ...

  3. JS学习笔记 等于和包装对象

    严格等于 a===b 首先判断两边数据的类型,若类型不同,返回false. 若类型相同(1.2和1.2,字符串相等指内容和长度都是一样的),返回true null===null undefined== ...

  4. js之数据类型(对象类型——构造器对象——函数1)

    函数它只定义一次,但可能被多次的执行和调用.JavaScript函数是参数化的,函数的定义会包括形参和实参.形参相当于函数中定义的变量,实参是在运行函数调用时传入的参数. 一.函数定义 函数使用fun ...

  5. JS基础知识点——原始类型和对象类型的区别

    1.js类型 1.1 JavaScript语言规定了7种语言类型,他们分别是: Number(数字) Boolean(布尔值) String(字符串) Null (空) Undefined (未定义) ...

  6. 记面试的一道JS题

    给一个数组arr=[1,2,3,4,5],索引第二位插入'z',设计一个函数change,调用change(arr, 2, 'z')返回一个新数组[1,2,'z',3,4,5] 我想了两种办法: 第一 ...

  7. 轻松理解JS基本包装对象

    今天来讨论一下JS中的基本包装对象(也叫基本包装类型),之前刚学到这里的时候,自己也是一头雾水,不明白这个基本包装对象到底是个什么鬼,后来找了很多资料,终于看清了它的真面目.首先呢,我们现在复习一下J ...

  8. JavaScript--我发现,原来你是这样的JS(再说引用类型,基本包装类型与个体内置对象)

    一.介绍 本篇是续上一篇的,引用类型的后篇,本篇主要是说基本包装类型和个体内置对象.如果你能收获一些知识,那我很高兴,很满足,哈哈哈,希望大家能愉快看完.如果你想学好一门技术,要不忘初心,方得始终. ...

  9. JS--我发现,原来你是这样的JS(引用类型不简单[下篇],基本包装类型与个体内置对象)

    一.介绍 本篇是续上一篇的,引用类型的下篇,本篇主要是说基本包装类型和个体内置对象.如果你能收获一些知识,那我很高兴,很满足,哈哈哈,希望大家能愉快看完.如果你想学好一门技术,要不忘初心,方得始终. ...

随机推荐

  1. CSS概要

    CSS概要 laiqun@msn.cn Contents 1. css的引入 2. css的选择器及效果图 3. css 盒模型 4. css 浮动 4.1. 浮动的作用: 4.2. 浮动的影响: 5 ...

  2. label不换行的问题

    除了numberOfLines属性label有一个preferredMaXLayoutWidth属性.设置试试

  3. nuget pack 时不包含依赖包(而不是引用项目的dll,区别于IncludeReferencedProjects)

    Excluding development dependencies when creating packages Some NuGet packages are useful as developm ...

  4. css(非表格变成表格用)

    父元素:display:table: 子元素:display:table-cell:vertical-align:middle:

  5. CodeForces 719A Vitya in the Countryside 思维题

    题目大意:月亮从0到15,15下面是0.循环往复.给出n个数字,如果下一个数字大于第n个数字输出UP,小于输出DOWN,无法确定输出-1. 题目思路:给出0则一定是UP,给出15一定是DOWN,给出其 ...

  6. HttpSession详解

    HttpSession详解   session的机制 http是无状态的协议,客户每次读取web页面时,服务器都打开新的会话,而且服务器也不会自动维护客户的上下文信息,那么要怎么才能实现会话跟踪呢?s ...

  7. [转]程序开发基础学习二(C++ Google Style 命名规则)

    无规矩不成方圆,新的岗位就需要服从团队的编码规则.很开心团队用的是Google的C++编码规则,大概看了下Google 的编码规则,正如九天翔雁说的:“Google的 C++ Style Guide远 ...

  8. 【转载】关于SetWindowOrgEx、SetViewportOrgEx、SetViewportExtEx 和SetWindowExtEx 详解

    关于SetWindowOrgEx.SetViewportOrgEx.SetViewportExtEx 和SetWindowExtEx 详解 1.  SetWindowOrgEx是设置窗口的原点坐标. ...

  9. 转:Jmeter常见问题 (转载) http://www.51testing.com/?uid-128005-action-viewspace-itemid-84094

    说明:这些问答是从网上转载的,自己修改了其中的一些内容,如果大家兴趣,可以将大家在使用Jmeter的时候碰到的问题写下来,我们一起补充到这个问答里面,共同努力完善jmeter的资料. 1.  JMet ...

  10. php basename()文件夹 路径 文件后缀名 读取pathinfo()

    $path = "/www/mywebsite/images/myphoto.jpg"; 1.pathinfo()函数 pathinfo()函数返回的是一个包含了文件信息的数组,数 ...