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. hdu_1181_变形课(dfs)

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1181 题意:中文题,不解释 题解:直接DFS #include<cstdio> #incl ...

  2. AngularJS展示数据的ng-bind指令和{{}} 区别

    在AngularJS中显示模型中的数据有两种方式: 一种是使用花括号插值的方式: 1 <p>{{text}}</p> 另一种是使用基于属性的指令,叫做ng-bind: 1 &l ...

  3. VO , PO , BO , QO, DAO ,POJO

    VO , PO , BO , QO, DAO ,POJO, O/R Mapping 是 Object Relational Mapping (对象关系映射)的缩写.通俗点讲,就是将对象与关系数据库绑定 ...

  4. linux压缩和解压缩命令

    压缩:tar -zcvf 名称.tar.gz 文件夹 解压:tar -zxvf 包名.tar.gz 解压路径

  5. access的保留关键字

    access的保留关键字  -A     ADD     ALL     Alphanumeric     ALTER     AND     ANY     Application     AS   ...

  6. CASE WHEN的两种格式

    CASE WHEN的两种格式 1.简单Case函数 CASE sex WHEN '1' THEN '男' WHEN '2' THEN '女' ELSE '其他' END 2.Case搜索函数 CASE ...

  7. ubuntu 上下载PHP的源代码

    参考: https://vpsineu.com/blog/how-to-build-and-install-php-5-6-9-from-source-on-ubuntu-14-04-vps/ 直接 ...

  8. 事件委托小demo(原生版)

    <style type="text/css"> body, div, span { margin:; padding:; font-family: "\5FA ...

  9. HDU 1155 Bungee Jumping 物理

    题目大意:给出k:绳子的劲度系数,l:绳长,s:桥高,w:邦德的质量,g取9.81.绳子弹力=形变量*劲度系数.如果落地速度大于10 则摔死,小于0则飘着空中. 题目思路:根据能量守恒得知:落地的动能 ...

  10. cakephp 复杂查询

    $now = time(); $this->CardTypeInfos->recursive = -1; $conditions = [ 'seller_id'=>SELLER_ID ...