js强制类型转换

1.值类型转换 

var a = 42;

var b = a + "";  //隐式强制类型转换

var c = String( a );  //显式强制类型转换

2.抽象值操作

1.ToString(),负责处理非字符串的强制类型转换

基本类型值的字符串化规则为: null转换为"null",undefined转换为"undefined",true转化为”true",数字的字符串化则遵循通用规则

var a = 1.07 * 1000 * 1000 * 1000 * 1000 * 1000 * 1000 * 1000;

a.toString(); //"1.07e21"

如果对象有自己定义的toString()方法那么调用的时候将会调用自身的toString()方法

如果没有自己定义的话,toString()(Object.prototype.toString())将会返回内部属性 [[class]] 方法

数组的默认toString()方法经过重新定义,将所有单元字符串化再用 "," 连接起来:

var a = [1,2,3];

a.toString();

JSON字符串化

JSON.stringify(..) 在将JSON对象序列化为字符串时也用到了ToString

JSON.stringify(..) 在对象中遇到undefined,function,symbol会自动将其忽略,在数组中则会返回null

JSON.stringify( undefined );    //undefined
JSON.stringify( function(){} );  //undefined

JSON.stringify( [1,undefined,function() {},4] ); //"[1,null,null,4]"

JSON.stringify( { a:2, b: function() {} } );   //"{"a":2}"

如果对象中定义了toJSON()方法,JSON字符串化时会首先调用该方法,然后用它的返回值来进行序列化

var o = { };
var a = {
    b: 42,
    C: O,
    d:function() {}
};

o.e = a;

JSON.stringify( a );

a.toJSON = function() {
    return { b: this.b }; //序列化仅包含b
};

JSON.stringify( a );

toJSON()应该返回一个能够被字符串化的安全的JSON值,而不是返回一个JSON字符串

JSON.stringify() 传递一个可选参数 replacer

var a = {
    b: 42,
    c: "42",
    d: [1,2,3]
};

JSON.stringify( a, ["b","c"] );  //"{"b": 42, "c":"42"}"

JSON.stringify( a,function(k,v) {
    if(k != "c") return v;
} ); //"{"b":"42","d":[1,2,3]}"

当replacer是函数的时候,k在第一次调用时为undefined,而在遍历到d时,k会变成数组的索引 0,1,2

JSON.stringify()还有一个可选参数space,用来指定输出的缩进格式,space为正整数时为每一级缩进的字符数

JSON.stringify( a, null, 3);

2.ToNumber()

toNumber()将非数字值转为数字值,

其中true转换为1,false转换为0。undefined转换为NaN,null转换为0.

对象会首先被转化为相应的基本类型,如果返回的时非数字的基本类型值,则在遵循以上规则将其强制转换为数字。

为了将值转换为相应的基本类型值,抽象操作ToPrimitive会首先检查该值是否有valueOf()方法。

如果有并且返回基本类型值,就使用该值进行强制类型转换。如果没有就是用toString()的返回值来进行强制类型转换。

如果valueOf() 和 toString()均不返回基本类型值,会产生TypeError错误。

3.ToBoolean

强制转换被转换成false的值

undefined

null

false

+0,-0,NaN

" "

其他的值强制转换时都会被转成true

假值对象

假值对象并不是包装了假值的封装对象,而是强制类型转换Boolean时结果为false

真值就是除假值之外的值

3.显式强制类型转换

数字与字符串之间的转换

var a = 42;
var b = String( a );

var c = "3.14";
var d = Number( c );

b;  //"42"
d;   //3.14

显式转换中带有的隐式转换,js引擎会自动为42创建一个封装对象 ,然后对该对象调用toString()方法

var a = 42;
var b = a.toString();

var c = "3.14";
var d = +c;

b;  //"42"
d;    //3.14

日期显式转换为数字

var d = new Date( "Mon, 18 Aug 2014 08:53:06 CDT" );
+d;   //1408369986000

var timestamp = + new Date();

+号将强制转换为数字

es5中强制类型转换的方法

var timestamp = Date.now();

~运算符

~x等于  -(x+1)

~和indexOf()可以将结果进行强制类型转换

var a = "Hello World";

~a.indexOf( "lo" );    //-4

if(~a.indexOf( "lo" )) {  //true
    //找到匹配!
}

~a.indexOf( "ol" );    //0
!~a.indexOf( "ol" );    //true

if(!~a.indexOf( "ol" )) {   //true
    //没有找到匹配
}

~~中的第一个~执行ToInt32并反转字位,然后第二个~再进行一次字位反转,即将所有字位反转回原值,最后得到的仍然是ToInt32的结果

Math.floor( -49.6 );   //-50
~~-49.6;        //-49

显式解析数字字符串

var a = "42";
var b = "42px";

Number( a );        //42
parseInt( a );        //42

Number( b );        //NaN
parseInt( b );        //42

解析允许字符串中含有非数字字符,解析按从左到右的顺序,如果遇到非数字字符就停止。

而转换不允许出现非数字字符,否则会失败并返回NaN。

parseInt(..) 如果没有指定第二个参数radix,那么字符串的第一个字符来决定基数,如果第一个字符式是x或X,则转换为十六进制。如果是0,则转换为八进制数字。

为了可能存在的bug,我们需要传入第二个参数

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值