《你不知道的JS》类型转换

第四章 强制类型转换

  • 如果对象中定义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出现数字,则强制按照数字大小比较
  • 如果两边都是字符的话,那么就按照字符顺序比较

猜你喜欢

转载自blog.csdn.net/whp404/article/details/85198722