JavaScript的数据类型分为六种,分别为null,undefined,boolean,string,number,object。object是引用类型,其它的五种是基本类型或者是原始类型。我们可以用typeof方法打印来某个是属于哪个类型的。不同类型的变量比较要先转类型,叫做类型转换,类型转换也叫隐式转换。隐式转换通常发生在运算符加减乘除,等于,还有小于,大于等。。

typeof '11'  //string

typeof(11)  //number

'11' < 4     //false

基本类型的转换

下面先讲加减乘除:

1.字符串加数字,数字就会转成字符串。

2.数字减字符串,字符串转成数字。如果字符串不是纯数字就会转成NaN。字符串减数字也一样。两个字符串相减也先转成数字。

3.乘,除,大于,小于跟减的转换也是一样。

//隐式转换 + - * == /

// +

10 + '20'    //2010

// -

10 - '20'    //-10

10 - 'one'   //NaN

10 - '100a'  //NaN

// *

10*'20'      //200

'10'*'20'    //200

// /

20/'10'      //2

'20'/'10'    //2

'20'/'one'  //NaN

 再来看看一组 == 的。

1.undefined等于null

2.字符串和数字比较时,字符串转数字

3.数字为布尔比较时,布尔转数字

4.字符串和布尔比较时,两者转数字

// ==

undefined == null;    //true

'0' == 0;            //true,字符串转数字

0 == false;           //true,布尔转数字

'0' == false;       //true,两者转数字

null == false;       //false

undefined == false;  //false

引用类型的转换

基本类型间的比较相对简单。引用类型和基本类型的比较就相对复杂一些,先要把引用类型转成基本类型,再按上述的方法比较。引用类型转布尔全是true。比如空数组,只要是对象就是引用类型,所以[]为true。引用类型转数字或者字符串就要用valueOf()或者toString();对象本身就继承了valuOf()和toString(),还可以自定义valueOf()和toString()。根据不同的对象用继承的valueOf()转成字符串,数字或本身,而对象用toString就一定转为字符串。一般对象默认调用valueOf()。

1.对象转数字时,调用valueOf();

2.对象转字符串时,调用toString();

先看看下面的例子:

0 == [];        // true, 0 == [].valueOf(); -> 0 == 0;

'0' == [];      // false, '0' == [].toString(); -> '0' == '';

2 == ['2'];     // true, 2 == ['2'].valueOf(); -> 2 == '2' -> 2 == 2;

'2' == [2];     // true, '2' == [2].toString(); -> '2' =='2';

[] == ![];      //true, [].valueOf() == !Boolean([]) -> 0 == false -> 0 == 0;

对象转成数字时,调用valueOf(),在这之前先调用的是toString();所以我猜valueOf方法是这样的。So上面的例子 0 == []要改成下面更合理。无论如何,[]最后是转成0的。

var valueOf = function (){

    var str = this.toString();    //先调用toString(),转成字符串

    //...

}

0 == [];        // true, 0 == [].valueOf(); -> 0 == '0' -> 0 == 0;

自定义的valueOf()和toString();

1.自定义的valueOf()和toString()都存在,会默认调用valueOf();

2.如果只有toString(),则调用toString();

var a = [1];

a.valueOf = function (){ return 1;}

a.toString = function (){ return '1';}

a + 1;         // 2, valueOf()先调用

去掉valueOf()就会调用toString()。

var a = [1];

a.valueOf = function (){ return 1;}

a.toString = function (){ return '1';}

a + 1;         // 2, 先调用valueOf()

//去掉valueOf

delete a.valueOf;

a + 1;        // '11', 调用toString()

如果返回其它会怎么样呢?

var a = [1];

a.valueOf = function (){return ;}

a.toString = function (){return 1 ;};

1 - a;        //NaN

其它对象 调用valueOf()转成不同的类型:

var a = {};

a.valueOf();    //Object {}

var a = [];

a.valueOf();    //[]    自己本身

var a = new Date();

a.valueOf();    //1423812036234  数字

var a = new RegExp();

a.valueOf();    //    /(?:)/  正则对象

引用类型之间的比较是内存地址的比较,不需要进行隐式转换,这里不多说。

[] == []  //false 地址不一样

var a = [];

b = a;

b == a   //true

显式转换

显式转换比较简单,可以直接用类当作方法直接转换。

Number([]);        //0

String([]);        //''

Boolean([]);       //true

还有更简单的转换方法。

3 + ''    // 字符串'3'

+'3'      // 数字3

!!'3'     // true

js隐式转换的更多相关文章

  1. 再说js隐式转换

    再说js隐式转换 自己整理的一个整体规则如下: Date 默认 走 toString, 如果 toString 返回的是对象, 那么查看 valueOf 其他对象的转换, 默认走 valueOf, 但 ...

  2. 一个有趣的js隐式转换的问题

    一个有趣的js隐式转换的问题 在chrome的控制台中打印一下表达式 [] + {} //结果为 [object object] 然后调整顺序打印 {} + [] //结果为 0 然后将两个表达式组合 ...

  3. js 隐式转换

    1.数字number与字符串string相加的就,最后会得到一个字符串string:'1'+3='13' 2.数字number与字符串string相减,最后会得到一个数字number:'1'-0=1, ...

  4. 深入js隐式类型转换

    前言 相信刚开始了解js的时候,都会遇到 2 =='2',但是 1+'2' == '1'+'2'为false的情况,这时候应该会是一脸懵逼的状态,不得不感慨js弱类型的灵活让人发指,隐式类型转换就是这 ...

  5. JS的隐式转换 从 [] ==false 说起

    前言 最近和大创扯淡时说到了[] == false,从结果上来看我俩都答错了,从气势上来说我俩的歪理都能出书了(恩,程序猿的骄傲),但是这其实背后隐藏了一潭很深的水,对,很深... 隐式类型转换 JS ...

  6. js数据类型隐式转换问题

    js数据类型隐式转换 ![] == false //true 空数组和基本类型转换,会先[].toString() 再继续比较 ![] == [] //true ![] //false [] == [ ...

  7. JS的类型转换,强制转换和隐式转换

    JS的类型转换 1.强制转换 通过String(),Number(),Boolean()函数强制转换 var str=123; var str1='123'; console.log(typeof s ...

  8. js学习日记-隐式转换相关的坑及知识

    隐式转换比较是js中绕不过去的坎,就算有几年经验的工程师也很有可能对这块知识不够熟悉.就算你知道使用===比较从而避免踩坑,但是团队其它成员不一定知道有这样或那样的坑,有后端语言经验的人常常会形成一个 ...

  9. js中的一些隐式转换和总结

    js中的不同的数据类型之间的比较转换规则如下: 1. 对象和布尔值比较 对象和布尔值进行比较时,对象先转换为字符串,然后再转换为数字,布尔值直接转换为数字 [] == true; //false [] ...

随机推荐

  1. 【转】iOS学习之Storyboard中的UIScrollView使用自动布局

    在使用storyboard和xib时,我们经常要用到ScrollView,还有自动布局AutoLayout,但是ScrollView和AutoLayout 结合使用,相对来说有点复杂.根据实践,我说一 ...

  2. SOAPUI使用教程-MockOperations和响应

    如前所述,一个MockService有多个MockOperations其中每个可以包含任意数量的MockResponse消息; 也就是说,一个MockService响应实际上包括若干预设响应之间发生变 ...

  3. 踩坑事件:不能对基于文本的临时表使用sql insert语句

    先来描述一下问题: 如果你是从基于文本的数据源来创建DataFrame的,当你将DataFrame注册为临时表后,如果对这个临时表进行insert into 操作,会抛出异常的. 问题答案参见:htt ...

  4. 扫描内网活跃的ip

    网段内活跃的ip:nmap -sP 10.10.30.0/24|grep for|awk '{print $5}'

  5. html()、text()、val()、innerHTML、value()的区分

    以上的方法可用于一般的html标签(div)与input中分别进行讨论 1.html(): jQuery方法,用于一般标签中,可读写,可以获得写入html标签. 2.text(): jQuery方法, ...

  6. Javascript的shift()和push(),unshift()和pop()方法简介

    栈方法: Javascript为数组专门提供了push()和pop()方法,以便实现类似栈的行为.来看下面的例子: var colors=new Array();       //创建一个数组 var ...

  7. Linux下安装搭建WordPress网站

    WordPress简介 WordPress 是一种使用 PHP语言和 MySQL数据库开发的开源.免费的Blog(博客,网志)引擎,用户可以在支持 PHP 和 MySQL 数据库的服务器上建立自己的 ...

  8. c++代码中,使用svn版本号作为程序版本号的实现方法

    1.编写版本模板文件 #ifndef _VERSIONSVN_H_#define _VERSIONSVN_H_#define VER_REVISIONSVN $WCREV$#endif //!_VER ...

  9. js == 与 === 的区别,‘’与“”的区别

    js == 与 === 的区别 1.对于string,number等基础类型,==和===是有区别的 1)不同类型间比较,==之比较"转化成同一类型后的值"看"值&quo ...

  10. mongodb数据库迁移

    如果遇到权限问题,终极解决办法:关掉权限! 如:assertion: 18 { ok: 0.0, errmsg: "auth failed", code: 18 }等错误