代码改变世界

从 = , == 与 === 说起JS类型比较

2012-04-09 21:03  刘联东  阅读(267)  评论(0编辑  收藏  举报
=和 ==与===的区别

不用说 =是赋值操作符,由于js是弱类型语言,因此在赋值的过程中不会将右值自动类型检查或类型转化。而是直接改变左边变量名的引用地址。==与===都能够进行数值相等的比较,但是它们之间的差异还是挺大的...

1. 是因为===的效率比==要高, 这是因为===不会进行类型的转换,而==会先对右变量进行类型转化。

2. 因为 ==会进行类型转化,因此,以下类型的值是等价的

  空型等价  undefined  = null = NaN

  零值等价  0 = false = "" = []

3. 类型转化进行比较

 Object => String

 Array => String <= Number

 a. 字符串与数字的自动比较 4 == "4" 字符自动等同于数值

 b. 数组、数值、对象等与字符串比较都会先序列化为字符串再做比较

      "3,4,5" == [3,4,5]

       {toString: function(){return this.name;},name:"cc"} == "cc"

c. Boolean 类型与任何类型比较都不做类型转化,但是使用组合逻辑的时候会对非boolean类型的变量进行布尔化分析

d. 不同类型比较时可以通过序列化再进行比较

    var sap = {toString: function(){return this.id;},id:"23"}

    sap ==  23

e.  判断逻辑

 在 if(variable){}或 variable ? x:y 等逻辑运算中所有的空与零值都判断为false。其它情况都为true

var a = xtype;

a ?  true : false

当 xtype 为 0, false, "",  null, undefine, NaN 时结果都为false。其它时候都为true。注意虽然 ([] ==false == 0 =="" )为true,但是[]?的结果为true

  

f . 不同类型中的组合逻辑运算

   经常看到这样的代码

  evt = evt || window.event

  但是 evt 的类型并不是boolean 类型。

 不要再 || 与 && 运算符看作是组合逻辑运算符。它们就是类似if,?类似的程序结构控制符号,他的语义是

a || b 等同于 if(!a ){b},

a && b 等同于 if(a){b}

a和b 可以是一个迭代定义的程序端

a || b || c && d || c

注意语句返回的结果是最后判断为true或者最末位执行的结果

 var a = "string" && 1001 && true && [1,2,3,4];

 a => [1,2,3,4]

var b = "" || true && 1234 || [1,2,3,4]

 b => 1234

利用组合逻辑运算符还可以进行计算优化

原理是 || 运算符只要第一个结果为true就不会执行后面的代码

var b = (b>1)? b: 5; 可以写成  (b>1) || b =5

另外就是在异常处理中使用

someExution()  || Error();

 

f . 类型转化技巧

  •     任何对象直接+字符串""即可实现序列化为字符串,

  •    序列化的本质是调用内置的或自定义的tostring()方法

  •    字符串转化为数值的方法, 高效的方式是 0^""。 因为^只有在Number类型中定义,所以会自动将相关变量转化为数值

          同理,* ,/等操作也可以实现这些目的,但是要找到相关幺元数值。而+操作只会将变量转化为字符串。

          parseInt, parseFloat方法也可以实现变量转化。

  •    将字符串转化为其它类型的方法

var myVar   ="3.14159",
   [str ]    =""+ myVar,//  转为字符串
   [int]     = ~~myVar, //  转为整数
   [float]   = 1*myVar, //  转为浮点数
   [bool ]   = !!myVar, /*  转为布尔值- 任何非空的字符串和非零的数值都为true*/

[array]   = [myVar]; //  转为数组,注意是创建一个新的数组并存入该字符串

   将数组拼接为字符串 [2,3,4].join(",") 得到的是 "2,3,4"

   将字符串分割为数组 "2,3,4".split(',') 得到的是  ["2","3","4"]

 

联动 互联互动