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. Android -- 自动完成文本框(可以匹配多个值,并以,结尾)

    1. 

  2. Android -- 启动另外一个Activity的方式(2s自动启动)

    1.  使用Handler  并且可以设置进入和退出的动画效果 Class < ? > activityClass; Class [ ] paramTypes = { Integer.TY ...

  3. 在Lingo中输入矩阵(通过Excel)

    举例说明:我要将'C:\Users\Lenovo\Desktop\lingodata.xlsx'里的数据导入lingo1.左键拖动选中'C:\Users\Lenovo\Desktop\lingodat ...

  4. So many many foods here!

    水果类(fruits):西红柿 tomato 菠萝 pineapple 西瓜watermelon 香蕉banana 柚子 shaddock (pomelo) 橙子orange 苹果apple 柠檬le ...

  5. Hint when use HTTPAgilityPack

    1- Read the usage policy of the website. I know this is the third time I mention that, but that tell ...

  6. Node.js的学习路线

    http://www.admin10000.com/document/4624.html 顺便关注一下博客:http://blog.fens.me/series-nodejs/ php socket框 ...

  7. FastJson和AsyncHttpCLient

    Android的展示数据,除了上章所讲的本地存储外,大部分数据都来自于网络.首先介绍一下Android APP开发常见的网络操作方式.从网络层面上有底层的tcp/ip,也就是我们常见的socket套接 ...

  8. static{ }语句块详解

    static{}(即static块),会在类被加载的时候执行且仅会被执行一次,一般用来初始化静态变量和调用静态方法.举ge例子: public class Test { public static i ...

  9. js 小知识

    在iframe 页面获取父级页面的 html var obj = window.parent.document.getElementById('modaliframe'); 解决Jquery 的在一个 ...

  10. nginx安装waf防护

    一.安装nginx 二.安装luajit2.0 三.安装ngx_devel_kit#wget https://github.com/simpl/ngx_devel_kit/archive/v0.2.1 ...