Js 中那些 隐式转换

曾经看到过这样一个代码:  (!(~+[])+{})[--[~+""][+[]]*[~+[]]+~~!+[]]+({}+[])[[~!+[]*~+[]]] = sb , 你敢相信, 当时就吓了 宝宝一跳。javascript

刚接触到时候,Js很让我困惑,正是因为它‘善变’,下面我来总结一下:java

1. JS的数据类型: Number,Boolean,String,Undefined,Null,Symbol(es6新定义的)和 Object (注: Array是特殊的Object)es6

    typeof 返回的7中类型: number boolean string object undefined object function面试

    

 

MDN 这样介绍Javascript: JavaScript 是一种弱类型或者说动态语言。这意味着你不用提早声明变量的类型,在程序运行过程当中,类型会被自动肯定。这也意味着你可使用同一个变量保存不一样类型的数据函数

2. 下面来看下常见的隐式转换:spa

  基本类型对象

   运算符(+,-,*,/,%)操做时 转换类型blog

    ”+“ 号运算符 : ip

           

        

          

      总结: 当加号运算符时,String和其余类型时,其余类型都会转为 String;其余状况,都转化为Number类型 , 注: undefined 转化为Number是 为’NaN‘, 任何Number与NaN相加都为NaN。字符串

          其余运算符时, 基本类型都转换为 Number,String类型的带有字符的好比: '1a' ,'a1' 转化为 NaN 与undefined 同样。

        

      tip:(1)NaN 不与 任何值相等 包括自身,因此判断一个值 是否为 NaN, 即用 "!==" 便可。  

         (2) 转换为 Boolean类型为 false 的有:null,0,'',undefined,NaN,false  

          

        (3)number() 与 parseInt() 均可以将对象转化为Number类型,Number函数要比parseInt函数严格不少。基本上,只要有一个字符没法转成数值,整个字符串就会被转为NaN。

           

  Object类型

    当object与基本类型运算时:

 

var obj = {
	toString: function(){
		return 6;
	},
	valueOf: function(){
		return 5;
	}
};

var obj1 = {
	valueOf: function(){
		return 'a';
	},
	toString: function(){
		return 'b';
	}
};

 

                      

 

                  

 

      

 

      当对 obj,obj1 用Number()和String()换转时

              

      总结: Number类型会先调用valueOf(), String类型会先调用toString(),  若是结果是原始值,则返回原始值,不然继续用toString 或 valueOf(),继续计算,若是结果还不是原始值,则抛出一个类型错误; 

    看以下状况: 

            

        为何 {} + [] = 0 ?  由于 javascript在运行时, 将 第一次{} 认为是空的代码块,因此就至关于 +[] = 0.  还有 {} +5 = 5, 同理。

 

  总结: 刚开始接触的时候,确实很迷惑,记得有次面试,就出的有隐式转换的题,当时那个心情,内心一万个草泥马在那飞。总之,多敲一瞧代码就知道了它的变化了。

相关文章
相关标签/搜索