为啥要说这个东西?一道面试题就给我去说它的动机。
题如下:
var bool=new布尔(假); 如果(bool) { alert('真的'); 其他}{ alert('错误'); }
<>强运行结果是真的! ! ! 强>
其实啥类型转换啊,操作符优先级啊,这些东西都是最最基本的。犀牛书上有详细的介绍。但我很少去翻犀牛书的前5章…
比如说优先级那块儿,很多书都教育我们,“不用去背诵优先级顺序,不确定的话,加括号就行了。”平常我们写代码时也确实这么做的。
但现实是啥呢?面试时会出这种题,让你来做……真不知道这种题的意义是啥…
抱怨到此为止,本文尝试来解决类型转换问题,争取把《JS权威指南》49页那个表背下来。
<强>都有哪些东西是假值吗? 强>
共6个:
0或+ 0,0,NaN ”“ 假 未定义的 空
上面的顺序是按照基本类型来排列的。
除此之外的一律不是! !哪怕是如下形式:
∞ “0”、“假”,“(空格字符) 任何引用类型:[],{}、功能(){}
<强>如果(,,b)的正确理解方式是强>:一个,,b进行表达式求值后,然后再转换为布尔类型。
,,是种短路语法,求值后不一定是个布尔类型,更不是两边转化布尔值再运算。
比如2,和3的结果是3,不是真的。
如果(所以,,b),我们平常理解的那种,“如果a和b同时为真的话”,是一种错误的描述方式。
<强>其他基本类型转化为字符串>强,基本和预期的一样:
控制台。日志(" +零);//傲恪? 控制台。日志(" +未定义);//岸ㄒ濉? 控制台。日志(" +假);//癴alse” 控制台。日志(" +真实);//皌rue” 控制台。日志(" + 0);//?” 控制台。日志(" +南);//癗aN” 控制台。日志(" +∞);//啊蕖?/pre><强>其他基本类型转化为数字>强,需要特殊记忆:
console.log(+零);//0 console.log(+未定义);//南 console.log(+假);//0 真正console.log (+);//1 console.log (+ " ");//0 console.log (+ 1);//1 console.log (+ 1 x);//南其中空,空字符是0,未定义的是南。
以上,基本类型转换都说明白了。
<强>引用类型转换为布尔,始终为真正的强>
<强>引用类型转换为字符串强>
1。优先调用toString方法(如果有),看其返回结果是否是原始类型,如果是,转化为字符串,返回。
2。否,则调用的方法(如果有),看其返回结果是否是原始类型,如果是,转化为字符串,返回。
3。其他报的错。
<强>引用类型转化为数字强>
1。优先调用的方法(如果有),看其返回结果是否是基本类型,如果是,转化为数字,返回。
2。否,则调用toString方法(如果有),看其返回结果是否是基本类型,如果是,转化为数字,返回。
3。其他报的错。
首先我们看看常见引用类型toString和返回对象的值返回什么?
var={}; console.dir (a.toString ());//岸韵蠖韵蟆? console.dir (a.valueOf ());//对象本身 var b=(1、2、3); console.dir (b.toString ());//?、2、3” console.dir (b.valueOf ());//对象本身 var c=[[1], [2]]; console.dir (c.toString ());//?、2” console.dir (c.valueOf ());//对象本身 var d=function(){2}返回; console.dir (d.toString ());//函数(){2}返回” console.dir (d.valueOf ());//对象本身因此对应的转换为字符串和数字的情形是:
var={}; 控制台。dir (a + " ");//岸韵蠖韵蟆? console.dir (+);//南 var b=(1、2、3); 控制台。dir (b + " ");//?、2、3” console.dir (+ b);//南 var c=[[1], [2]]; 控制台。dir (c + " ");//?、2” console.dir (+ c);//南 var d=function(){2}返回; 控制台。dir (d + " ");//函数(){2}返回” console.dir (+ d);//南再来个报错的情形:
var={}; 一个。toString=function(){返回{};} 控制台。日志(" +);//报错 console.log(+)//报错一篇文章搞定JavaScript类型转换(面试常见)