【JS基础】容易遗忘的数据类型转换,口诀都帮你整理了,收藏起来下次遇到直接击杀

前言

这里记录了个人遇到的一些数据类型转换,显性的隐性的都有,非常琐碎。

这些转换的问题一般在项目中我们都要规避掉,所以还是需要看看的。如果你都能记住,我愿称你为大神!


强制转换

数字转换

Number() 转成数字

使用Number()函数进行转换。

被转对象结果
字符串1. 数字内容的字符串可以直接转换为数字,但是字符串里有非数字,则会转化为NaN。2. 空字符串或空格字符串,转换为0
布尔值true会变为1false0
null0
undefinedNaN

使用例子:

console.log(Number(""));

parseInt() 向下取整

被转对象结果
字符串1. 在遇到不能解析的内容时会自动返回前面已经解析好的内容,比如'12a23.2',只能识别出12。2. 如果是第一位字符不能解析那么会直接返回NaN,比如'a123.2'识别不出显示NaN, 表示不是一个数字
数字正常向下取整

parseFloat() 转成浮点

parseInt()一样,注意事项日后再记录

在把字符串转成数字类型时,最好都用Number()方法,原因:

  • 因为当字符串为16进制或者科学计数法时,parseInt()parseFloat()转换的规则会有些不同。
  • 如果字符串带小数点,转换后会被去掉。

字符串转换

String() 转成字符串

被转对象结果
布尔true'true'false'false'
数字'数字'
null'null'
undefined'undefined'

布尔值转换

Boolean()

被转对象结果
字符串空字符串为false,其他都是true
数字0false,其他都是true
nullfalse
undefinedfalse
NaNfalse
对象true

引用类型转换

如果你用以上api对引用类型做强制转换或者下文讲的隐式转换,会依次触发这个引用类型的三个api

  • Symbol.toPrimitive看是否能得到原始值,再转换
  • 上面不能的话再调valueOf事件的执行,再转换,
  • 上面不能的话再换调用toString这个方法再进行转换。

例如:

Number({})
// {}['Symbol.toPrimitive']无效,再看{}.valueOf() 是无效代码,换成{}.toString(),结果为[object object]
Number('[object object]') // 结果为NaN

隐式转换(语境转换)

加减乘除余号

记住几个特殊的要点就都明白了:

  1. 相加的时候,必定有两边,其中有一边是字符串,另一边用String()转成字符串后直接拼接
  2. 有一边为NaN,无论怎么运算结果都是NaN
  3. 其他情况都用Number() 会先转成数字类型再运算

使用例子:

let str = '1'
let num = +str // 命中第三条,变成了数字1

大于小于号

比大小之前记住要诀:

  • 两边都是字符串,比较首位字符的表顺序
  • 有一边为NaN,直接判定为false
  • 其他的情况都先Number()转换,然后比较

==号松散比较

还是记住情况即可:

  • 两边都是不同的值类型,转成数字后再比较
  • 一边值类型一边引用类型,引用类型转成值类型再比较
  • undefinednull与自己比较或者两者相互比较的时候,才会返回true
  • 有一边为NaN,直接判定为false
  • 其他情况就是相同类型的正常比较了

规则很多,所以eslint禁止使用这种松散比较。

放些题做做:

  1. false == '' 为true
  2. true == 'true' 为 false
  3. true == 1 为true
  4. {} == null 是false
  5. let obj ={} ; obj == {} 是false
  6. undefined == null 是true
  7. [] == 0 是true

如果是!=符号,就是==的取反。

隐式转换会带来一些便利,例如可以通过obj.a == null,来判断是否obj.a等于null或者undefined。但是这样代码的可读性很差,不推荐。

===严格比较

这种要记的就很少了:

  • 有一边为NaN,直接判定为false
  • 其他情况必须类型相同

如果是!==符号,就是===的取反。

||符号

分步骤:

  • 第一,先将第一个转换为布尔
  • 如果第一个为true,返回第一个原值
  • 如果第一个为false,返回第二个原值
// 应用,给默认值
let arr = xxx || []

&&符号

分步骤:

  • 第一,先将第一个转换为布尔
  • 如果第一个为true,返回第二个原值
  • 如果第一个为false,返回第一个原值
// 应用,执行函数
callback && callback()

以上这两个判断符号在实际开发中不会这么刁钻的,大家都约定俗成的将两边写为布尔值

!!号

可以把不同变量类型转成布尔类型,只需要记住转成false有哪些情况,其他的几乎都是true:

let arr = [undefined, null, "", NaN, 0, false];
// 例如
console.log(!!arr[0]) // false

转成true的叫做truely变量,转成false的叫做falsely变量

这个我看很少人会用,当却是非常好用的东西。

if转换

就是当用来做if条件判断的时候,直接就使用Boolean()进行强制转换


来几个变态测试题

let a = // 要等于什么下面才会为true
console.log(a==1 && a ==2 && a ==3)

答案

let a = {
	n: 0,
	valueOf: function() {
		return ++this.n
	}
}
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值