JS各种类型问题与隐式类型转换

JS数据类型

基本类型5种
Number String Boolean Undefined Null
特殊引用类型10种
Object Array Date RegExp Function
基本包装类型Boolean Number String
Global Math

检测数据类型的方法

1.typeof

操作数可以是基本类型,也可以是引用类型
返回值为字符串,种类有:undefined,boolean,string,number,object,function

  • 基本类型返回基本类型名称的字符串
  • 基本类型返回基本类型名称的字符串
  • 引用类型(除了function)都返回object。其中问题在于null也会返回object,且对于正则表达式的返回有的返回function,有的返回object

所以typeof只能用于判断是否是引用类型,以及是哪种基本类型。

2.instanceof

检测对象类型,如果左操作数是右操作数的实例,返回true

可用来检测原型关系。

3.Object.prototype.toString.apply(obj)

基本类型和基本包装类型返回一样,其他继承于Object的自定义引用类型返回Object。
返回值格式为[object **],可通过.split(8:-1)得到其类型字符串
返回值种类有:Null Undefined Number Boolean String Function Object。

可以用来补充typeof操作符不足,判断是不是null。

类型转换规则

1.其他类型转换成Boolean类型

Boolean类型值只有两种,true和false,区分大小写
其他类型转换成为Boolean类型时,调用Boolean()方法

  • 空字符串、0、NaN、null、undefined均转换成false
  • 非空字符串、非零数值、Infinity、任何对象转换成true
2.其他类型转换成String类型

其他类型转换成String类型时,调用String()方法

  • 如果有toString()方法,则调用toString()方法(null和undefined没有这个方法)
    • 对于数值类型转换成数值字符串
    • true 转换成 ‘true’
    • false 转换成 ‘false’
  • null 转换成 ‘null’
  • undefined 转换成 ‘undefined’
3.任何类型转换成Number类型

数值类型分整数和浮点数(最高精度17位小数,有误差)
几个特殊值:

  • Number.MIN_VALUE:所能表示最小数值
  • Number.MAX_VALUE:所能表示最大数值
  • -Infinity:负无穷大,不在所能表示的数值范围内的负数
  • Infinity:正无穷大,不在所能表示的数值范围内的正数
  • NaN:不是数值

针对特殊数值的两个函数

  • isFinite()函数,是否位于最大数值与最小数值之间
  • isNaN()函数,是否不是数值(NaN)

任何涉及NaN的操作都会返回NaN,NaN和任何值都不相等,包括NaN自身。

由于特殊数值的存在对于+、 -、 *、 /、 %等操作需要额外的进行说明

  • 对于“+”操作符

    • Infinity+Infinity=Infinity
    • (-Infinity)+(-Infinity)=-Infinity
    • Infinity+(-Infinity)=NaN
    • (+0)+(+0)=(+0)
    • (+0)+(-0)=(-0)
    • (-0) +(-0)=(-0)
  • 对于“-”操作符

    • Infinity-Infinity=NaN
    • (-Infinity)-(-Infinity)=NaN
    • -Infinity-Infinity=-Infinity
    • Infinity-(-Infinity)=Infinity
    • (+0) -(+0)=(+0)
    • (+0) -(-0)=(+0)
    • (-0) -(-0)=(+0)
  • 对于“*”操作符

    • Infinity*0=NaN
    • Infinity*非0=Infinity或-Infinity
    • Infinity*Infinity=Infinity
  • 对于“/”操作符
    • 0/0=NaN
    • 有限大/0=Infinity或-Infinity
    • Infinity/ 有限大 =Infinity或-Infinity
    • Infinity/Infinity=NaN
  • 对于“%”操作符
    • 0%任何数=0
    • 有限大 %Infinity =被除数
    • Infinity% 有限大=NaN
    • Infinity%Infinity=NaN
    • 有限大 %0=NaN

有一个操作数是NaN,结果为NaN

其他类型转换成Number类型时,调用Number()函数
parseInt()和parseFloat()函数用于将字符串转换成相应数值

  • true 转换成 1
  • flase 转换成 0
  • null 转换成 0
  • undefined 转换成 NaN
  • 空字符串转换成 0
  • 以包含各种形式的数值开头的字符串转换成相应的数值
  • 其他字符串转换成NaN
  • 对于对象将依次调用valueOf(),toString()尝试返回非NaN的值,如果不能则返回NaN

parseInt()对空字符串返回NaN
parseFloat()只解析十进制数,可以返回整数

隐式类型转换

主要包含以下几种情况:

1.操作符

++ 、 – 、一元+ 、 一元- 、 ~ 、& 、| 、^ 、<< 、>> 、 >>> 、* 、 / 、%
针对Number类型的,因此对其他类型应用这些操作符时,自动执行Number()函数进行类型转换
其中对于位操作符,NaN和Infinity都会当成0处理

+

  • 两个操作数都是数值,就是数值操作
  • 有一个操作数是字符串,就执行字符串拼接
  • 其他情况都先执行String()方法进行类型转换成String类型,然后进行字符串拼接

>、<、>=、<=

  • 除了两个操作数都是字符串的情况,其他都转换成Number类型比较大小
  • 任何操作数与NaN进行比较,结果都是false
  • 对于两个操作数都是字符串,比较的是字符串的字符编码

==、!=
强制类型转换,一般都是转换为数值

  • 这里判断的相等只能说明值相等(对于基本类型)或引用相等(对于引用类型),并不能说明类型也一致。
  • NaN和任何值都不相等
  • 对象相等是指向同一对象才相等
  • undefined == null 返回true,因为ECMA262规定的

判断到底是不是null或到底是不是undefined需要用===

===、!==
不经类型转换就相等
一般用来对类型相同,值也相同的判断

null!==undefined;//返回true
2.if语句、条件操作符 、! 、while语句

这种针对Boolean类型的,因此对其他类型应用这些操作符时,自动执行Boolean()函数

由于空字符串、0、NaN、null、undefined均会转换成false,在检查一个变量是否未定义,不要用真值检测,要用typeof和===。

3.特殊情况

&&
短路操作,不一定返回布尔值

  • 第一个操作数是对象,返回第二个操作数
  • 第二个操作数是对象,则第一个操作数求值为true时,返回该对象
  • 两个操作数都是对象,返回第二个操作数
  • 有一个操作数是null,返回null
  • 有一个操作数是NaN,返回NaN
  • 有一个操作数是underfined,返回undefined

不能使用未定义的值,否则报错

||
短路操作,不一定返回布尔值

  • 第一个操作数是对象,返回第一个操作数
  • 第一个操作数求值为false时,返回第二个操作数
  • 两个操作数都是对象,返回第一个操作数
  • 有两个操作数都是null,返回null
  • 有两个操作数是NaN,返回NaN
  • 有两个操作数是underfined,返回undefined

不能使用未定义的值不能使用未定义的值,否则报错
应用:赋值操作经常采用

var aObeject = firstObject || secondObject;
4. isNaN()

将其他不是NaN的尝试转换成NaN,因此isNaN不能用来检测是不是NaN,只能用来检查是不是可用数值。

isNaN("str"); // true
isNaN(undefined); // true
isNaN({}); // true
isNaN({ a: "b" }); // true

可以用下面这个函数来检查是不是NaN。

function isReallyNaN(x) {
    return x !== x;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值