# 8、数据类型转换

# 把其他数据类型转换为number类型

其他类型转 number

什么情况下会把其他数据类型转换为 number 类型?

  • 1、isNaN、Number、parseInt、parseFloat
  • 2、在进行加减乘除数值运算的时候

以上的两种情况下会调用Number()方法把其他数据类型转换number类型

特殊:

null ->0
undefined->NaN
// 引用数据类型转换为数字:都为NaN,单个数值的数组或空数组除外
Number({}) // NaN
Number([]) // 0
Number('') // 0
Number([9]) // 9
Number(['19']) // 19
// 先通过toString方法将对象转化为字符串,之后再调用Number方法把字符串转化为数字

# JS中的数学运算

+、-、*、/、>、<、==

除了加号,具有特殊性,其余的运算符都是数学运算,也就是遇到非数字类型时,会调用Number()方法将其转换为number类型再运算

加法的特殊性:在遇到字符串的时候,+ 不是数学运算,而是字符串拼接,只要不遇到字符串就是数学运算。字符串拼接:是把其他值转换为字符串再进行拼接

提示 :对于Number、String、Boolean、Array、RegEx、Date、Function原型上的toString方法都是把当前数据类型转换为字符串的类型(它们的作用仅仅是用来转换为字符串的)

# 解析字符串和强制转换

区别

解析字符串中的数字和将字符串强制类型转换为数字的返回结果都是数字。但解析和转换两者之间还是有明显的差别。

  • 解析(parseInt、parseFloat):允许字符串中含有非数字字符,解析按照从左到右,遇到非数字字符就停止。
  • 转换(Number):不允许出现非数字字符,否则返回NaN

# 把其他数据类型转换为布尔类型

其他类型转 `boolean`

什么情况下会把其他数据类型转换为布尔类型?

  • 1.Boolean!!!
  • 2.在条件判断的时候,先转换为布尔类型,再验证是否成立

提示:只有null,undifined,NaN,±0,空字符串,会转化为false其他都转化为true

# 比较运算符

== 、===

==操作符允许在相等比较中进行强制类型转换,而===不允许

在使用 == 进行比较的时候,如果左右两边数据类型不相同,浏览器会默认转换为相同的类型,然后再比较(===不会这样操作) 所有对象转化为布尔值都是true(包括空对象)高程三27,电子书45页,null不是对象数据类型的,所以转化为false

规范定义如下: (1)、如果Type(x)是数字,Type(y)是字符串,则返回 x == ToNumber(y)的结果

  • 在比大小时,如果两个都是字符串,则按字母顺序比较大小。

(2)、如果Type(x)是布尔类型,则返回 ToNumber(x) == y的结果 (3)、如果Type(x)是对象,则返回 ToPrimitive(x) == y的结果

ToPrimitive:抽象操作会首先(通过调用内部的[[DefaultValue]])检查该值是否有valueOf()方法,如果有且返回基本类型值,就使用该值进行强制类型转换。如果没有就使用toString()的返回值(如果存在)来进行强制类型转换。 如果valueOf()toSting()都不返回基本类型值,会产生TypeError错误

比较规则如下:

  • 1,数字 == 字符串 在比较相等性之前先将字符串转换为数字;(空字符串转化为0)
  • 2,布尔 == xxx 只要有布尔就都转化为数字比较
  • 3,xxx == 对象
    • 先将对象转化为字符串(调用内置类Array、RegExp、Data、Math、Function上的toString方法)然后遵循以下比较规则: (如何验证对象和xxx比较是先把对象转化为字符串[12,14,15]=='12,14,15')

注意Object上的 toString 方法不是转换为字符串的,而是检测数据类型的; + xxx为 字符串 时,用对象转化后的字符串与xxx比较; + xxx为 数字 时,把对象转化后的字符串再转化为数字后比较 + xxx为 布尔值 时,把对象转化后的字符串再转化为数字,把布尔值也转化为数字再比较;

  • 4,对象 == 对象 只有两个对象都指向同一个内存空间才返回true
  • 5,null或者undefined 和其它任何值都不相等(两个等号也是)
  • null===null //true
  • undefined===undefined //true;
上次更新: 2/20/2021, 2:52:20 PM