从 = , == 与 === 说起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"]