数据类型及相互规则转换,我被问麻了!!!

简介: 数据类型及相互规则转换,我被问麻了!!!

数据类型



首先我们了解一下,Js中有哪些数据类型。

基本数据类型:Undefined、Null、Boolean、Number、String、Symbol、BigInt。

引用数据类型:Arrary,普通对象,date(),正则,函数


隐式转换和显式转换



隐式转换:通常包括有数学运算(+-*/),isNaN(),==比较

显示转换:Boolean()、Number()、String()等


其他类型值转换为数字



Number([val])


  1. 字符串转化为数字,空字符串是0,如果出现任何非有效数字,结果是NaN
  2. true -> 1 false-> 0
  3. null -> 0 undefined -> NaN
  4. symbol不能转化为数字,会报错
  5. BigInt会去除n
  6. 对象转化为数字
  • 先调用Symbol.toPrimitive方法,如果不存在这个方法
  • 再调用对象的valueOf获取原始值,如果获取的值不是原始值
  • 再调用toString把其变成字符串
  • 最后再把字符串基于Number方法转化为数字


parseInt([val],[radix])


  • [ val ]必须是字符串,如果不是,要先隐式转换为字符串 String([val])
  • [ radix ]进制
  • 如果不写,或者写零:默认是10(特殊情况:如果字符串是0x开始的,默认是16进制)
  • 有效范围:2~36之间,如果不在这个区间,结果直接是NaN
  • 从[ val ]字符串左侧第一个字符开始查找,查找出符合[radix]进制的值(遇到不符合的则直接结束查找,不论后面是否还有符合的);把找到的内容,按照[radix]进制,转换为10进制!


其他类型值转换为字符串



String([val])和[val].toString()


String([val])会经历严格的三个步骤,最后不一定变成字符串

  • 先调用Symbol.toPrimitive方法,如果不存在这个方法
  • 再调用对象的valueOf获取原始值,如果获取的值不是原始值
  • 再调用toString把其变成字符串


[val].toString()


[val].toString()一定会转换成字符串。它和String()的区别是String()会调用对象中的valueOf()方法,从而返回的可能不是一个字符串。

+

+ 出现在左右两边,其中一边是字符串,或者是某些对象,会以字符串拼接开始处理,其他情况都是数学运算。


其他值到布尔类型的值的转换规则



以下这些是假值:

• undefined

• null

• false

• +0、-0 和 NaN

• ""


假值的布尔强制类型转换结果为 false。从逻辑上说,假值列表以外的都应该是真值。


小试牛刀



第一题


let res = 100 + true + 21.2 + null + undefined + "Tencent" + [] + null + 9 + false
console.log(res)


首先 100 + true没有遇到字符串或者对象,是数学运算,true会转化成1,结果是101。 101 + 21.2是122.2. 122.2 + null还是122.2。undefined转为数字,是NaN,任何数加NaN都是NaN。所以122.2 + undefined会变成NaN。从此之后,都会变成了字符串拼接了,NaNTencent + []。[]变成空字符串,null变成"null",9变成"9",false变成"false"。

所以最终输出NaNTencentnull9false

image.png


第二题


let arr = [27.2, 0, '0013', '14px', 123];
arr = arr.map(parseInt)
console.log(arr)


前置知识 map遍历会有两个参数map((item,index)=>{}),分别是当前项和索引值,这两个参数会传入paseInt里面,相当于我们要计算以下值的结果


parseInt(27.2,0)
parseInt(0,1)
parseInt('0013',2)
parseInt('14px',3)
parseInt('123',4)


第一个,我们已经说了,如果第二个参数不写或者是0,默认都是10进制。先转换为字符串,然后就输出了27。

第二个,radix的范围是2~36,1不在这个范围,直接是NaN

第三个,'0013'中二进制只有'001',转换成10进制直接输出1

第四个,'14px'变成三进制,有效的是'1',对应的10进制输出是1

第五个,'123'变成了四进制,都是有效的,所以输出对应的10进制是3 + 24 + 14^2 = 27


image.png


小知识



isNaN 和 Number.isNaN 函数的区别


NaN(not a number)意味着它不是一个数字,但是typeof NaN 是number。NaN是一个特殊值,它和自身不相等

isNaN()函数在判断是否为NaN时,需要先进行数据类型转换,只有在无法转换为数字时才会返回true

Number.isNaN()函数在判断是否为NaN时,只需要判断传入的值是否为NaN不会进行数据类型转换。


image.png


目录
相关文章
|
编解码 算法 数据可视化
源码解读 | 单目相机实现3D目标检测—CaDDN
源码解读 | 单目相机实现3D目标检测—CaDDN
577 0
|
小程序 JavaScript
搞定 Mobx 小程序状态管理
搞定 Mobx 小程序状态管理
323 0
|
6月前
|
弹性计算 监控 安全
阿里云 ECS 服务器面板如何选择?
阿里云ECS服务器面板是管理云服务器的工具,如同手机的控制中心。它简化了复杂操作,提供一键建站、监控状态、安全管理等功能。常用面板有宝塔(适合个人和小团队)、Websoft9(阿里云官方合作,开机即用)和cPanel(适合企业级需求)。新手使用面板可避免技术坑、节省时间和成本。选择时,根据需求和使用习惯决定:深度用户选Websoft9,极客选宝塔,企业选cPanel。
309 1
|
8月前
|
存储 算法 数据挖掘
服务器数据恢复—nas中raid6阵列失效,存储无法访问的数据恢复案例
一台nas上共有14块硬盘组建了一组raid6磁盘阵列。 该nas在工作过程中,raid6阵列中硬盘出现故障离线,导致raid6阵列失效,nas无法正常访问。
|
存储 监控 数据可视化
《惊爆!SLS 底层存储之谜大揭秘,竟不是 OSS?!真相令人瞠目结舌!》
【8月更文挑战第15天】在数字化时代,高效管理日志数据至关重要。阿里云日志服务(SLS)提供强大日志管理,支持数据收集、存储、查询与分析。不同于通用对象存储服务(OSS),SLS采用专为日志优化的存储架构,确保高效写入与快速检索。用户仅需调用SLS接口即可轻松管理日志,无需关注底层细节或自行编写复杂代码。SLS通过简化流程,为企业提供专业高效的日志服务解决方案。
257 4
|
12月前
|
Python
python推导式-列表,元组,字典,集合推导式
这篇文章介绍了Python中的推导式,包括列表推导式、元组推导式、字典推导式和集合推导式,提供了它们的基本格式和示例代码,并解释了推导式如何简化循环和条件判断的代码编写。
|
BI
专业认证!阿里云Quick BI入选Gartner®魔力象限
专业认证!阿里云Quick BI入选Gartner®魔力象限
375 1
|
人工智能 Cloud Native 算法
连续五年!阿里云蝉联金融云市场第一
连续五年!阿里云蝉联金融云市场第一
280 1
|
分布式计算 C语言 Python
基于Python实现MapReduce
一、什么是MapReduce 首先,将这个单词分解为Map、Reduce。 • Map阶段:在这个阶段,输入数据集被分割成小块,并由多个Map任务处理。每个Map任务将输入数据映射为一系列(key, value)对,并生成中间结果。 • Reduce阶段:在这个阶段,中间结果被重新分组和排序,以便相同key的中间结果被传递到同一个Reduce任务。每个Reduce任务将具有相同key的中间结果合并、计算,并生成最终的输出。
|
API 开发工具
抖音sdk,抖音开发api接口
抖音sdk,抖音开发api接口