前端JavaScript基础训练系列一百零四: ToNumber

我们可以向 JSON.stringify(…) 传递一个可选参数 replacer,它可以是数组或者函数,用 来指定对象序列化过程中哪些属性应该被处理,哪些应该被排除,和 toJSON() 很像。
如果 replacer 是一个数组,那么它必须是一个字符串数组,其中包含序列化要处理的对象 的属性名称,除此之外其他的属性则被忽略。
如果 replacer 是一个函数,它会对对象本身调用一次,然后对对象中的每个属性各调用 一次,每次传递两个参数,键和值。如果要忽略某个键就返回 undefined,否则返回指定 的值。

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(就是对对象 本身调用的那次)。if 语句将属性 “c” 排除掉。由于字符串化是递归的,因 此数组 [1,2,3] 中的每个元素都会通过参数 v 传递给 replacer,即 1、2 和 3, 参数 k 是它们的索引值,即 0、1 和 2。
JSON.stringify 还有一个可选参数 space,用来指定输出的缩进格式。space 为正整数时是指 定每一级缩进的字符数,它还可以是字符串,此时最前面的十个字符被用于每一级的缩进:

var a = { b: 42,
c: "42",
d: [1,2,3] };
     JSON.stringify( a, null, 3 );
     // "{
  //
//
//
//
//
//       3
//    ]
// }"
"b": 42,
"c": "42",
"d": [
1, 2,
JSON.stringify( a, null, "-----" );
      // "{
      // -----"b": 42,
      // -----"c": "42",
      // -----"d": [
      // ----------1,
      // ----------2,
      // ----------3
      // -----]
// }"

请记住,JSON.stringify(…) 并不是强制类型转换。在这里介绍是因为它涉及 ToString 强
制类型转换,具体表现在以下两点。
(1) 字符串、数字、布尔值和 null 的 JSON.stringify(…) 规则与 ToString 基本相同。
(2) 如果传递给 JSON.stringify(…) 的对象中定义了 toJSON() 方法,那么该方法会在字符
串化前调用,以便将对象转换为安全的 JSON 值。

有时我们需要将非数字值当作数字来使用,比如数学运算。为此 ES5 规范在 9.3 节定义了 抽象操作 ToNumber。
其中 true 转换为 1,false 转换为 0。undefined 转换为 NaN,null 转换为 0。
ToNumber 对字符串的处理基本遵循数字常量的相关规则 / 语法。处理失败 时返回 NaN(处理数字常量失败时会产生语法错误)。不同之处是 ToNumber 对以 0 开头的 十六进制数并不按十六进制处理。

数字常量的语法规则与 ToNumber 处理字符串所遵循的规则之间差别不大,这 里不做进一步介绍。
对象(包括数组)会首先被转换为相应的基本类型值,如果返回的是非数字的基本类型 值,则再遵循以上规则将其强制转换为数字。
为了将值转换为相应的基本类型值,抽象操作 ToPrimitive会首先检查该值是否有 valueOf() 方法。 如果有并且返回基本类型值,就使用该值进行强制类型转换。如果没有就使用 toString()
的返回值(如果存在)来进行强制类型转换。
如果 valueOf() 和 toString() 均不返回基本类型值,会产生 TypeError 错误。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值