第四章 强制类型转换
- 如果对象中定义toJSON()方法,JSON字符串化会首先调用该方法,然后用它的返回值来进行序列化
var a={
val:[1,2,3],
toJSON:function(){
return this.val.slice(1);
}
}
JSON.stringify(a);// "[2,3]"
可选参数 replacer、space
如果是数组,则必须是一个字符串数组,其中包含序列化操作要处理的对象的属性名称,除此之外其他的属性会被忽略
如果是函数,首先会对该对象本身调用一次,然后对对象中的每个属性各调用一次。每次传入两个参数,分别是key和value
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]}"
toNumber操作
true => 1;
false => 0;
undefined => NaN;
null => 0;
- ToNumber对字符串的处理遵循数字常量的基本法则,处理失败时会返回NaN。
- ToNumber对于以0开头的十六进制数字并不按照十六进制进行处理,而是按照十进制
- 对象/数组会首先被转化为相应的基本类型值,如果返回的是非数字的基本类型值,则再遵循以上规则强制转换为数字。
对于如何转成相应的基本类型,我们有如下规则,如果有valueOf() 或 toString()方法,则将方法返回值强制类型转换
var a = {
valueOf: function() {
return "42";
}
};
var b = {
toString: function() {
return "42";
}
};
var c = [4, 2];
c.toString = function() {
return this.join(""); // "42"
};
Number(a); // 42
Number(b); // 42
Number(c); //42
Number(""); // 0
Number([]); // 0
Number(["abc"]); // NaN
ToBoolean操作
- 假值列表
假值的布尔强制类型转化结果为false
undefined
null
false
+0, -0, NaN
"" //空字符串
-
真值列表:假值列表之外的值
-
假值对象:封装了假值的对象,但是真值
-
~操作符
var a = "hello world";
~a.indexOf("lo") 只有为-1时 是假值 是一种很奇特的用法
if(~a.indexof("lo"))
显示解析数字字符串
ar a = "42";
var b = "42px";
Number(a); // 42
parseInt(a); // 42
Number(b); // NaN
parseInt(b); // 42
解析允许字符串含有非数字字符,从左到右遇到非数字字符就停止
转换不允许出现非数字字符,否则会失败并返回NaN
parseInt(…)针对的是字符串值,非字符串值会先被强制类型转换为字符串在进行解析,这个会导致诡异的问题 parseInt(1/0,19) 为18
显示转换为布尔值
- 使用Boolean()和!!来进行显示强制转换为布尔值
&& 和 ||操作符
- || 和 &&:逻辑运算符【返回两者中中的一个且仅一个值】
- ||: 条件判断为true则返回第一个操作数,反之返回第二个
- &&与||相反,条件判断为false则返回第二个操作数,反之返回第一个。
宽松相等和严格相等
- 宽松相等== 允许在相等比较中进行强制类型转换,而 严格相等=== 不允许
- 无论如何 都不建议 使用 == true 和 == false
- 建议使用以下格式
if(a)
if(!!a)
if(Boolean(a))
null == undefined!!
抽象关系比较
- x <= y =>被处理为 y > x然后将结果反转
- 如果比较符号两边经过toPrimitive出现数字,则强制按照数字大小比较
- 如果两边都是字符的话,那么就按照字符顺序比较