js类型转换精讲

131 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第1天,点击查看活动详情

概述

JavaScript 中的取值类型非常灵活,当javascript 期望一个类型的值时,你可以提供任意类型的值,JavaScript将根据需要自行转换类型。

原始值之间的转换

//没有new     时是进行类型转换  加上new 就变成构造器
      String() 转字符          Number()转数字     Booleabn()转布尔      
值/类型StringNumberBoolean
null"null"NaNfalse
undefined"undefined"NaNfalse
true"true"1true
false"false"0false
""(空字符串)""0false
"520"(空字符串)"520"520false
"one""one"NaNtrue
0"0"0false
-0"-0"-0false
NaN"NaN"-0NaN
Infinity"Infinity"Infinitytrue
-Infinity"-Infinity"-Infinitytrue
(非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(),但是各自又对方法进行重写所以表现不同

  1. toString() 返回一个反应这个对象的字符串
  • 数组 返回里返回元素。 默认 ,分割
  • 函数 返回自身源码
  • 日期 返回 可读的日期时间字符串
  • RegExp 返回正则字符串
  • {} 返回[object Object]
  1. valueOf() 如果存在任意原始值,默认转为表示他的原始值,对象是复合值,如果对象无法真正表示一个原始值,返回对象自身
  • 数组 {} 函数 正则 返回自身 Date返回时间毫秒值
值/类型StringNumberBoolean
{}[object Object]NaNtrue
[]""0true
["a"]"a"NaNtrue
[9]"9"9true
function(){}"-0"NaNtrue

总结

  • 对象转boolean 默认为true 哪怕new Boolean(false)也是true
  • 对象转number 首先尝试调用valueOf(),如果返回原始值,则转为数字结束并返回 否则如果具有toString()返回原始值然后转换并返回 否则 抛出类型异常错误
  • 对象转string 如果具有同String()方法则调用toString() 如果返回原始值 转为字符串结束并返回 如果不存在toString() 或者不返回原始值 会调用valueOf()若存在调用函数,如果返回原始值 转为字符串结束并返回,否则抛出类型异常错误