一、六钟数据类型(js:弱类型特性)
五种原始类型:
1.number
2.string
3.boolean
4.null
5.undefined
一种对象类型:
object(对象)--包括:Function,Array,Date等
二、隐式转换("==="和"==")
1."==="
首先判断等号两侧的类型,若类型不同,直接返回false
若类型相同,对于特殊的几个类型:
null===null
undefined===undefined
NaN!=NaN //NaN和任何东西都不相等
new Object!=new Object //对象比较的是引用(地址),不是值
2."=="
若类型相同,同1,正常比较
若类型不同(对应等号两侧的两种类型的变量作比较):
null==undefined
number==string //1=="1.0" true
boolean==? //先把boolean值转化为number(0或1),再与等号右侧的值比较
object==number或string //将对象类型转化为基本类型(如果可以),再作比较
三、包装对象(number,string,boolean具有包装类型)
eg:
var str = "string";//str--string类型
alert(str.length);//可以得到长度为6
str.t=10;//给str添加t属性,并赋值为10
alert(str.t);//str.t--undefined类型(正常应该是number类型,因为赋值为10)
注:
str.length和str.t时,js自动将str转化为对应的包装类的对象,相当于new了一个String的临时对象,并赋值为str的值。但是,赋值过后,临时对象即被销毁,因此,str.t=10后,str.t类型为undefined。
四、类型检测
1.typeof(适合基本类型及function检测)
eg:
typeof 100 //number
typeof function //function
typeof [1,2] //object
typeof date //object
typeof new Object //object
typeof NaN //number(特殊的number类型)
typeof null //object !!特殊,注意
typeof undefined //undefined
2.instanceof(判断对象类型,基于原型链判断的操作符)
obj instanceof Object
obj:一个对象(若不是,直接返回false),Object是一个函数对象(或函数构造器,若不是,抛出typeError异常)
eg:
[1,2] instanceof Array === true
new Object() instanceof Array === false
注:
不同window或iframe间的对象检测不能用instanceof!
3.Object.prototype.toString(一个方法,用来判断类型)
eg:
Object.prototype.toString.apply([]);==="[Object Array]";
Object.prototype.toString.apply(function(){});==="[Object Function]";
Object.prototype.toString.apply(null);==="[Object Null]"; //IE6,7,8,返回的还是Object(null的历史问题)
4.其他(constructor,duck type)
任何一个对象都有一个constructor属性,用来继承自己的原型
(Student.prototype.constructor = Student)
duck type:通过对象是否具有某种特征,来判断该对象的类型(如:数组具有长度特征)
附:
深入分析constructor和prototype:
(1)prototype
我们在定义函数的时候,函数本身就会默认有一个prototype的属性,而如果我们用new 运算符来生成一个对象的时候就没有prototype属性。
例如:
function a(c){
this.b = c;
this.d =function(){
alert(this.b);
}
}
var obj = new a('test');
alert(typeof obj.prototype);//undefine
alert(typeof a.prototype);//object
其中:a.prototype是object类型,可以理解为,a.prototype又是一个对象。
而a.prototype包含了两个属性(对象都有这两个属性,但new生成的对象没有prototype属性):
一个是constructor,一个是_proto_。
这个constructor,就是我们的构造函数a。
那么__proto__ 是什么呢?这个就涉及到了原型链的概念:
每个对象都会在其内部初始化一个属性,就是__proto__,当我们访问一个对象的属性时,如果这个对象内部 不存在这个属性,那么他就会去__proto__里找这个属性,这个__proto__又会有自己的__proto__,于是就这 样一直找下去。
本例中,obj.__proto__ = a.prototype