JavaScript中数据类型的相互转换及一元、二元+运算符和==运算符

在JavaScript中,我们经常需要将不同的数据类型进行转换。今天我们将来介绍如何进行各种数据类型之间的转换。

原始类型之间的转换

1. 转数字

JavaScript提供了多种将其他数据类型转换为数字的方法:

使用Number函数

  • 布尔:false为0,true为1。

    javascript 复制代码
    console.log(Number(false));// 0
    console.log(Number(true)); // 1
  • 字符串:字符串类型的数字转为原本的数字,空字符串为0,其他的字符串则为NaN。

    javascript 复制代码
    console.log(Number('123')); //123
    console.log(Number('')); // 0
    console.log(Number('hello')); // NaN
  • 若不传参,则默认为0,undefined转换为NaN,null转换为0.

    javascript 复制代码
    console.log(Number());//默认0
    console.log(Number(undefined)); //NaN
    console.log(Number(null)); // 0

使用parseInt和parseFloat函数

parseInt()函数用于将字符串转换为整数,parseFloat()函数用于将字符串转换为浮点数。

使用一元加号运算符(+)

一元加号运算符(+)可以将其他数据类型转换为数字。例如,+"10"将字符串"10"转换为数字10。

2. 转布尔

  • 数字:除了0和NaN,其他所有数字都会被转换为true。

    javascript 复制代码
     console.log(Boolean(1));//true
     console.log(Boolean(-1));//true
     console.log(Boolean(0));//false
     console.log(Boolean(NaN));//false
     

    我们经常会看到类似这样的代码:

    scss 复制代码
    if(1){
        console.log('hello');
    }
     

    实际上就是将数字1转换成了布尔类型true。

  • 字符串:除了空字符串(""),其他所有字符串都会被转换为true。

    javascript 复制代码
    console.log(Boolean('123'));// true
    console.log(Boolean(''));//false
  • 若不传参,则默认为false,undefined和null转换后都为false。

    javascript 复制代码
    console.log(Boolean());// 默认false
    console.log(Boolean(undefined));//false
    console.log(Boolean(null));//false

3. 转字符串

  • 使用String函数:可以使用String()函数将其他数据类型转换为字符串。

    javascript 复制代码
    console.log(String());// 默认''
    console.log(String(undefined));// 'undefined'
    console.log(String(null)); // 'null'
    console.log(String(true)); // 'true'
    console.log(String(false)); // 'false'
    console.log(String(123)); // '123'
    console.log(String(NaN)); // 'NaN'
  • 使用toString方法:对于数字、布尔值和对象,都可以使用toString()方法将其转换为字符串。例如,(10).toString()将数字10转换为字符串"10"。

  • 使用模板字符串:使用反引号(``)包裹的模板字符串可以将其他数据类型转换为字符串。

    javascript 复制代码
    console.log(`${10}`); // "10"

4. 转对象

使用Object()构造函数:

javascript 复制代码
  console.log(Object()); //{}
  console.log(Object(null));//{}
  console.log(Object(undefined));//{}
  console.log(Object('hello'));// String{'hello'}
  console.log(Object(123));// Number{123}
  console.log(Object(true));// Boolean{true}
  

对象转原始类型

我们要将对象转字原始类型有obj.toString()和obj.valueOf()两种方法,对象调用toSting()方法会返回一个字符串"[object class]",其中class为得到的原始类型。

toString()在js中有多个版本:

  • 数组的toString()会将数组中的所有元素转换成字符串并以逗号拼接,而不是像上面所说的"[object class]"。
  • 函数的toString()会将整个函数体以字符串形式返回。
  • Date的toString()会将整个Date以字符串形式返回。

而valueOf()是只对包装类生效的,我们用它去转普通的对象是转不动的:

我们定义一个字符串对象str:

再去使用valueOf(),就能得到一个字符串了:

1. 对象转布尔: 所有的引用类型转布尔都为true。

2. 对象转字符串

我们首先要认识一下v8内部的一个方法ToPrimitive(),它是只供v8本身使用而我们不能使用的。当我们想要将对象转字符串时,v8内部的转换原理是ToPrimitive(obj,String):

  • 判断obj是基本类型则返回
  • 否则调用toString()方法,如果得到原始类型,则返回
  • 否则调用valueOf()方法,如果得到原始类型,则返回
  • 否则报类型错误TypeError

3. 对象转数字

转数字也一样,ToPrimitive(obj,Number),但转数字是先调用valueOf()方法:

  • 判断obj是基本类型则返回
  • 否则调用valueOf()方法,如果得到原始类型,则返回
  • 否则调用toString()方法,如果得到原始类型,则返回
  • 否则报类型错误TypeError

原理知道了,现在我们来练习一下:

javascript 复制代码
  console.log(Number({}));

这个的打印结果是什么呢?它实际上就是对象转数字,{}不是基本类型也不是包装类,那么就到了第三步调用toString()方法,我们上面讲过了对象调用toString()方法会返回"[object class]", 所以此时会返回"[object Object]" ,v8的ToPrimitive()方法执行到这里就下班了,此时留下的就是Number('[object Object]'),就变成了原始类型字符串转数字了,而我们之前讲过这种情况得到的将会是NaN。其实就是转了两次,将对象转换成原始类型,再将原始类型转换成我们想要的原始类型。

那我们再来练习一下:

javascript 复制代码
  console.log(String([]))

对象转字符串,[]不是基本类型,那么到第二步调用数组的toString()方法,变成了一个空字符串'',那么就是String(''),得到的还是空字符串''

一元运算符

我们想要将一个其他类型转化成数字,除了用Number(),还有其他方法,那就是用一元运算符'+',一元 + 运算符将其操作数转换为Number类型。比如说:

那如果是 +[] 呢?我想你现在应该知道是要将[]转换成Number类型,那么之后的步骤你应该也清楚了,和之前的一样,空数组调用toString()方法得到空字符串,空字符串转换成Number类型为数字0。

二元运算符

二元运算符'+',我们可以看成是:

v1 + v2 === ToPrimitive(v1) + ToPrimitive(v2)

  1. 如果ToPrimitive(v1)是字符串或者ToPrimitive(v2)是字符串,则返回将不是字符串的一方转为字符串再进行拼接后的结果。
  2. 否则都转成Number进行加法运算。

我们来看例子: [] + {} 这个的结果是什么呢?它进行toString()转换后就是 '' + '[object Object]',两边都是字符串进行拼接,所以结果还是'[object Object]'。

但是,将它们的位置换一下变成 {} + [] ,如果用node执行,结果不变,用v8执行的话,结果会是0,这是怎么一回事呢?

v8会把它看成两行:

css 复制代码
  {}
  +[]
  

那么执行过程就是{} => {}, +[] => 0, 所以结果会为零,这里需要注意一下,万一面试官故意挑点恶心人的题目问你,虽然两种情况都对,那你也能回答得更全面一点。

== 相等

==也会发生隐式类型转换,而===不会,它必须值和类型都相等才能判定为相等。

需要注意的是,官方文档上规定:

如果等号两边为Number和String或Boolean或引用类型,那么都是将其转换为Number再去判断值。

我们再来看:

两个空数组它们是两个对象,存储的地址都不一样,是不会相等的。

最后我们真正要讲的是这个东西: [] == ![], 如果你能正确解出这个,那么你的类型转换就毕业了。

感叹号的优先级更高,那么![]会先转换成布尔类型false,还是判断不了,然后再变成Number类型0,现在就是判断 [] == 0[]转换成''再变成0,所以结果是true,你答对了吗?

本文的知识点到这就讲完啦,欢迎下次再来一起学习哦ヾ(◍°∇°◍)ノ゙!!

相关推荐
编程零零七1 小时前
Python数据分析工具(三):pymssql的用法
开发语言·前端·数据库·python·oracle·数据分析·pymssql
北岛寒沫2 小时前
JavaScript(JS)学习笔记 1(简单介绍 注释和输入输出语句 变量 数据类型 运算符 流程控制 数组)
javascript·笔记·学习
everyStudy2 小时前
JavaScript如何判断输入的是空格
开发语言·javascript·ecmascript
(⊙o⊙)~哦3 小时前
JavaScript substring() 方法
前端
无心使然云中漫步4 小时前
GIS OGC之WMTS地图服务,通过Capabilities XML描述文档,获取matrixIds,origin,计算resolutions
前端·javascript
Bug缔造者4 小时前
Element-ui el-table 全局表格排序
前端·javascript·vue.js
xnian_4 小时前
解决ruoyi-vue-pro-master框架引入报错,启动报错问题
前端·javascript·vue.js
麒麟而非淇淋5 小时前
AJAX 入门 day1
前端·javascript·ajax
2401_858120535 小时前
深入理解MATLAB中的事件处理机制
前端·javascript·matlab
阿树梢5 小时前
【Vue】VueRouter路由
前端·javascript·vue.js