js ==号引起的隐性类型转化方法

对于初学者来说,往往会把“==”和“===”弄混,在这里强调一下,双等号不是全等号,全等号是三个等号“===”,本文内容说的是由双等号“==”引起的隐性转换。而在 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: "码云笔记前端博客",
 url:"www.mybj123.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

说了这么多,不知道你学会了吗?附上今天的练习题巩固一下吧。

var a;
console.log(0 == false);//true
console.log(1 == true);//true
console.log(2 == {valueOf: function(){return 2}});//true
console.log(a == NaN);//false
console.log(NaN == NaN);//false
console.log(8 == undefined);//false
console.log(1 == undefined);//false
console.log(2 == {toString: function(){return 2}});//true
console.log(undefined == null);//true
console.log(null == 1);//false
console.log({ toString:function(){ return 1 } , valueOf:function(){ return [] }} == 1);//true
console.log(1=="1");//true
console.log(1==="1");//false

以上就是全部有关 js 隐性类型转换步骤,不知道你是否明白,实在不理解就多看几遍,书读百遍其义自见。

「点点赞赏,手留余香」

3

给作者打赏,鼓励TA抓紧创作!

微信微信 支付宝支付宝

还没有人赞赏,快来当第一个赞赏的人吧!

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。
码云笔记 » js ==号引起的隐性类型转化方法

发表回复