js 中的类型在运行前是无法确定的,我们无法通过变量的定义来区分变量的真实类型,一个变量我们可以随意为其赋值任何类型。
就像我们定义一个变量var value;此时我们真无法确定后面到底会赋值给其如何类型。js的基本类型分undefined,number,boolean,string,object,function.
其中object和function类型又属于引用类型,剩下的那些算值类型。当然js中还有许多派生出来的类型如:Data,Regex或者自己定义的类型它们都算object的子类型。
这里要说明我们通过Number,Boolean,String这些创出来的对象,它们与number,boolean,string是没有关系的,它们可以看做类似其他语言中的装箱。
var num2 = new Number(10);//这时一个object类型
var bool1 = true;//这时一个boolean基本类型
var bool2 = new Boolean(true);//这时一个object类型
js中的隐式存在的类型转换无非两种,值类型转值类型,引用类型转值类型,我们知道引用类型转值类型的时候,会调用valueOf,或许还会调用toString。但是值类型转值类型通常就不需要这么麻烦了。
js中蕴含的隐式转换规则会考虑到运算元,也会考虑到运算符,同样的一个运算符用于不同的地方或许就代表不同的意思,譬如+运算符,当用于一元运算符,代表转换为数值,用于两个数值之间代表相加,用于有字符串的时候代表字符串的连接
alert(v1);//1
alert(typeof v1);//number;
var v2 = +'1';
alert(v2);//1
alert(typeof v2);//number;
var v3 = +'01';
alert(v3);//1
alert(typeof v3);//number;
var v4 = +'09';
alert(v4);//9 注意这边不会按8进制转换
alert(typeof v3);//number;
var v5 = +'x1';
alert(v5);//NaN转换为数字的时候失败
alert(typeof v5);//NaN
当+运算符有一个运算元为字符串时,另外一个 也会隐式转换为字符串
var v2 = {}+'2';//'[object Object]2'
var v3 = true +'2';//'true2';
当出现减号,我们想想都知道肯定会把任何运算元都尝试转换为数字,如果转换失败就返回NaN,true和false转为为数字时为变为1和0,但是返过来0也可以变为false,0以外的任何数字变true
当字符串尝试转换为数字时会尽量让其转换成功 ,不过可不会按照我们常理如果0开头按八进制,0x开头按16禁止,因为这些规则在用与parseInt时才会自动识别
alert(10-'1');//9
alert('010x'-'7');//3
alert('0010'-'07x');//3
alert('12yz'-'6tt');//6
alert('{}'-'3');//NaN
alert(true-1);//0 true转换为1
alert(false-1);//-1 false转为为0
alert(true-false);//1
当用于会产生布尔值的情况下如if,while,||,&&等情况下,除了null,'',0,undefined,NaN会转换为false,其他一律转换为true
if(new Date())//true
if(null)//false
if(undefined)//false
if(0)//false
if(-1)//true