javascript的强制类型转换
1、toString
(1)调用toString方法
Array是将数组中的每个元素字符串化,并使用逗号拼接起来
object返回的是内部属性[[Class]]的值,[object Object]
number则是转换为字符串值,如1转为"1",NaN转为"NaN",1/0转为"Infinity"
boolean,true转为"true",false转为"false"
(2)JSON字符串化
工具函数JSON.stringify(..)在将JSON对象序列化为字符串时也使用了ToString方法
JSON.stringify(11) // 11
JSON.stringify("11") // ""11""
JSON.stringify(null) // "null"
JSON.stringify(true) // "true"
但是JSON.stringify只能转化安全的JSON值,不安全的值包含如下格式
- undefined
- function
- symbol
- 包含循环引用的对象
当在object中出现undefined、function、symbol时会自动忽略,在array中遇到则返回null,已保证单元格位置不变。
当包含循环引用的对象时,则会报错。
注意:若对象定义了toJSON()方法,JSON字符串化时会先调用该方法,然后使用它的返回值来进行序列化。(因此可以对JSON不安全的对象,定义一个toJSON方法)
JSON.stringify(..)第二个参数可以是数组或函数,数组定义需要哪些key值需要被返回,函数有两个参数,分别为key和value,如果要忽略某个值,则return undefined,否则return相应的value。
var a = {
b: 11,
c: '11',
d: [1, 2, 3]
}
JSON.stringify(a, ['b', 'c']) // {b: 11, c: '11'}
JSON.stringify(a, function(k, v) {
if (k !== 'c') return v;
})
// {b: 11, c: '11'}
a、字符串、数字、布尔值和null的JSON.stringify(..)规则和toString()方法相同
b、如果传递给JSON.stringify(..)的对象定义了toJSON()方法,那么该方法会在字符串化前调用,以便将对象转化为安全的JSON值。
2、toNumber
ES5规范定义了抽象操作ToNumber
true 转换为1,
false 转换为0,
undefined转换为NaN,
null转换为0,
字符串若是类数字转换为对应的数字,处理失败返回NaN,
对于以0开头的16进制不是按16进制处理,而是按10进制处理,
对象会首先转换为基本类型值,然后再按以上规则进行转换。
转换为基本类型值的方式是检查该对象是否有valueOf()方法,如果有并且返回基本类型值,就使用该值进行强制类型转换。如果没有就使用toString()的返回值(如果存在)来进行强制类型转换。
如果valueOf()和toString()均不返回基本类型值,则产生TypeError错误。
从ES5开始,使用Object.create(null)创建的对象[[Prototype]]属性为null,并且没有valueOf()和toString()方法,因此无法进行强制类型转换。
3、toBoolean
javascript中的值分为以下两类:
(1)可以被强制类型转换为false的值
(2)其他(可以被强制类型转换为true的值)
ES5规范9.2节中定义了抽象操作toBoolean
以下这些是假值:
- undefined
- null
- false
- +0、-0、NaN
- ""
假值可以强制类型转换为false。从逻辑上讲,假值以外的都应该是真值。但Javascript规范对此并没有明确的定义,只是给出了一些实例。