JavaScript - ECMAScript 类型转换

创建时间:
2014-07-07 13:02
最近更新:
2018-08-11 16:40

Source

http://www.w3school.com.cn/js/pro_js_typeconversion.asp

二进制 与 十进制 相互转换

parseInt('10000000000000000000000000000000000000000000000000001', 2).toString(2);

转换成字符串 - toString()

3 种主要的原始类型 Boolean 值、数字和字符串都有 toString() 方法,可以把它们的值转换成字符串。例如:

alert(false.toString()); //弹窗显示字符串 "false"。注意:"true" 与 "false" 均为小写。
numberObject.toString(radix); //radix is an optional parameter.

转换成数字 - parseInt() & parseFloat()

ECMAScript 提供了两种把非数字的原始值转换成数字的方法,即 parseInt() 和 parseFloat()。

http://www.w3school.com.cn/jsref/jsref_obj_global.asp
parseInt() 与 parseFloat() 都是 "JavaScript 全局对象" 的 "顶层函数 (全局函数)"。

parseInt()

http://www.w3school.com.cn/jsref/jsref_parseInt.asp
Syntax: parseInt(string, radix)
解析一个字符串,并返回一个整数。

parseFloat()

http://www.w3school.com.cn/jsref/jsref_parseFloat.asp
Syntax: parseFloat(string)
解析一个字符串,并返回一个浮点数。

强制类型转换

ECMAScript 中可用的 3 种强制类型转换如下:

  • Boolean(value) - 把给定的值转换成 Boolean 型。
  • Number(value) - 把给定的值转换成数字 (可以是整数或浮点数)。
  • String(value) - 把给定的值转换成字符串。

Boolean(x)

当要转换的值是至少有一个字符的字符串、非 0 数字或对象时,Boolean(x) 函数将返回 true。如果该值是空字符串、数字 0、undefined 或 null,它将返回 false。

Number(x)

Number(x) 与 parseInt() / parseFloat() 的区别是它转换的是整个值,而不是部分值:

parseInt() / parseFloat() 只转换第一个无效字符之前的字符串,因此 "1.2.3" 将分别被转换为 "1" 和 "1.2"。

而 Number("1.2.3") 将返回 NaN,因为整个字符串值不能转换成数字。如果字符串值能被完整地转换,Number() 将判断是调用 parseInt() 方法还是 parseFloat() 方法。

String(x)

把任何值转换成字符串。

String(x) 和 x.toString() 唯一不同之处在于,对 null 和 undefined 值强制类型转换可以生成字符串而不引发错误:

var s1 = String(null); //"null"
var oNull = null;
var s2 = oNull.toString(); //会引发错误

类型转换的简写型式

以下代码在 Firefox F12 中执行后输出的结果 "依次为 10 个 true、1 个 false":

console.log(
    +'123' === 123,                         //String to Number
    123 + '' === '123',                     //Number to String
    +new Date() === (new Date()).getTime(), //Date to Number
    new Date().getTime() === new Date() - 0,//Date to Number
    !!'anything' === true,                  //anything to Boolean
    ~~1.49 === 1,                           //truncate
    ~~1.50 === 1,                           //truncate
    ~~1.51 === 1,                           //truncate
    123 === 123.000,                        //integer & float 统一为 Number
    [123][0] === 123,                       //primitive value to array
    1 === 2                                 //最后这个参数后面不能有逗号,否则将抛出异常
);

Test of parseInt() & parseFloat()

(function(){
    [
        '123',
        '123.',
        '123.0',
        '123.00',
        '123.000',
    ].forEach(function(e){
        console.log(parseInt(e));    //A
        console.log(parseFloat(e));  //B
    });
})();

在 Firefox 控制台中执行上述代码,将输出 10 行 123。但是,分别注释 A 或 B,将输出 1 行 123 并在其后显示重复数量 5。这表明 A 与 B 输出的 123 是不同的类据类型?

测试证明 Boolean()!! 行为一致

JavaScript 之 if(value) 和 if(!!value) 的区别
http://segmentfault.com/q/1010000000656153

(function(){
    [
        undefined,
        null,
        false,
        0,
        -0,
        '',
        //The above values will be converted to false.
        //The following values will be converted to true.
        true,
        'false',
        'true',
        1,
        -1,
        ' ',
        '0',
        '1',
        [],
        {},
        function(){}
    ].forEach(function(e){
        console.log(
            e ? true : false,
            Boolean(e)
        );
    });
})();

Contrast parseInt(), parseFloat(), Number()

[
    null,       //NaN NaN 0
    undefined,  //NaN NaN NaN
    true,       //NaN NaN 1
    false,      //NaN NaN 0
    0,          //0 0 0
    1,          //1 1 1
    -1,         //-1 -1 -1
    3.14,       //3 3.14 3.14
    '0',        //0 0 0
    '1',        //1 1 1
    '-1',       //-1 -1 -1
    'a',        //NaN NaN NaN
    '0.1.2.3',  //0 0.1 NaN
    '1.1.2.3'   //1 1.1 NaN
].forEach(function(item){
    console.log(
        parseInt(item),
        parseFloat(item),
        Number(item)
    );
});