javascript类型转换

javascript类型转换

1 类型

javascript中类型可以划分为两类,原始类型和复合类型。

1.1 原始类型

原始类型有number,string,boolean,undefined,null这五种类型

1.2 复合类型

原始类型之外的类型都是复合类型,如Object,Array,Date,RegExp等

2 类型转换

2.1 原始类型强制类型转换

原始类型之间的转换,可以通过构造函数进行强制转换,如:

  • 转换成number:如Number('11')
  • 转换成string:如String(11)
  • 转换成Boolean:如Boolean(11)

2.2 原始类型之间相互转换规则

2.2.1 转换成number类型

  • string转换成number类型时,空字符串转成0,其他值直接去掉引号,如"11"转成11,如果不能转成number,如11a,则返回NaN
  • boolean转换成number类型,true转成1,false转为0
  • null转换成number类型,转为0
  • undefined转换成NaN

2.2.2 转换成string类型

所有其他原始类型转换成string类型时,直接在原值上加引号,如 11转为'11',null转为'null'

2.2.3 转换成boolean类型

  • +0, 0, -0, NaN, null, undefined, ''转换成false
  • 其他转换为true

2.3 原始类型与复合类型之间的转换

2.3.1 复合类型转化为原始类型

复合类型转化为原始类型,遵循以下两个规则:

  • 转换为string时,先调用toString()方法,如果toString()方法返回的是原始类型,则结束,否则,继续调用valueOf()方法,如果valueOf()方法返回原始类型,则正常返回valueOf()的返回值,否则则返回[object 构造函数名]
String([]); // 调用toString方法,返回''

var ob = {
    toString: function () {
        console.log('call toString');
        return [];
    },
    valueOf: function () {
        console.log('call valueOf');
        return 'valueOf';
    }
}

String(ob) // call toString call valueOf "valueOf"
  • 转化为boolean或number时,先调用valueOf()方法,如果valueOf()方法返回的是原始类型,则结束,否则,继续调用toString()方法,如果toString()方法返回原始类型,则正常返回toString()的返回值,否则则返回NaN

  • 所有复合类型转化为boolean时,均为true

var a = new Boolean(false);
a && 2; //2
Number([]); // 调用toString方法,返回0

var ob = {
    toString: function () {
        console.log('call toString');
        return [];
    },
    valueOf: function () {
        console.log('call valueOf');
        return 'valueOf';
    }
}

Number(ob) // call valueOf NaN

2.3.2 原始类型转换为复合类型

直接调用new constructor转换,如new Number(22),new String('22')

3 隐式类型转换

javascript中隐式类型转换无处不在,==和!=比较时,if语句,函数参数中,都存在隐式类型转换,如果不熟悉类型转换规则,极容易出错

3.1 ==和!=比较引发的隐式类型转换

  • ==和!=比较时,优化转换为number类型,其次是string类型,不会主动转化为boolean类型
var a = '1';
var b = 1;

a==b; // true

var c = 'true';
var d = true;

c==d; // false,d优化转化成number,即1
b==d; // true,d优化转化成number,即1
  • +号运算符操作时,优化转换为string类型,其次是number类型,不会主动转化为boolean类型
var a = '1';
var b = 2;
var c = false;

a + b; // '12'
a + c; // '1false'
b + c; // 2
  • if语句中,转化为boolean值

    除了+0, 0, -0, NaN, null, undefined, ''转换成false,其他所有类型(包括复合类型)的值都是true

var a = [0];
if (a) {
  console.log(a == true);
} else {
  console.log("wut");
}

/** 返回结果是false
* if 语句中a是复合类型,所以是true
* a == true使用==时存在隐式类型转换,true转换成1,a调用toString转换成"0","0"进一步转换成0,最终比较0==1,结果是false
* /
  • 函数参数中,根据函数参数类型要求转换

/**
* 6,parseInt要求传入两个参数(String, Number),
* 0.0000006超过6位小数,在js中表示为科学计算法6e-7,
* 转换为sting则为'6e-7',执行parseInt('6e-7'),结果为6.
*/
var a = parseInt(0.0000006);
console.log(a); 

 

javascript的类型和类型转换内容基本就这些,最后放一些简单测试,大家可以测试一下自己是否掌握了。
[] == ![]

['0'] == 0

'true' == true

[] + ''

 

由于个人能力问题,可能存在一些纰露,如有问题,麻烦留言指出,欢迎讨论。

posted @ 2017-01-15 12:25  mooncatchen  阅读(144)  评论(0)    收藏  举报