原始值转布尔值
在JavaScript中,只有6种值可以被转换为false,其他都会被转换为true
// 当Boolean函数不传任何参数时,返回false
console.log(Boolean()) // false
console.log(Boolean(false)) // false
console.log(Boolean('')) // false
console.log(Boolean(+0)) // false
console.log(Boolean(-0)) // false
console.log(Boolean(NaN)) // false
console.log(Boolean(undefined)) // false
console.log(Boolean(null)) // false
原始值转数字
可以通过Number函数将类型转换成数字类型,如果不传参数的话,返回+0;如果参数无法被转换为数字,则返回NaN
console.log(Number()) // +0
console.log(Number(undefined)) // NaN
console.log(Number(null)) // NaN
console.log(Number(false)) // 0
console.log(Number(true)) // 1
console.log(Number('123')) // 123
console.log(Number('-123')) // -123
console.log(Number('1.2')) // 1.2
console.log(Number('000123')) // 123
console.log(Number('-000123')) // -123
console.log(Number('0x11')) // 17
console.log(Number('')) // 0
console.log(Number(' ')) // 0
console.log(Number('123 123')) // NaN
console.log(Number('foo')) // NaN
console.log(Number('100a')) // NaN
如果通过Number转换函数传入一个字符串,它会试图将其转换成一个整数或浮点数,而且会忽略所有前导0,如果有一个字符不是数字,结果都会返回NaN。
parseInt只解析整数,parseFloat则可以解析整数和浮点数,如果字符串前缀是0x或0X,parseInt将其解释为十六进制数,parseInt和parseFloat都会跳过任意数量的前导空格,尽可能解析更多数值字符,并忽略后面的内容。如果第一个非空字符是非法的数字直接量,将最终返回NaN
console.log(parseInt('3 abc')) // 3
console.log(parseFloat('3.14 abc')) // 3.14
console.log(parseInt('-12.34')) // -12
console.log(parseInt('0xFF')) // 255
console.log(parseFloat('.1')) // 0.1
console.log(parseInt('0.1')) // 0
原始值转字符
使用String函数将类型转换成字符串类型,如果String不传参数,返回空字符串。
console.log(String()) // 空字符串
console.log(String(undefined)) // undefined
console.log(String(null)) // null
console.log(String(true)) // true
console.log(String(false)) // false
console.log(String(0)) // 0
console.log(String(-0)) // 0
console.log(String(NaN)) // NaN
console.log(String(Infinity)) // Infinity
console.log(String(-Infinity)) // -Infinity
console.log(String(1)) // 1
原始值转对象
原始值到对象的转换非常简单,原始值通过调用String()、Number()或者Boolean()构造函数,转换为它们各自的包装对象。
null和undefined属于例外,当将它们用在期望是一个对象的地方都会造成一个类型错误,而不是执行正常的转换。
var a = 1
console.log(typeof a) // number
var b = new Number(a)
console.log(typeof b) // object
对象转布尔值
所有对象(包含数组和函数)都会被转换为true
console.log(Boolean(new Boolean(false))) // true
对象转换
JavaScript有两个不同的方法来执行转换,toString和valueOf
所有对象除了null和undefined之外的任何值都具有toString方法,通常情况下,它和使用String方法返回的结果是一致的。
然而JavaScript下的很多类根据各自的特点,定了更多版本的toString方法,例如:
- 数组的toString方法将每个数组元素转换成一个字符串,并在元素之间添加逗号后合并成字符串
- 函数的toString方法返回源代码字符串
- 日期的toString方法返回一个可读的日期和时间字符串
- RegExp的toString方法返回一个表示正则表达式直接量的字符串
console.log({}.toString()) // [object Object]
console.log([].toString()) // ""
console.log([0].toString()) // 0
console.log([1, 2, 3].toString()) // 1,2,3
console.log(function(){}.toString()) // function(){}
console.log(/\d+/g.toString()) // /\d+/g
console.log(new Date(2010, 0, 1).toString()) // Fri Jan 01 2010 00:00:00 GMT+0800 (中国标准时间)
另一个转换对象的函数时valueOf,表示对象的原始值。默认的valueOf方法返回这个对象本身,数组、函数、正则简单的继承了这个方法,也会返回对象本身。日期是一个例外,它会返回它的一个内容表示:1970年1月1日以来的毫秒数
var date = new Date(2017, 4, 21)
console.log(date.valueOf()) // 1495296000000
对象转字符串
对象转字符串可以概括如下:
- 如果对象具有toString方法,则调用该方法。如果它返回一个原始值,JavaScript将这个值转换为字符串,并返回这个字符串结果
- 如果对象没有toString方法,或者这个方法并不返回一个原始值,那么JavaScript会调用valueOf方法。如果存在这个方法,则调用它。如果返回值是原始值,JavaScript将这个值转换为字符串,并返回这个字符串的结果
- 否则,JavaScript无法从toString和valueOf获得一个原始值,这时它将抛出一个类型错误异常。
对象转数字
- 如果对象具有valueOf方法,并返回一个原始值,则JavaScript将这个原始值转换为数字并返回这个数字
- 否则,如果对象具有toString方法,并返回一个原始值,则JavaScript将其转换并返回
- 否则,JavaScript抛出一个类型错误异常
console.log(Number({})) // NaN
console.log(Number({a:1})) // NaN
console.log(Number([])) // 0
console.log(Number([0])) // 0
console.log(Number([1,2,3])) // NaN Number('1,2,3')
console.log(Number(function(){})) // NaN
console.log(Number(/\d+/g)) // NaN
console.log(Number(new Date(2017, 4, 21))) // 1495296000000
console.log(Number(new Error('a'))) // NaN
JSON.stringify
-
处理基本类型时,以使用toSting基本相同,结果都是字符串,除了undefined
console.log(JSON.stringify(null)) // null console.log(JSON.stringify(undefined)) // undefined,不是字符串undefined console.log(JSON.stringify(true)) // true console.log(JSON.stringify(42)) // 42 console.log(JSON.stringify('42')) // '42'
-
布尔值、数字、字符串的包装对象在序列化过程中会自动转换成对应的原始值。
console.log(JSON.stringify([new Number(1), new String('false'), new Boolean(false)])) // [1,"false",false]
-
undefined、任意的函数以及symbol值,在序列化过程中会被忽略(出现在非数组对象的属性值中时)或者被转换成null(出现在数组中时)
console.log(JSON.stringify({x: undefined, y: Object, z: Symbol('')})) // '{}' console.log(JSON.stringify([undefined, Object, Symbol('')])) // '[null,null,null]'
-
JSON.stringify有第二个参数replacer,它可以是数组或者函数,用来指定对象序列化过程中哪些属性应该被处理,哪些应该被排除
var foo = {foundation: 'Mozilla', model: 'box', week: 45, transport: 'car', month: 7} var jsonString = JSON.stringify(foo, replacer) console.log(jsonString) // {week: 45, month: 7} var foo = {foundation: 'Mozilla', model: 'box', week: 45, transport: 'car', month: 7} var jsonString = JSON.stringify(foo, ['week', 'model']) console.log(jsonString) // {week: 45, model: 'box'}
-
如果一个被序列化的对象拥有toJSON方法,那么该toJSON方法就会覆盖对象默认的序列化行为:不是那个对象被序列化,而是调用toJSON方法后的返回值会被序列化
var obj = { foo: 'foo', toJSON: function() { return 'bar' } } console.log(JSON.stringify(obj)) // '"bar"' console.log(JSON.stringify({x: obj})) // '{"x": "bar"}'