曾经看到过这样一个代码: (!(~+[])+{})[--[~+""][+[]]*[~+[]]+~~!+[]]+({}+[])[[~!+[]*~+[]]] = 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, 同理。
总结: 刚开始接触的时候,确实很迷惑,记得有次面试,就出的有隐式转换的题,当时那个心情,内心一万个草泥马在那飞。总之,多敲一瞧代码就知道了它的变化了。