JavaScript 中的类型

由于工作的需要,在网上查了一些关于JavaScript的资料,其中还牵扯到了JavaScript中的类型,平时用JavaScript编码是都是var 然后变量名=变量值,今天对JavaScript中的类型进行了解,才豁然开朗,感觉到基础很重要。

JavaScript中和java一样也分为原始类型(也有人称为基本类型)和引用类型。本篇文章主要是参考了一下两篇文章http://www.w3school.com.cn/js/pro_js_primitivetypes.asphttp://www.w3school.com.cn/js/pro_js_referencetypes.asp并进行了总结。
基础好的可以去直接去看这两篇参考文章。

原始类型

JavaScript中的原始类型包括:Undefined、Null、Boolean、Number和String。

Undefined

  1. Undefined类型的值只有一个,即undefined。
  2. 如果变量声明未初始化,该变量的值是undefined。例如:
    var toTemp;
    console.log(toTemp == undefined);//=>true
  3. 当函数没有返回值是,返回的值是undefined。例如:
    var toTemp;
    console.log(toTemp == undefined);//=>true
  4. 有一点需要注意:对一个变量调用typeof,返回的结果是 'undefined'说明存在两种情况:(1)该变量声明未初始化 (2)该变量未定义。例如:
    var toTemp;
    console.log(typeof toTemp); //=>undefined
    console.log(typeof toTemp1);//=>undefined
    上面代码输出的结果都是undefined,即使toTemp1是未定义的。只有在未定义的变量上调用typeof才不会出错,其它的运算符都会出错,提示 ”变量未定义“。一般我们在开发是都会给定义的变量显示的赋初始值,比如var str; 变量是需要存储字符串的,我们会这么写var str = “”;,这样的话我们可以在变量被使用之前,在变量上调用typeof运算符来检查变量是否已经定义。代码如下:
    function check(){
        if(typeof toTemp == 'undefined'){
            console.log("toTemp未定义.");
        }else{
            console.log("toTemp:", toTemp);
        }
    };
    check();
    

Null

  1. Null类型的值也只有一个,即null。
  2. undefined实际上是从值null派生过来的。所 undefined == null 返回的结果是true。

Boolean类型

  1. Number类型有两个值true和fasle。也可以用0表示false,1表示true;例如:
    var temp1=0;
    var temp2=false;
    console.log(temp1 == temp2);//=>true

Number类型

说到Number就要说一下特殊的Number类型:

  1. Number.MAX_VALUE和Number.MIN_VALUE
    两者表示了Nuber类型的边界,最大不能大于前者,最小不能小于后者。所有的JavaScript数值都应该在这两个数值之间。不过计算记过可以不再找个范围内。
  2. 无穷大的数(Infinity)
    如果数值超过来Number.MAX_VALUE和Number.MIN_VALUE边界,会产生一个无穷大的数,y意味着不在有数值,无穷大的数是不能参加计算的。例如:
    console.log(isFinite( Number.MAX_VALUE*10 ));
    结果是个无穷大的数。
  3. NaN(Not a Number)
    NaN表示非数字,也是一个特殊Number类型。一般来说,发生这种情况是发生在类型转换是。比如将一个"ABC"转换成数组。parseInt("ABC");=>NaN。我们也可以通过isNaN()函数来监测一个数组是否是非数字。例如:
    console.log( isNaN( parseInt("ABC") ) );//=>true

String类型

  1. String类型是唯一一个没有固定大小的原始类型。
  2. 字符串中的每个字符都有特定的位置,首字符从0开始,第二个字符位置是1,依次类推。
  3. 单引号('')和双引号("")都可以表示一个字符串字面量。JavaScript中是没有字符类型的。比如:我们声明的字符串中带有双引号,可以有两种写法,如下:
    var strHtml = "<button name=\"butName\"></button>";
    var strHtml = '<button name="butName"></button>';



引用类型

引用类型通常也叫做类(Class)。JavaScript中有些内置的引用类型(Object、Array、Boolean、Number、String)。我们也可以自定义引用类型。 自定义引用类型如下:
function User(name, age){
    this.name = name;
    this.age = age;
}

var user = new User("zxy", 26);
console.log(user.name);//=>zxy
console.log(user.age);//=>26
本章节"应用类型"主要讨论的是JavaScript中内置的引用类型。从传统意义上来说,JavaScript中并不是真正具有类(不像Java有专门的class关键字去定义类)。JavaScript中可以定义对象,在逻辑中对象是等价于其它语言中的Class。

Object

Object类似于java中的Object。JavaScript中的所有对象都继承自Obect对象,所以理解了Object中的属性和方法,就可以更好的理解其它对象。这里会讲解图片中红圈中的内容。

  1. constructor(属性)
    对创建此对象函数的引用。说的在白点就是这个对象是根据那个函数创建的,constructor就指向那个函数。例如:
    var array = new Array();
    console.log(array.constructor == Array); //=>true
    上面代码说明array对象是根据Array创建的。
  2. prototype(属性)
    对象的原型对象的引用。JavaScript实现继承的核心属性。prototype的值是一个对象,对象会继承原型上的所有属性和方法。例如:
    function User(name, age){
        this.name = name;
        this.age = age;
    }
    User.prototype = {
        constructor:User
        ,print: function(){
            console.log("name:",this.name,"    age:",this.age);
        }
    }
    
    var user = new User("zxy", 26);
    user.print();
    上面代码中User的原型(User.prototype)指向一个包含print函数的对象,当我们使用new创建一个User类实例user,user这个实例就可以调用print()函数。由于我们使用一个对象对直接覆盖User.prototype原型对象,也同时覆盖了原型对象的constructor属性,所有这里又显示的将constructor的值指向回了User函数。如果我们是增量形式向User.prototype中添加属性和方法,就不用显示的指定constructor的值为User(默认就是指向User)。这里在延伸一个知识点:User.prototype指向的是一个对象,该对向也有原型对象,以此类推,一直到原型对象指向Object,形成了一个链,我们叫做原型链。
  3. hasOwnProperty(property)
    此方法用于判断对象是否有某个特定的属性。property的值必须是个字符串。注意:此方法在对象本身寻找是否有指定的属性,并不去原型对象中寻找指定的属性。例如:
    user.hasOwnProperty("name");//name 是对象本身就有的,不是继承而来的
    true
    user.hasOwnProperty("print");//print 是继承自原型对象的
    false
    如果想即在对象本身和原型对象上查找此属性,使用 in 即可。
  4. isPrototypeOf(object)
    此方法判断一个对象是否在另一个对象原型上(原型链中包含此对象)。例如:
    User.prototype.isPrototypeOf( user )
    true
    Object.prototype.isPrototypeOf( user )
    true
    Array.prototype.isPrototypeOf( user )
    false
  5. propertyIsEnumerable(property)
    此方法判断指定的属性是否是对象的一部分以及是否是可以枚举的(用for..in遍历对象属性)。只要同时满足这两个条件此方法会返回true,否则返回false。一般自定义属性都是可以枚举的,对象中JavaScript内置的属性是不可枚举的。有一些属性可以用for..in枚举,但是他们不是对象自有的,而是从原型对象继承来的,也会返回false。例如:
    user.propertyIsEnumerable("name");//自定义属性并且是对象本身自有的
    true
    user.propertyIsEnumerable("print");//自定义属性,但是是从原型中继承而来的
    false
    Object.prototype.propertyIsEnumerable("toString");//对象本身就有的,但是JavaScript的内置属性
    false
    注意:此方法有点类似于hasOwnProperty(),hasOwnproperty()仅判断对象本身是否包含指定的属性,并不判断属性是否可以用for..in枚举。例如:
    Object.prototype.propertyIsEnumerable("toString")
    false
    Object.prototype.hasOwnProperty("toString")
    true
    我们在延伸一下。怎么用for..in变量对象的自有属性,但是不包括继承而来的属性。实现如下:
    for(var p in user){ 
      if(user.hasOwnProperty(p)){
         console.log(p);
      }
    }
    name
    age
  6. toString()
    如果没有覆盖Object.prototype中的的toString(),默认是输出 "[object Object]"。例如:
    user.toString()
    "[object Object]"
  7. valueOf()
    如果没有覆盖Object.prototype中的valueOf(),默认输出对象本身。例如:
    user.valueOf() == user
    true

一般Object.prototype中的方法都在JavaScript中的内置对象给覆盖了。自定义的对象也可以根据需要覆盖Object.prototype中的属性和方法。例如:
function User(name, age){
    this.name = name;
    this.age = age;
}
User.prototype = {
    constructor:User
    ,print: function(){
        console.log("name:",this.name,"    age:",this.age);
    }
    ,toString: function(){
        console.log(this.name,",",this.age);
    }
}

var user = new User("zxy", 26);
console.log(user+"");

其它几个内置对象属性和方法有点多,我自己都是现用现查API的,但是Object对象的方法和属性一定要所有了解。这里就不再继续介绍Array、Boolean、Number、String对象。有兴趣的同学可以参考那两篇资料。


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值