JavaScript 中由 == 判断所引起的转换会引发解释器的一些列执行步骤, 接下来我们就来详解 JavaScript 中双等号引起的隐性类型转换, 需要的朋友可以参考下
Javascript 是一种由 Netscape 的 LiveScript 发展而来的原型化继承的基于对象的动态类型的区分大小写的客户端脚本语言,主要目的是为了解决服务器端语言,比如 Perl,遗留的速度问题,为客户提供更流畅的浏览效果。
引子
if 语句应该是程序员用的比较多的语句,很多时候都要进行 if 判断,if 语句一般用双等号来判断前后两个元素是否是一致的,假如是一致,那么返回是 true,然后执行下面的语句,否则,执行别的语句。本文所说的隐性类型的转换,说的是 == 引起的转换。举个简单的例子,双等号不是全等号,全等号是 "===" 三个等号,语句 "1"==1,那么一般情况下是前面的字符串 "1" 转换为数字 1,然后进行比较。通过这个例子应该了解了什么是隐性类型的转换了吧!
隐性类型转换步骤
一、首先看双等号前后有没有 NaN,如果存在 NaN,一律返回 false。
二、再看双等号前后有没有布尔,有布尔就将布尔转换为数字。(false 是 0,true 是 1)
三、接着看双等号前后有没有字符串, 有三种情况:
1、对方是对象,对象使用 toString() 或者 valueOf() 进行转换;
2、对方是数字,字符串转数字;(前面已经举例)
3、对方是字符串,直接比较;
4、其他返回 false
四、如果是数字,对方是对象,对象取 valueOf() 或者 toString() 进行比较, 其他一律返回 false
五、null, undefined 不会进行类型转换, 但它们俩相等
上面的转换顺序一定要牢记,面试的时候,经常会出现类型的问题。
.toString() 方法和. valueOf() 方法数值转换
通常情况下我们认为,将一个对象转换为字符串要调用 toString() 方法,转换为数字要调用 valueOf() 方法,但是真正应用的时候并没有这么简单,看如下代码实例:
- var obj = {
- webName: "haorooms前端博客",
- url:"www.phperz.com"
- }
- console.log(obj.toString()); //[object Object]
同理,我们再看 valueOf() 方法:
- var arr = [1, 2, 3];
- console.log(arr.valueOf());//[1, 2, 3]
从上面的代码可以看出,valueOf() 方法并没有将对象转换为能够反映此对象的一个数字。相反,我们用 toString()
- var arr = [1, 2, 3];
- console.log(arr.toString());//1,2,3
注:很多朋友认为,转换为字符串首先要调用 toString() 方法, 其实这是错误的认识,我们应该这么理解,调用 toString() 方法可以转换为字符串,但不一定转换字符串就是首先调用 toString() 方法。
我们看下下面代码:
- var arr = {};
- arr.valueOf = function() {
- return 1;
- }
- arr.toString = function() {
- return 2;
- }
- console.log(arr == 1); //true
- var arr = {};
- arr.valueOf = function() {
- return [];
- }
- arr.toString = function() {
- return 1;
- }
- console.log(arr == 1); //true
上面代码我们可以看出,转换首先调用的是 valueOf(),假如 valueOf() 不是数值,那就会调用 toString 进行转换!
- var arr = {};
- arr.valueOf = function() {
- return "1";
- }
- arr.toString = function() {
- return "2";
- }
- console.log(arr == "1"); //true
假如 "1" 是字符串,那么它首先调用的还是 valueOf()。
- var arr = [2];
- console.log(arr + "1");//21
上面的例子,调用的是 toString(); 因为 arr.toString()之后是 2。
转换过程是这样的,首先 arr 会首先调用 valueOf() 方法,但是数字的此方法是简单继承而来,并没有重写(当然这个重写不是我们实现),返回值是数组对象本身,并不是一个值类型,所以就转而调用 toString() 方法,于是就实现了转换为字符串的目的。
小结
大多数对象隐式转换为值类型都是首先尝试调用 valueOf() 方法。但是 Date 对象是个例外,此对象的 valueOf() 和 toString() 方法都经过精心重写,默认是调用 toString() 方法,比如使用 + 运算符,如果在其他算数运算环境中,则会转而调用 valueOf() 方法。
- var date = new Date();
- console.log(date + "1"); //Sun Apr 17 2014 17:54:48 GMT+0800 (CST)1
- console.log(date + 1);//Sun Apr 17 2014 17:54:48 GMT+0800 (CST)1
- console.log(date - 1);//1460886888556
- console.log(date * 1);//1460886888557
来源: http://www.phperz.com/article/17/0301/265302.html