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,我们需要传入第二个参数