一篇文章搞定JavaScript类型转换(面试常见)

  

为啥要说这个东西?一道面试题就给我去说它的动机。

  

题如下:

        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类型转换(面试常见)