JavaScript的变量是类型松散的,所谓松散类型也就是说变量可以用来保存任何类型的数据,在使用变量和函数参数之前,不会对它们进行比较已确保它们的数据类型正确。
tips:由于JavaScript的变量没有预定类型,这使得变量能够作为数据类型参与运算,JS运算中基本数据类型转换规则为:
1.数字和字符串相加——将数值转为字符串
2.布尔值与字符串相加——将布尔值转为字符串
3.数字与布尔值相加——将布尔值转为数字。
JS有五种基本数据类型:Undefined、Null、Boolean、Number和String,还有一种复杂数据类型Object。
JS是不支持任何创建自定义类型的机制,所有值最终都将是上述6种数据类型之一。
tips:由于JavaScript的变量没有预定类型,这使得变量能够作为数据类型参与运算,JS运算中基本数据类型转换规则为:
1.数字和字符串相加——将数值转为字符串
2.布尔值与字符串相加——将布尔值转为字符串
3.数字与布尔值相加——将布尔值转为数字。
对于上述6种类型的变量,可以利用typeof操作符来检测。
typeof操作符可能返回下列六个字符串:
"undefined"——这个值未定义,对应Undefined类型的变量
"undefined"——这个值是布尔值,对应Boolean类型的变量
"string"——这个值是字符串,对应String类型的变量
"number"——这个值是数值,对应Number类型的变量
"object"——
这个值是对象或null,对应Object类型和Null的变量
"function"——这个值是函数。
在检测5种基本类型时,typeof操作符很有用,但是在检测引用类型的值时,这个操作符就用处不大了。因为任何引用类型用typeof检测都返回"object",但其实我们想知道的是它到底是什么类型的对象。
因此,我们检测引用类型时要用
instanceof操作符。
JS中的引用类型分为:Object类型、Array类型、Date类型、RegExp类型、Function类型、基本包装类型(Boolean、Number、String)、单体内置类型(Global对象、Math对象)
instanceof操作符返回true或false,其语法如下:
result = variable instanceof constructor。
instanceof操作符在编写类型检测代码时十分有用,例如:
总结:大体来说,5种基本类型的值应该使用typeof来检测,而对象(引用类型)的值则应该使用instanceof来检测。
补充一个2015-06-01面试宇宙中心某公司的一个题
当时一道选择题是判断test instanceof Object是true还是false。
可以把Object理解为所有实例的基础类,就像Java中的java.lang.Object对象一样。instanceof识别一个引用类型的实例时,其实是根据它的原型链来识别,在Function类型的原型链中,Object处在上游位置,Function类型的实例也是Object类型的实例。所以test instanceof Object依然是true。
function reverseSort(values){
//只有values参数是Array类型时,才能调用其sort(),reverse()方法,如果不检测的话,传入一个非数组对象就报错了
if(values instanceof Array){
values.sort();
values.reverse();
}
}
总结:大体来说,5种基本类型的值应该使用typeof来检测,而对象(引用类型)的值则应该使用instanceof来检测。
补充一个2015-06-01面试宇宙中心某公司的一个题
function test(){
alert("s");
}
alert (test instanceof Function); //true
alert (test instanceof Object); //true
当时一道选择题是判断test instanceof Object是true还是false。
可以把Object理解为所有实例的基础类,就像Java中的java.lang.Object对象一样。instanceof识别一个引用类型的实例时,其实是根据它的原型链来识别,在Function类型的原型链中,Object处在上游位置,Function类型的实例也是Object类型的实例。所以test instanceof Object依然是true。