JS数据类型转换详解

2023-11-10

文章内容为所看网课笔记,如有侵权请联系删除

## JS数据类型

1. 基本数据类型

number、string、undefined、null、boolean、symbol、bigint

2. 引用数据类型【对象类型】

(1) 标准普通对象: object

(2) 标准特殊对象: Array、RegExp、Date、Math、Error...

(3) 非标准特殊对象:Number、String、Boolean...

(4) 可调用对象/执行对象:function

## JS数据类型转换

1. 其他数据类型转换为数字型

方法一:Number([val]) 转换规则如下

(1) 字符串转换为数字:空字符串转为0,如果出现的是任何非有效数字字符,结果都是NaN

Number('') -> 0 Number('12c') -> NaN

(2) 布尔值转换为数字:true -> 1 , false -> 0

(3) null -> 0 , undefined -> NaN

(4) Symbol无法转换为数字,会报错:Uncaught TypeError: Cannot convert a Symbol value to a number

(5) BigInt去除'n'(超过安全数字的,会按照科学计数法处理)

Number(10n) -> 10

(6) 把对象转换为数字

a. 先调用对象的Symbol.toPrimitive方法,如果不存在该方法

【如果有该方法,这个值的Symbol.toPrimitive方法返回什么,则结果就是什么】

【Symbol.toPrimitive(参数) :参数为要转换的数据类型:分别为number、string、default【意思为不确定要转换为什么数据类型】】

b. 在调用对象的valueOf获取原始值,如果获取的值不是原始值

【任何一个对象都有valueOf方法,即便这个对象上没有也会通过原型链找到Object对象的原型上的valueOf】

【valueOf方法用来获取原始值,数组的原始值还是数组】

c. 在调用对象的toString 将其转换为字符串

d. 最后在把字符串基于Number方法转换为数字

方法二:parseInt([val],[radix]) 规则如下

(1) parseInt([val],[radix])说明

a. [val]值必须是一个字符串,如果不是先隐式转换为字符串【通过String([val])转换】

b. [radix]进制

--如果不写,或者写0:默认是10进制【特殊情况:如果字符串是以0x开始的,默认是16进制】

--有效范围:2~36之间【如果不在这个区间,结果直接是NaN】

2进制:01

3进制:012

8进制:0~7

10进制:0~9

16进制:0~9 A~F

36进制:0~9 A~Z

(2) 转换规则如下

a. [val]值必须是一个字符串,如果不是先隐式转换为字符串【通过String([val])转换】

b. 然后从字符串左侧的第一个字符开始寻找,查找出符合[radix]进制的值【遇到不符合的就结 束查找,不论后面是否还有符合的】

parseInt('12px13',2) -> 1

parseInt('10102px13',2) -> 1010【二进制】 ->10【十进制】

c. 把找到的内容,按照[radix]进制转换为10进制的数字【一个都没找到就是NaN】

d. 遇到一个非有效数字字符,不论后面是否是有效数字字符,都不在查找了

方法三:parseFloat([val])

(1) 转换规则如下

a. [val]必须是一个字符串,如果不是,就要隐式转换为字符串

b. 然后从字符串左侧的第一个字符串开始寻找,把找到的有效数字字符最后转换为数字【一个都没找到就是NaN】

c. 遇到一个非有效数字字符,不论后面是否是有效数字字符,都不在查找了

d. parseFloat可以多识别一个小数点

例题

let arr = [27.2,0,'0013','14px',123]

arr = arr.map(parseInt)

console.log(arr) //[27,NaN,1,1,27]

// 解析

// arr.map((item,index){return item*10})方法:迭代数组的每一项,并对其进行修改【原始数组不变,返回新数组】【参数是一个函数】

// arr.map(parseInt)相当于把parseInt方法作为参数,然后原数组中的item和index作为parseInt方法的参数

// parseInt(27.2,0) -> parseInt('27.2',10) -> 27【十进制】

// parseInt(0,1) -> NaN

// parseInt('0013',2) -> 001【二进制】 -> 1【十进制】

// parseInt('14px',3) -> 1【3进制】 -> 1【十进制】

// parseInt(123,4) -> 123【4进制】 -> 27【十进制】

// parseInt(0013,2) -> parseInt(11,2) -> parseInt('11',2) ->11【二进制】-> 3【十进制】 【先将0013按照8进制转为10进制的数字11】

// JS遇到以0开始的“数字”,会默认将其按照8进制转为10进制,然后在进行其他操作

2. 其他数据类型转换为字符串

方法一:默认使用String([val])方法

规则如下

(1) 若val是一个原始值,则转换结果直接包裹括号即可

【特殊情况 String({}) //'[object Object]'】

(2) 若val是一个对象,转换规则如下

a. 先调用对象的Symbol.toPrimitive方法,

b. 如果没有Symbol.toPrimitive方法,在调用对象的indexOf,获取原始值

【每个对象都有indexOf方法,即便它本身没有,但可以通过原型链访问到Object的原型上的indexOf方法】

【数组的原始值还是数组】

c. 如果获取的原始值不是基本数据类型,则调用对象的toString方法将其转换为字符串

方法二:"+"出现字符串拼接的情况

(1) "+"两边,一边是字符串

(2) "+"两边,一边是对象

(3) "+"出现在值的左侧,除了字符串拼接的情况,而且该值会转换为数字

let i ='10'

console.log(+i) //10

注意:String([val])和val.toString()的结果不一样

(1) String([val])的结果除了是字符串外,也可以是别的类型;val.toString()的结果只能是字符串

3. 其他数据类型转换为布尔值

(1) 转换规则

a. 除0、NaN、空字符串、null、undefined返回的值是false外,其余都是true


 

4. "=="比较时的相互转换规则

"==" :两边数据类型不同,需要先转换为相同的类型,然后在进行比较

(1) 对象==字符串,对象转字符串【Symbol.toPrimitive -> valueOf -> toString】

(2) null == undefined -> true null/undefined和其他任何值都不相同

null === undefined -> false

应用场景

function(num){

if(num==null){这里说明num为undefined或者null}

}

(3) 对象==对象 比较的是内存地址,地址相同则相等

(4) NaN !== NaN true

NaN == NaN false

Object.is(NaN,NaN) true

(5) 除了以上情况,只要两边类型不一致,剩下的都是转换为数字,然后在进行比较

console.log([] == false) //true 两边都转换为数字

console.log(![] == false) //true 先处理![] -> false false == false -> true

"===": 如果两边类型不同,直接返回false,不会发生数据类型转换

## JS装箱和拆箱

1. 装箱操作:把原始值变为非标准特殊对象

let num = 10

console.log(num.toFixed(2)) //10.00

// toFixed(n)方法 :小数点后保留n位小数

// num是原始值,不是一个对象,按照常理来说,是不能进行“成员访问”的

// 默认装箱操作:new Number(num)变为非标准特殊对象,这样就可以调用 toFixed(n)方法了

2. 拆箱操作:把非标准特殊对象变为原始值

let num = new Number(10)

console.log(num+10) //20

// 在操作的过程中,浏览器会把num这个非标准特殊对象变为原始值【Symbol.toPrimitive-> valueOf...】,这个操作叫做拆箱

3. 装箱和拆箱都是浏览器默认数据类型隐式转换的过程

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JS数据类型转换详解 的相关文章

随机推荐

  • 江西省电子专题大赛考点讲解三:CD4017_五阶约翰逊十进制计数器

    芯片引脚图 图CD4017 1 CD4017芯片引脚图 芯片功能概述 表CD4017 2 CD4017芯片真值表 图CD4017 3 CD4017芯片时序图 芯片实例讲解 实例一 输出十进制0 9 图CD4017 4 利用CD4017芯片作
  • Java 基础进阶篇(十八):正则表达式匹配规则和应用

    文章目录 一 正则表达式概述 二 正则表达式的匹配规则 三 正则表达式在方法中的应用 3 1 校验手机号 邮箱和座机电话号码 3 2 字符串的内容替换和分割 四 编程题目 4 1 表示数值的字符串 4 2 非严格递增连续数字序列 一 正则表
  • Java基础练习题03 数组

    1 定义一个数组来存储12个学生的成绩 72 89 65 58 87 91 53 82 71 93 76 68 统计各成绩等级 90分以上为 A 8089分为 B 7079分为 C 60 69分为 D 60分以下为E 学生人数 并将其放入到
  • selenium笔记

    爬取 1 coding utf 8 from selenium import webdriver browser webdriver Firefox browser get http www baidu com 获得浏览器对象后 通过 ge
  • 两个实例看Vue数据代理

    数据代理 概念 通过一个对象代理对另一个对象中属性的操作 读 写 基本原理 通过Object defineproperty方法把data对象中的所有属性添加vm上 为每一个添加到vm上的属性指定getter和 setter方法 利用它去操作
  • Mybatis同时支持多种数据库(oracle 和MySQL)

    这里说下对多种数据库的支持 不是多个数据源 这里要用到mybatis的databaseId 如下
  • task_1

    task 1 赛题数据概况 数据集 条 训练集 5w 测试集A 5w 测试集B 5w 特征列 31列 匿名特征 15列 和非匿名特征 全部数据已经脱敏 编码 预测评估指标 平均绝对误差 Mean Absolute Error MAE 评估指
  • 124. 二叉树中的最大路径和

    124 二叉树中的最大路径和 题目描述 路径 被定义为一条从树中任意节点出发 沿父节点 子节点连接 达到任意节点的序列 同一个节点在一条路径序列中 至多出现一次 该路径 至少包含一个 节点 且不一定经过根节点 路径和 是路径中各节点值的总和
  • Java两数之和

    1 两数之和 1 问题描述 给定一个整数数组 nums 和一个整数目标值 target 请你在该数组中找出 和为目标值 target 的那两个整数 并返回它们的数组下标 你可以假设每种输入只会对应一个答案 但是 数组中同一个元素在答案里不能
  • Microsoft Teams的 CAA20002错误

    一个用户的Teams不能用了 登录后无法正常使用 打开Teams总是提示错误为 ERROR CODE caa20002 用户登录web网页没有问题 只有使用桌面程序才会出现这个错误 重新卸载后再安装 即便删除Teams相关的文件也不好使 最
  • bash调试经验

    bash是Unix Linux操作系统最常用的shell之一 它非常灵活 和awk c 配合起来异常强大 以下使用一个测试脚本来说明使用bash调试的方法 test sh plain view plain copy print bin ba
  • 使用计算机采用十进制数,计算机内部采用的是十六进制数吗?

    计算机内部采用的不是十六进制数 而是二进制 计算机内部采用二进制进行运算和存储 在电子计算机中采用二进制表示数可以节省设备 并且由于二进位制包括三进位制在内的其他进位制所没有的优点 所以大多数电子计算机还是采用二进制 计算机内部采用的数制是
  • chatGPT在数据安全领域的应用场景分析

    随着数据在现代生活中的不断增长 数据安全问题已经成为一个重要的议题 数据安全涉及到数据的整个生命周期 包括数据采集 存储 处理 传输和销毁等各个方面 而聊天机器人技术 尤其是ChatGPT 已经被广泛应用于数据安全领域 成为解决数据安全问题
  • 什么是cherry-pick

    文章目录 前言 图示 前言 这里的cherry pick指的是git的命令 cherry pick 这个命令的作用就是把指定的commit 拉到一个新的分支上 图示 比如此时分支情况如下 这幅图中 每个圆圈代表一次commit 一条线是一个
  • 程序真的是从main开始的吗?

    程序真的是从main开始的吗 程序从main开始的吗 在执行main之前全局变量已经初始化 main函数的两个参数也被正确传了进来 堆和栈的初始化也已经完成 一些系统I O也被初始化 完成上面这些工作的函数称为入口函数 Entry Poin
  • Mysql导出word表结构

    一 代码如下 package com icip util import com alibaba fastjson JSONObject import org apache poi xwpf usermodel XWPFDocument im
  • Sqlalchemy 2.x exists 使用方法

    Sqlalchemy 2 0 exists 使用方法 在sqlalchemy 1 4 中 想要查询一个数据在不在 可以用这种方法查询 from sqlalchemy import exists it exists Session query
  • 15个未来高科技产品会让你无法想象!这些开脑洞的设计太牛了!

    导读 从衣食住行到生活的方方面面 未来必将会有天翻地覆的变化 大数据 云计算 物联网和人工智能这些年的发展 让我们对并不遥远的未来有了更多想象和期待 那些我们现阶段不可企及的所思所想 将在未来成为大部分人的日常 这么想想 是不是有点小激动呢
  • 什么是代码评审(Code Review)

    1 什么是CodeReview Code Review CR 即代码评审 又名代码走查 是一种通过复查代码来提高代码质量的过程 一般体现在一个团队的开发过程中 CR要求团队成员有意识地 系统地检查彼此的代码 从而验证需求 发现错误 同时指出
  • JS数据类型转换详解

    文章内容为所看网课笔记 如有侵权请联系删除 JS数据类型 1 基本数据类型 number string undefined null boolean symbol bigint 2 引用数据类型 对象类型 1 标准普通对象 object 2