10分钟的时间,带你彻底搞懂JavaScript数据类型转换

这篇具有很好参考价值的文章主要介绍了10分钟的时间,带你彻底搞懂JavaScript数据类型转换。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

 📫 大家好,我是南木元元,热衷分享有趣实用的文章,希望大家多多支持,一起进步!

 🍅 个人主页:南木元元


目录

JS数据类型

3种转换类型

ToBoolean

ToString

ToNumber

对象转原始类型

隐式类型转换

结语


JS数据类型

首先我们需要知道,js中数据类型分为两大类:基本数据类型引用数据类型

7种基本数据类型分别是:

  • Boolean
  • Null
  • Undefined
  • Number
  • String
  • Symbol
  • BigInt

引用数据类型即对象Object,包含普通对象-Object,数组对象-Array,正则对象-RegExp,日期对象-Date,数学函数-Math,函数对象-Function。

3种转换类型

在JS中,类型转换只有三种情况:

  • 转换成布尔值
  • 转换成字符串
  • 转换成数字

数据类型转换的基本规则见下表:

10分钟的时间,带你彻底搞懂JavaScript数据类型转换,javascript,javascript,前端

ToBoolean

ToBoolean指其他类型转换为布尔类型的操作。

js中的假值只有0、-0、NaN、""、falsenullundefined,其它值转为布尔型都为true

console.log(Boolean(0)); // flase
console.log(Boolean(-0)); // flase
console.log(Boolean(NaN)); // flase
console.log(Boolean("")); // flase
console.log(Boolean(null)); // flase
console.log(Boolean(undefined)); // flase
console.log(Boolean(false)); // flase

//其它所有值都转为true,包括所有对象
console.log(Boolean([])); //true
console.log(Boolean({})); //true
console.log(Boolean("0")); //true
console.log(Boolean(1)); //true

ToString

ToString指其他类型的值转换为字符串类型的操作。

转为字符串的规则:

  • null:转为"null"

  • undefined:转为"undefined"

  • Boolean类型:true转为"true",false转为"false"

  • Number类型:直接转换,如5转为"5"(不过那些极小和极大的数字会使用指数形式,如1e21转为"1e+21"

  • Symbol类型:直接转换(只允许显式强制类型转换,使用隐式强制类型转换会报错)

  • 数组:转为由逗号分隔的一系列数字组成的字符串 ,如[1,2]转为"1,2"

  • 普通对象:会调用Object.prototype.toString(),返回"[object Object]",如果对象有自己的 toString() 方法,字符串化时就会调用该方法并使用其返回值。

console.log(String(null)); //'null'
console.log(String(undefined)); //'undefined'
console.log(String(true)); //'true'
console.log(String(false)); //'false'
console.log(String(5)); //'5'
console.log(String(1e21)); //'1e+21'
console.log(String(Symbol("5"))); //"Symbol(5)"
console.log(String([1, 2]));  '1,2'
console.log(String({})); // '[object Object]'

ToNumber

ToNumber指其他类型转换为数字类型的操作。

转为数字的规则:

  • null:转为0
  • undefined:转为NaN
  • Boolean类型:true转为1,false转为 0
  • String类型:如果是纯数字形式,则转为对应的数字,空字符转为0,否则转为NaN
  • Symbol类型:不能转为数字,会报错
  • 对象:会先被转换为相应的基本类型值,如果返回的是非数字的基本类型值,则再遵循以上规则将其强制转换为数字。
console.log(Number(null)); //0
console.log(Number(undefined)); //NaN
console.log(Number(true)); //1
console.log(Number(false)); // 0
console.log(Number("10")); //10
console.log(Number("")); //0
console.log(Number("10a")); //NaN
console.log(Number(Symbol("a"))); //TypeError: Cannot convert a Symbol value to a number
console.log(Number([])); // 0
console.log(Number(["1"])); // 1
console.log(Number({})); // NaN

对象转原始类型

上面提到了如果是对象,则会先被转为基本类型,那么这个过程到底是怎么样的?

其实,对象转原始类型,会调用内置的ToPrimitive方法,逻辑如下:

  1. 如果有Symbol.toPrimitive()方法,优先调用再返回
  2. 调用valueOf(),如果转换为原始类型,则返回
  3. 调用toString(),如果转换为原始类型,则返回
  4. 如果都没有返回原始类型,会报错

注意:Date是个例外,要先调用toString,再调用valueOf来转换

来看下面的几个例子:

1.有Symbol.toPrimitive()方法,优先调用返回。

var obj = {
  value: 3,
  valueOf() {
    return 4;
  },
  toString() {
    return '5'
  },
  [Symbol.toPrimitive]() {
    return 6
  }
}
console.log(obj + 1); // 输出7

2.toString 返回的不是基本类型值,valueOf 返回的基本类型值。

// toString 返回的不是基本类型值,valueOf 返回的基本类型值
var obj = {
  toString: function () {
    return {};
  },
  valueOf: function () {
    return null;
  },
};
console.log(String(obj)); // "null"

 3.valueOf和toString都没有返回原始类型,会报错。

// 先判断valueOf⽅法,再判断toString⽅法,返回的都不是基本类型值,报错
var obj = {
  valueOf: function () {
    return {};
  },
  toString: function () {
    return {};
  },
};
console.log(Number(obj)); // Uncaught TypeError: Cannot convert object to primitive value

隐式类型转换

在开发中,为什么建议大家使用===而不是==呢?

其实主要原因就是需要避免==所带来的隐式类型转换,下面就来看看js中有着很多坑的隐式转换。

JavaScript中的隐式类型转换主要发生在+、-、*、/以及==、>、<这些运算符之间。而这些运算符只能操作基本类型值,所以在进行这些运算前的第一步就是将两边的值用上面的ToPrimitive方法转换成基本类型,再进行操作。

不同操作符的隐式转换规则不同。

  • +操作符

两边有至少一个string类型变量时,两边的变量都会被隐式转换为字符串;其他情况下两边的变量都会被转换为数字。

1 + "23"; // '123'
1 + false; // 1
1 + Symbol(); // Uncaught TypeError: Cannot convert a Symbol value to a number
"1" + false; // '1false'
false + true; // 1
  •  -*\操作符

一律转换成数值后计算。

1 * "23"; // 23
1 * false; // 0
1 / "aa"; // NaN
  • <>比较符

两边都是字符串,则比较字母表顺序;其他情况下,转换为数字再比较。

"ca" < "bd"; // false
"a" < "b"; // true
"12" < 13; // true
false > -1; // true
  • ==操作符

==的隐式转换规则相对来说比较复杂,它的转换规则如下:

  1. 两边的类型是否相同,相同的话就比较值的大小
  2. 判断两边是否是null和undefined,是的话就返回true
  3. 判断的类型是否是String和Number,是的话,把String类型转换成Number,再进行比较
  4. 判断其中一方是否是Boolean,是的话就把Boolean转换成Number,再进行比较
  5. 如果其中一方为Object,且另一方为String、Number或者Symbol,会将Object转换成字符串,再进行比较

其实可以概括一下:两边的值都尽量转成Number

console.log(3 == true); //false
console.log("0" == false); //true
console.log("0" == 0); //true
console.log({ a: 1 } == true); //false
console.log({ a: 1 } == "[object Object]"); //true

了解了上面的规则后,来看下面几道经典的题。

1.[]==[]的结果是什么?为什么?

答案为false。

原因:==两边都是对象的话,仅当它们引用同一个对象时返回true。数组是引用数据类型,在创建两个不同的数组时,引用的是两个不同的对象,所以不同。

2.[] == ![]结果是什么?为什么?

答案为true。

原因:先算右边(!的优先级要大于==),右边的结果是布尔值,那么根据上面==的隐式转换规则4,两边都转换成数字然后进行比较。左边[]转换为数字为0。右边![] 首先是转换为布尔值,由于[]作为一个引用类型转换为布尔值为true,因此![]为false,进而在转换成数字,变为0。0 == 0 , 所以结果为true。

3.如何让if(a == 1 && a == 2)条件成立?

其实就是利用==的隐式类型转换以及对象转原始类型的过程。

var a = {
  value: 0,
  valueOf: function() {
    this.value++;
    return this.value;
  }
};
// 利用隐式类型转换,对象需要先转原始类型,再应用隐式类型转换规则
console.log(a == 1 && a == 2);//true

结语

🔥如果此文对你有帮助的话,欢迎💗关注、👍点赞、⭐收藏✍️评论支持一下博主~ 文章来源地址https://www.toymoban.com/news/detail-754690.html

到了这里,关于10分钟的时间,带你彻底搞懂JavaScript数据类型转换的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 一文带你彻底搞懂Nginx反向代理

    举一个通俗的例子,因为众所周知的原因,我们无法访问谷歌,但是因为某些原因,我们必须要访问谷歌,这时候我们会买一个“梯子”,既然我们无法直接访问谷歌,我们就去麻烦“梯子”帮助我们访问。 事实上我们还是没法访问谷歌,只是这个“梯子”能够访问,它只是

    2024年02月04日
    浏览(30)
  • 12分钟从Executor自顶向下彻底搞懂线程池

    上篇文章 13分钟聊聊并发包中常用同步组件并手写一个自定义同步组件 聊到并发包中常用的同步组件,并且还手把手实现了自定义的同步组件 本篇文章来聊聊并发包下的另一个核心-线程池 阅读本文大概12分钟 通读本篇文章前先来看看几个问题,看看你是否以及理解线程池

    2024年02月09日
    浏览(23)
  • 数据结构与算法之美学习笔记:41 | 动态规划理论:一篇文章带你彻底搞懂最优子结构、无后效性和重复子问题

    本节课程思维导图: 今天,我主要讲动态规划的一些理论知识。学完这节内容,可以帮你解决这样几个问题:什么样的问题可以用动态规划解决?解决动态规划问题的一般思考过程是什么样的?贪心、分治、回溯、动态规划这四种算法思想又有什么区别和联系? 什么样的问

    2024年02月02日
    浏览(54)
  • 万字长文,带你彻底搞懂 HTTPS(文末附实战)

    大家好,我是满天星,欢迎来到我的技术角落,本期我将带你一起来了解 HTTPS。 PS:本文首发于微信公众号:技术角落。感兴趣的同学可以查看并关注:https://mp.weixin.qq.com/s/HbEhD93S7y3p8amlzS2sKw 其实网上写 HTTPS 的文章也不少了,但是不少文章都是从原理上泛泛而谈,只讲概念,

    2023年04月14日
    浏览(35)
  • 花一分钟彻底搞懂Mac输入法/中英文/大小写切换

    最近有麦友说:没搞懂 Mac 怎么切换输入法、中英文和大小写,比如以前点按大写锁定键就可以切换到大写,现在要长按。有的时候点按大写锁定键或 shift 键都可以切换中英文,有的时候又不行。切换的时候基本就是碰运气瞎按。 之所以会有这种感觉,可能是因为以下几点:

    2024年02月07日
    浏览(45)
  • Linux 有哪些搜索方式?5分钟带你搞懂!

    5分钟带你掌握 Linux 的三种搜索方式 1.find 命令 find 命令是用来在给定的目录下查找符合给定条件的文件 语法格式: find [查找起始路径] [查找条件] [处理动作] (1)根据名称查找: find [查找起始路径] -name 文件名 或者 find [查找起始路径] -iname 文件名 -name \\\"PATERN\\\":完全匹配文

    2024年01月16日
    浏览(31)
  • 【SpringMVC】一文带你彻底搞懂SpringMVC的工作流程(最强详解!!)

    目录 首先来说明一下,SpringMVC的各个组成部分 DispatcherServlet  HandlerMapping Handler(通常就是Controller)  HandlerAdapter  ViewResolver View  SpringMVC具体的工作流程  是SpringMVC的核心部分,是 一种前端控制器 ,由框架所提供 作用:统一处理请求和响应。除此之外也是 整个控制流程的

    2024年02月11日
    浏览(33)
  • 大数据学习之Flink,10分钟带你初步了解Flink

    目录 前摘 一、认识Flink的Logo​编辑 二、了解Flink的起源 三、了解Flink的发展 四、明白Flink的定位 五、Flink主要的应用场景 六、流式数据处理的发展和演变 1. 流处理和批处理 2. 传统事务处理 2.1传统事务处理架构​编辑 3. 有状态的流处理 4. Lambda 架构 5. 新一代流处理器 七、

    2024年02月20日
    浏览(37)
  • 3分钟搞懂:JavaScript 和 ECMAScript

    ECMAScript 是 JavaScript 语言的 国际标准 ,JavaScript 是 ECMAScript 的 一种实现 (Adobe ActionScript 和 JScript 同样实现了 ECMAScript)。 ECMAScript 是欧洲计算机制造商协会 ECMA(European Computer Manufacturers Association)发布的浏览器脚本语言标准。它是 262 号标准文件,又叫 ECMA-262。 ECMAScript 定义

    2023年04月22日
    浏览(36)
  • 【Spring框架】一篇文章带你彻底搞懂Spring解决循环依赖的底层原理

    目录 一、前言 二、什么是循环依赖 三、Spring Bean 的循环依赖问题 3.1 Bean 的创建步骤 3.2 为什么 Spring Bean 会产生循环依赖问题? 3.3 什么情况下循环依赖可以被处理? 四、Spring 如何解决循环依赖问题? 4.0 什么是三级缓存 4.1 简单的循环依赖(没有AOP) 4.1.0 创建Bean的前期流

    2024年04月17日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包