美文网首页Web前端之路
JavaScript 数据类型和函数参数传递

JavaScript 数据类型和函数参数传递

作者: 卓三阳 | 来源:发表于2017-11-07 19:11 被阅读160次

    1.数据类型

    ECMAScript中有5种简单的数据类型:Undefined,Null,Boolean,Number,String.还有一种复杂的数据类型--Object(本质上是由一组无序的名值对组成的)。
    我们可以将它们分为:
    基本数据类型:保存在栈内存中的简单数据段,按值访问,操作的是他们实际保存的值。
    引用数据类型:保存在堆内存中的对象,意思是,变量中保存的实际上只是一个指针,这个指针指向内存堆中实际的值;按引用访问,当查询时,我们需要先从栈中读取内存地址,然后再顺藤摸瓜地找到保存在堆内存中的值。

    memory.jpg

    2.简单介绍六种数据类型

    首先我们先一起来认识三个判断数据类型的操作符吧。

    • typeof操作符-用于检测给定变量的数据类型
      "undefined"—未定义或未初始化的变量
      "boolean" —布尔值
      "string"—字符串
      "number"—数值
      "object"—对象或者null
      "function"—函数

    • Instanceof用于检测引用类型

    alert(person instanceof Object);
    alert(arr instanceof Array);
    alert(pattern instanceof RegExp);
    
    • toString

    toString() 是 Object 的原型方法,调用该方法,默认返回当前对象的 [[Class]] 。这是一个内部属性,其格式为 [object Xxx] ,其中 Xxx 就是对象的类型。

    对于 Object 对象,直接调用 toString() 就能返回 [object Object] 。而对于其他对象,则需要通过 call / apply 来调用才能返回正确的类型信息。

    Object.prototype.toString.call(new Function()) ; // [object Function]
    Object.prototype.toString.call(new Date()) ; // [object Date]
    Object.prototype.toString.call([]) ; // [object Array]
    Object.prototype.toString.call(new RegExp()) ; // [object RegExp]
    Object.prototype.toString.call(new Error()) ; // [object Error]
    Object.prototype.toString.call(document) ; // [object HTMLDocument]
    Object.prototype.toString.call(window) ; //[object global] window 是全局对象 global 的引用
    

    (1)Undefined

    Undefined类型只有一个值,即为特殊的undefined。

    • 使用var 声明变量但是未初始化,这个变量就是undefined;
    var patty;
    alert(patty==undefined);//true
    
    • 通过typeof返回数据类型时,未定义变量或变量没初始化都将返回undefined
    var patty;
    //var pattyecho
    alert(typeof patty);//undefined
    alert(typeof patyecho);//undefined
    

    虽然上述两种情况都为undefined,但其本质上来说是不一样的。
    这里要强调,未定义的变量不能被使用,否则报错,除了typeof var以外

    (2)Null类型

    Null类型是第二个只有一个值的数据类型,这个特殊的值为null。从逻辑角度来看,null值表示一个空对象指针,而这也正是typeof操作符检测到null值返回object的原因。例如:

    var car = null;
    alert(typeof car);//object
    

    因此,若定义一个空的变量用于将来存储对象,初始化时最好使用null。

    (3) Boolean类型

    boolean类型在ECMAscript中用得比较多的一种类型,它只有两个值:true or false 。但是这两个数值不是一回事,其他语言可能为1真0假,但是这里不是这样的。下面是为变量赋boolean值的例子:

    var found = true ;
    var lost = false;
    //注意:true 和 false 区分大小写。
    

    ECMAScript中可以用Boolean()函数转化相应的值为boolean值。例如:

     var message = "Hello World";
    var messageBoolean = Boolean(message) //true
    

    下面会讲解具体类型的值转化为对应boolean值的情况。

    数据类型 为true 为false
    Boolean true false
    String 任何非空字符串 ""(空的字符串)
    Number 任何非零数字值(包括无穷大) 0或者NaN
    Object 任何对象 null
    Undefined 不适用 undefined
    (4)Number类型
    整数
    • 十进制:  
      var intNun = 44;//整数

    • 八进制:
      var octalNum1 = 070;//八进制的56
      var octalNum2 = 079;//无效的八进制的数值-解析为79

    • 十六进制:
      var hexNum1 = 0xA; //十六进制的10
      var hexNum2 = 0x1f ; //十六进制31

    浮点数值
    var floatNum1 = 1.1;
    var floatNum2 = 2.3534e7 ; //e7代表10的7次幂,即为23534000
    
    NaN

    特殊的数值,它本身也不等于他本身
    alert(NaN==NaN);//false

    数值的转化
    Number();//可用于任何数据
    
    parseInt();//转化为整型
    
    parseFloat();//转化为浮点型
    
    
    (5) String类型

    用于表示由零个或多个16位Unicode字符串组成的字符序列,即为字符串。通常用单引号('')或双引号("")表示,例如:

    var firstName = "Li";
    var lastName = 'hua';
    

    字符字面量

    转义字符 名称
    \n 换行
    \t 制表
    \r 回车
    \f 进纸
    \\ 斜杠
    \' 单引号
    \" 双引号
    \b 退格
    (6)Object类型

    ECMAScript中的对象其实就是一组数据和功能的集合。

    var o = new Object(); //创建一个新的对象

    Object的每个实例都具有以下的属性和方法:

    1.constructor:保存着用于创建当前对象的函数。

    2.hasOwnProperty(propertyName):用于检测给定的属性在当前对象实例中是否存在。其中参数名必须以字符串形式指定,例如:

    O.hasOwnproperty("name");

    3.isPrototypeOf(object):用于检查传入对象是否是当前对象的原型。

    4.propertyIsRnumerable(propertyName):用于检查给定的属性是否能够使用 for-in 语句,与hasOwnProperty用法一样,参数名必须以字符串形式指定。

    5.toLocaleString():返回对象的字符串表示。

    6.valueOf():返回对象的字符串、数值或布尔值表示。通常与toString()方法返回值相同。


    3.基本和引用类型的复制

    基本类型变量的复制:
    从一个变量向一个变量复制时,会在栈中创建一个新值,然后把值复制到为新变量分配的位置上,改变源数据不会影响到新的变量(互不干涉)
    引用类型变量的复制:
    复制的是存储在栈中的指针,将指针复制到栈中未新变量分配的空间中,而这个指针副本和原指针执行存储在堆中的同一个对象,复制操作结束后,两个变量实际上将引用同一个对象;因此改变其中的一个,将影响另一个


    4.函数参数的传递

    在向参数传递基本类型的值时,被传递的值会被复制给一个局部变量,在向参数传递引用类型的值时,会把这个值在内存的地址复制给一个局部变量
    基本数据类型传递参数

    var num=10;
    function addTen(sum){
        sum+=10;
        return sum;
    }
    
    var res=addTen(num);
    alert(num);  //10
    alert(res);  //20
    

    从上面的结果我们知道,num并没有改变,num和sum相当于只是值传递

    引用类型传递参数

    var oo=new Object();
    function setName(obj){
      obj.name="patty";
    }
    setName(oo);
    alert(oo.name);//patty
    

    我们可以看到对象oo也多了一个name属性,说明oo是引用传递
    我们先讲这么多吧,欢迎大家指正错误!!!

    相关文章

      网友评论

        本文标题:JavaScript 数据类型和函数参数传递

        本文链接:https://www.haomeiwen.com/subject/ttyjmxtx.html