HTML5开发爱心鱼游戏系列第一部分、js深入浅出(第一章)
js有5种原始类型,一种对象类型。
1、3 js隐式转换
数字字符串加上数字,数字就会自动转换成字符串,数字字符串减数字,数字字符串就会转换成数字。
有个小技巧,数字字符串想要变成一个数字,就可以减去0,数字想要变成字符串,就可以加上一个空字符串。
双等的时候,也会进行强制类型转化。
三等就是完全等于,对象比较的时候,不是值去比较,因为是引用类型。这时候对象新定义的两个对象[1,2]和[1,2] 是不相等的。同样是两个空对象, 直接也不会完全相等。
number、string、boolean 虽然是原始类型,但是有对应的包装对象。
比如定义string为一个基本类型,strObj值为string的包装对象。
str这时候是一个基本类型,不应该有属性,但是str.length 却会返回6。str.t = 10,可以正常赋值。但是输出str.t时候,却是undefined。因为js有一个机制,当一个基本类型,以对象的方式访问它的时候,比如访问length,js会把它转换成对应的包装类型对象。相当于new了一个string,值是一样的。当a.length 返回之后,这个临时对象会被销毁掉。所以
同样,number和boolean类型也是一样的。
typeof适合基本类型和函数的判断:
注意一下undefined和NaN返回的类型,这两个是经常容易忽略的。
历史原因。typeof对于判断数组和对象无法区分。typeof对于判断非对象的类型效果是不错的,但是对于判断对象,数组,就懵逼了。“老虎,老鼠傻傻分不清楚”,那么怎么判断对象、数组、函数呢?
instanceof 基于原型链去判断。obj instanceof Object 期望左边是对象,否则,如1,2,3直接返回false。右边是函数构造器,否则,抛出type error。
基本原理,会判断obj的原型链上,是否有右边构造函数的prototype属性。
注意一下,不同的window或者iframe之间的对象类型检测,不能用instanceof。
typeof适合基本类型和function,但是对object,array检测都不行。