由于工作的需要,在网上查了一些关于JavaScript的资料,其中还牵扯到了JavaScript中的类型,平时用JavaScript编码是都是var 然后变量名=变量值,今天对JavaScript中的类型进行了解,才豁然开朗,感觉到基础很重要。
JavaScript中和java一样也分为原始类型(也有人称为基本类型)和引用类型。本篇文章主要是参考了一下两篇文章http://www.w3school.com.cn/js/pro_js_primitivetypes.asp和http://www.w3school.com.cn/js/pro_js_referencetypes.asp并进行了总结。
基础好的可以去直接去看这两篇参考文章。
原始类型
JavaScript中的原始类型包括:Undefined、Null、Boolean、Number和String。
Undefined
- Undefined类型的值只有一个,即undefined。
- 如果变量声明未初始化,该变量的值是undefined。例如:
var toTemp; console.log(toTemp == undefined);//=>true
- 当函数没有返回值是,返回的值是undefined。例如:
var toTemp; console.log(toTemp == undefined);//=>true
- 有一点需要注意:对一个变量调用typeof,返回的结果是 'undefined'说明存在两种情况:(1)该变量声明未初始化 (2)该变量未定义。例如:
上面代码输出的结果都是undefined,即使toTemp1是未定义的。只有在未定义的变量上调用typeof才不会出错,其它的运算符都会出错,提示 ”变量未定义“。一般我们在开发是都会给定义的变量显示的赋初始值,比如var str; 变量是需要存储字符串的,我们会这么写var str = “”;,这样的话我们可以在变量被使用之前,在变量上调用typeof运算符来检查变量是否已经定义。代码如下:var toTemp; console.log(typeof toTemp); //=>undefined console.log(typeof toTemp1);//=>undefined
function check(){ if(typeof toTemp == 'undefined'){ console.log("toTemp未定义."); }else{ console.log("toTemp:", toTemp); } }; check();
Null
- Null类型的值也只有一个,即null。
- undefined实际上是从值null派生过来的。所 undefined == null 返回的结果是true。
Boolean类型
- Number类型有两个值true和fasle。也可以用0表示false,1表示true;例如:
var temp1=0; var temp2=false; console.log(temp1 == temp2);//=>true
Number类型
说到Number就要说一下特殊的Number类型:
- Number.MAX_VALUE和Number.MIN_VALUE
两者表示了Nuber类型的边界,最大不能大于前者,最小不能小于后者。所有的JavaScript数值都应该在这两个数值之间。不过计算记过可以不再找个范围内。 - 无穷大的数(Infinity)
如果数值超过来Number.MAX_VALUE和Number.MIN_VALUE边界,会产生一个无穷大的数,y意味着不在有数值,无穷大的数是不能参加计算的。例如:
结果是个无穷大的数。console.log(isFinite( Number.MAX_VALUE*10 ));
- NaN(Not a Number)
NaN表示非数字,也是一个特殊Number类型。一般来说,发生这种情况是发生在类型转换是。比如将一个"ABC"转换成数组。parseInt("ABC");=>NaN。我们也可以通过isNaN()函数来监测一个数组是否是非数字。例如:
console.log( isNaN( parseInt("ABC") ) );//=>true
String类型
- String类型是唯一一个没有固定大小的原始类型。
- 字符串中的每个字符都有特定的位置,首字符从0开始,第二个字符位置是1,依次类推。
- 单引号('')和双引号("")都可以表示一个字符串字面量。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中的属性和方法,就可以更好的理解其它对象。这里会讲解图片中红圈中的内容。
- constructor(属性)
对创建此对象函数的引用。说的在白点就是这个对象是根据那个函数创建的,constructor就指向那个函数。例如:
上面代码说明array对象是根据Array创建的。var array = new Array(); console.log(array.constructor == Array); //=>true
- prototype(属性)
对象的原型对象的引用。JavaScript实现继承的核心属性。prototype的值是一个对象,对象会继承原型上的所有属性和方法。例如:
上面代码中User的原型(User.prototype)指向一个包含print函数的对象,当我们使用new创建一个User类实例user,user这个实例就可以调用print()函数。由于我们使用一个对象对直接覆盖User.prototype原型对象,也同时覆盖了原型对象的constructor属性,所有这里又显示的将constructor的值指向回了User函数。如果我们是增量形式向User.prototype中添加属性和方法,就不用显示的指定constructor的值为User(默认就是指向User)。这里在延伸一个知识点:User.prototype指向的是一个对象,该对向也有原型对象,以此类推,一直到原型对象指向Object,形成了一个链,我们叫做原型链。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();
- hasOwnProperty(property)
此方法用于判断对象是否有某个特定的属性。property的值必须是个字符串。注意:此方法在对象本身寻找是否有指定的属性,并不去原型对象中寻找指定的属性。例如:
如果想即在对象本身和原型对象上查找此属性,使用 in 即可。user.hasOwnProperty("name");//name 是对象本身就有的,不是继承而来的 true user.hasOwnProperty("print");//print 是继承自原型对象的 false
- isPrototypeOf(object)
此方法判断一个对象是否在另一个对象原型上(原型链中包含此对象)。例如:
User.prototype.isPrototypeOf( user ) true Object.prototype.isPrototypeOf( user ) true Array.prototype.isPrototypeOf( user ) false
- propertyIsEnumerable(property)
此方法判断指定的属性是否是对象的一部分以及是否是可以枚举的(用for..in遍历对象属性)。只要同时满足这两个条件此方法会返回true,否则返回false。一般自定义属性都是可以枚举的,对象中JavaScript内置的属性是不可枚举的。有一些属性可以用for..in枚举,但是他们不是对象自有的,而是从原型对象继承来的,也会返回false。例如:
注意:此方法有点类似于hasOwnProperty(),hasOwnproperty()仅判断对象本身是否包含指定的属性,并不判断属性是否可以用for..in枚举。例如:user.propertyIsEnumerable("name");//自定义属性并且是对象本身自有的 true user.propertyIsEnumerable("print");//自定义属性,但是是从原型中继承而来的 false Object.prototype.propertyIsEnumerable("toString");//对象本身就有的,但是JavaScript的内置属性 false
我们在延伸一下。怎么用for..in变量对象的自有属性,但是不包括继承而来的属性。实现如下:Object.prototype.propertyIsEnumerable("toString") false Object.prototype.hasOwnProperty("toString") true
for(var p in user){ if(user.hasOwnProperty(p)){ console.log(p); } } name age
- toString()
如果没有覆盖Object.prototype中的的toString(),默认是输出 "[object Object]"。例如:
user.toString() "[object Object]"
- valueOf()
如果没有覆盖Object.prototype中的valueOf(),默认输出对象本身。例如:
user.valueOf() == user true
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对象。有兴趣的同学可以参考那两篇资料。