JavaScript数据类型
弱类型特征
32+32 // 64 加号加法运算
‘32’+32 // ‘3232’加号字符串拼接
‘32’- 32 // 0 减号减法运算
类型
原始类型
number
string
boolean
null
undefined
对象类型
object :function arrat date
总结:javascript 有6种数据类型 5种原始类型 1种对象类型。
隐式转换
等于 ==
'1.23' == 1.23 //true
0 == false //true
[] == false //true
[] == 0 //true
null == undefined //true
new Object() == new Object() //false 地址不一样
[1,2] == [1,2] //fasle 地址不一样
等于== 的类型转换
null == undefind
number == string //string 转 number
boolean == ? // ?转number 1 == true
object == number | string // 对象转为基本类型
严格等于 === 用于类型比较
null === null //true
undefind === undefind //true
NaN === NaN //false
new Object() === new Object() //false 地址不一样
总结:
类型相同,用 ===
类型不同,尝试类型转换和比较(转为number或者基本数据类型)。
包装对象
原始类型:string 包装类型:String
原始类型:number 包装类型:Number
原始类型:boolean 包装类型 Boolean
var str = "string"; //undefined
var strObj = new String("string"); //undefined
str == strObj //true
strObj //String?{"string"}
str //"string"
基本类型尝试以对象方式使用,
JavaScript会很智能的基本类型转为对应的包装类型对象。
操作完后,零时对象会被销毁掉。
类型检测
检测方法
typeof
instanceof
Object.prototype.toString
constructor
duck type
typeof
用法:函数对象和基本类型判断
特殊:
typeof NaN //number
typeof null //object
其它类型 //object
instanceof
用法:基于原型链,只能判断被包装对象创建过的,比如Date
特殊:
obj instanceof Object
不同window 或者 不同iframe的对象检测不能用instanceof
Object.prototype.toString
Object.prototype.toString.apply([]); === '[Object Array]'
Object.prototype.toString.apply(null); === "[object Null]"
Object.prototype.toString.apply(NaN); ==="[object Number]"
Object.prototype.toSting(undefined)
//VM1075:1 Uncaught TypeError: Object.prototype.toSting is not a function at <anonymous>:1:18
注意:不能判断funcation Date
IE 6 7 8 null --> object null最好用 ===
constructor
基于原型链,可能会被改写
总结:
typeof
适合基本类型及Function检测,遇到null失效。
Object.prototype.toString
适合内置对象和基本数据类型,遇到null和undefined失效。
intanceof
适合自定义对象,可以用于检测原生对象,在不同window iframe失效。
使用场景
1 判断空
null === null
typeof undefined === "undefined" 或者 undefined === undefined
"" === ""
2 判断数组
bject.prototype.toString.apply([]); === '[Object Array]'