开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第1天,点击查看活动详情
概述
JavaScript 中的取值类型非常灵活,当javascript 期望一个类型的值时,你可以提供任意类型的值,JavaScript将根据需要自行转换类型。
原始值之间的转换
//没有new 时是进行类型转换 加上new 就变成构造器
String() 转字符 Number()转数字 Booleabn()转布尔
| 值/类型 | String | Number | Boolean |
|---|---|---|---|
| null | "null" | NaN | false |
| undefined | "undefined" | NaN | false |
| true | "true" | 1 | true |
| false | "false" | 0 | false |
| ""(空字符串) | "" | 0 | false |
| "520"(空字符串) | "520" | 520 | false |
| "one" | "one" | NaN | true |
| 0 | "0" | 0 | false |
| -0 | "-0" | -0 | false |
| NaN | "NaN" | -0 | NaN |
| Infinity | "Infinity" | Infinity | true |
| -Infinity | "-Infinity" | -Infinity | true |
| (非0 ∀数字) | "∀" | ∀ | true |
原始值转对象
原始值转为对象转换非常简单,原始值通过调用各自对应的包装类构造函数,转换为包装对象
- 面向对象思想中一切皆对象,所以number string boolean都有各自对应的包装类;
- 只要是触发了条件就会自动new 一个对应的构造器形成一个临时对象,这个对象继承了字符串的方法等,结束触发自动销毁。
- null undefined 是没有对应的包装对象。 在期望是一个对象的地方会报错,调用方法会包类型错误无法转换为对象,但通过Object()会得到{}
eg:
let str="TiGa";
str.charAt(0) //--------------> T 调用方法触发 new String(str) 所以可以访问String原型上的方法
//同样的在==比较中,会进行隐式类型转换
let s1=new String("TiGa");
//对象同字符串比较,自动转换为包装类
console.log(s1==str) //true
对象转原始值
所有对象继承了两个转换方法 toString() 和 valueOf(),但是各自又对方法进行重写所以表现不同
- toString() 返回一个反应这个对象的字符串
- 数组 返回里返回元素。 默认 ,分割
- 函数 返回自身源码
- 日期 返回 可读的日期时间字符串
- RegExp 返回正则字符串
- {} 返回[object Object]
- valueOf() 如果存在任意原始值,默认转为表示他的原始值,对象是复合值,如果对象无法真正表示一个原始值,返回对象自身
- 数组 {} 函数 正则 返回自身 Date返回时间毫秒值
| 值/类型 | String | Number | Boolean |
|---|---|---|---|
| {} | [object Object] | NaN | true |
| [] | "" | 0 | true |
| ["a"] | "a" | NaN | true |
| [9] | "9" | 9 | true |
| function(){} | "-0" | NaN | true |
总结
- 对象转boolean 默认为true 哪怕new Boolean(false)也是true
- 对象转number 首先尝试调用valueOf(),如果返回原始值,则转为数字结束并返回 否则如果具有toString()返回原始值然后转换并返回 否则 抛出类型异常错误
- 对象转string 如果具有同String()方法则调用toString() 如果返回原始值 转为字符串结束并返回 如果不存在toString() 或者不返回原始值 会调用valueOf()若存在调用函数,如果返回原始值 转为字符串结束并返回,否则抛出类型异常错误