类型转换

文中的值类型等价于所说的基础类型,其范围是(boolean,string,number)

转换为基础类型

布尔值

  • undefinednullfalseNaN''0 --> false
  • 其它值都,包括所有对象 --> true

数字

  • 数组

    • [] --> 0: 空数组转为0
    • [1] --> 1: 含有一个元素且为数字则转换为数字
    • [1,2] --> NaN: 其余情况转为NaN
    • ['abc',1] --> NaN: 其余情况转为NaN
  • 值类型
    • null --> 0
    • '123' --> 123: 纯数字构成的字符串直接转换为对应的数字
    • true --> 1
    • false --> 0
    • '124a' --> NaN
    • undefined --> NaN
    • Symbol --> 抛出错误
  • 除了数组之外的引用类型(Object) --> NaN

字符串

  • 666 --> '666': 数字可直接转为字符串
  • 布尔值:布尔值直接转换
    • true --> 'true'
    • false --> 'false'
  • 数组
    • [] --> '' :空数组转为空串
    • [2,'3'] --> '2,3' :非空数组的每一项转为字符串再用,分割
  • 对象:
    • {} --> [object Object]
    • {a:1} --> [object Object]

对象转基础类型规则

对象在转换类型的时候,会调用内置的 [[ToPrimitive]] 函数,对于该函数来说,算法逻辑一般来说如下:

  1. 如果已经是基础类型了,那就不需要转换了
  2. 目标类型为字符串就先调用 toString
    • 转换为基础类型的话就返回转换的值
  3. 目标类型不为字符串就先调用 valueOf
    • 结果为基础类型,就返回转换的值
    • 结果不是基础类型的话再调用 toString
  4. 如果都没有返回基础类型,就会报错

各种情况举例

const demo1 = {
[Symbol.toPrimitive]: function () {
return 2
}
}
// 情况1
console.log(demo1 + 1); // 3 const demo2 = {
toString() {
return 'demo2'
},
valueOf() {
return 20
}
}
// 情况2
console.log(String(demo2)) // demo2 // 情况3-1
console.log(demo2 - 3); // 17 const demo3 = {
toString() {
return 30
},
valueOf() {
return {}
}
}
// 情况3-2
console.log(demo3 - 4); // 26 const demo4 = {
toString() {
return {}
},
valueOf() {
return {}
}
}
// 情况4
console.log(demo4 + 1); // 报错

四则运算符

加法

  • 有一方为String,那么另一方也会被转为String
  • 一方为Number,另一方为原始值类型,则将原始值类型转换为Number
  • 一方为Number,另一方为引用类型,双方都转为String

其它

除了加法的运算符来说(-,*,/),会将非Number类型转换为Number类型

转换示例

'123'+4 // '1234'

123+true // 124
123+undefined // NaN
123+null // 123 123+[] // '123'
123+{} // '123[object Object]'

比较运算符

==

  1. NaN不等于任何其它类型
  2. Boolean 与其它类型进行比较,Boolean转换为Number
  3. StringNumber进行比较,String 转化为Number
  4. nullundefinde进行比较结果为true
  5. null,undefined与其它任何类型进行比较结果都为false
  6. 引用类型值类型进行比较,引用类型先转换为值类型(调用[ToPrimitive])
  7. 引用类型引用类型,直接判断是否指向同一对象

举例

[]==![] // true
// [] == false 1. 根据运算符优先级 ![] --> false
// [] == 0 2. 上面规则2
// '' == 0 3. 上面规则6
// 0 == 0 4. 上面规则3
// 所以结果为true

参考

思否-前端碎碎念 之 为什么[] == ![] ?

freeCodeCamp-Javascript 隐式类型转换,一篇就够了

offer收割机--js的隐式类型转换规则整理的更多相关文章

  1. JS当心隐式的强制转换

    JavaScript对类型错误出奇的宽容 3 + true; // 4 null + 3; // 3 运算符+(加号)的重载 运算符+既重载了数字相加,又重载了字符串连接操作.具体是数字相加还是字符串 ...

  2. javascript中的隐式类型转化

    javascript中的隐式类型转化 #隐式转换 ## "+" 字符串和数字 如果某个操作数是字符串或者能够通过以下步骤转换为字符串的话,+将进行拼接操作. 如果其中一个操作数是对 ...

  3. C#中的隐式类型var——详细示例解析

    从 Visual C# 3.0 开始,在方法范围中声明的变量可以具有隐式类型var.隐式类型可以替代任何类型,它的具体类型由编译器根据上下文推断而出. 下面就让我来总结下隐式类型的一些特点: 1.va ...

  4. .NET中那些所谓的新语法之一:自动属性、隐式类型、命名参数与自动初始化器

    开篇:在日常的.NET开发学习中,我们往往会接触到一些较新的语法,它们相对以前的老语法相比,做了很多的改进,简化了很多繁杂的代码格式,也大大减少了我们这些菜鸟码农的代码量.但是,在开心欢乐之余,我们也 ...

  5. Linq之隐式类型、自动属性、初始化器、匿名类

    目录 写在前面 系列文章 隐式类型 自动属性 初始化器 匿名类 总结 写在前面 上篇文章是本系列的小插曲,也是在项目中遇到,觉得有必要总结一下,就顺手写在了博客中,也希望能帮到一些朋友.本文将继续介绍 ...

  6. C#隐式类型

    隐式类型 using System; using System.Collections.Generic; using System.Linq; using System.Text; using Sys ...

  7. C#语法糖之第一篇:自动属性&隐式类型

    今天给大家分享一下C#语法糖的简单的两个知识点吧. 自动属性:在 C# 4.0 和更高版本中,当属性的访问器中不需要其他逻辑时,自动实现的属性可使属性声明更加简洁. 客户端代码还可通过这些属性创建对象 ...

  8. C#杂记-隐式类型的局部变量

    基础知识:方法中声明的变量,叫局部变量 普通局部变量:有明确数据类型. string name; 隐式类型的局部变量:使用“var”代替明确的数据类型. var name = "abc&qu ...

  9. js数据类型隐式转换问题

    js数据类型隐式转换 ![] == false //true 空数组和基本类型转换,会先[].toString() 再继续比较 ![] == [] //true ![] //false [] == [ ...

  10. C#3.0新特性:隐式类型、扩展方法、自动实现属性,对象/集合初始值设定、匿名类型、Lambda,Linq,表达式树、可选参数与命名参数

    一.隐式类型var 从 Visual C# 3.0 开始,在方法范围中声明的变量可以具有隐式类型var.隐式类型可以替代任何类型,编译器自动推断类型. 1.var类型的局部变量必须赋予初始值,包括匿名 ...

随机推荐

  1. ElasticSearch7.3学习(三十三)----kibana之Grok Dubugger

    在ElasticSearch7.3学习(三十二)----logstash三大插件(input.filter.output)及其综合示例中学到logstash使用filter插件进行数据清洗,grok是 ...

  2. 【题解】P9749 [CSP-J 2023] 公路

    \(Meaning\) \(Solution\) 这道题我来讲一个不一样的解法:\(dp\) 在写 \(dp\) 之前,我们需要明确以下几个东西:状态的表示,状态转移方程,边界条件和答案的表示. 状态 ...

  3. 2.列表--《Python编程:从入门到实践》

    2.1 列表   列表由一系列按特定顺序排列的元素组成.在Python中,用方括号([])来表示列表,并用逗号来分隔其中的元素. bicycles = ['trek', 'cannondale', ' ...

  4. 《ASP.ENT Core 与 RESTful API 开发实战》-- (第4章)-- 读书笔记(下)

    第 4 章 资源操作 4.5 创建资源 由于创建资源的 Id 会在服务端生成,因此在创建资源时,不建议使用与获取数据时相同的 DTO,而要单独创建一个新的 DTO 类,并通过数据注解特性对相应 的属性 ...

  5. MySQL-面试知识点汇总

    1. DQL相关 2. DDL.DML.DCL相关 3.架构相关 3.1 MySQL的复制原理以及流程 主从复制:将主数据库中的DDL和DML操作通过二进制日志(BINLOG)传输到从数据库上,然后将 ...

  6. NC23413 小A买彩票

    题目链接 题目 题目描述 小A最近开始沉迷买彩票,并且希望能够通过买彩票发家致富.已知购买一张彩票需要3元,而彩票中奖的金额分别为1,2,3,4元,并且比较独特的是这个彩票中奖的各种金额都是等可能的. ...

  7. 【Unity3D】立方体纹理(Cubemap)和天空盒子(Skybox)

    1 立方体纹理(Cubemap) ​ 本文完整资源见 → 立方体纹理(Cubemap)和天空盒子(Skybox) . ​ 1)立方体纹理简介 ​ 立方体纹理是指由上.下.左.右.前.后 6 张纹理组成 ...

  8. 原来你是这样的JAVA--[07]聊聊Integer和BigDecimal

    今天来聊聊Java中跟数值处理相关的两个类型Integer和BigDecimal. 说起这两个类型,我们肯定都不陌生,但是其中有些容易踩到的坑需要注意避让. Integer 整型我们应该每天都会用到, ...

  9. 常用Windows控制台命令

    查看网络连接信息 1.查看所有网络连接 netstat -ano -a 显示所有连接和侦听端口. -n 以数字形式显示地址和端口号. -o 显示拥有的与每个连接关联的进程 ID. 详细的使用方式使用n ...

  10. 在vmware里安装ubuntu的简单过程(具体的见网址)

    在官网选择vmware版本为16,安装后,在vmware里升级到最新版.(这个可以解决蓝屏) 在下面的这个文章里下载ubuntu的镜像文件iso,我下载的是16年的,内存为1.6GB,下载的时间用的少 ...