js中隐式类型转换与toPrimitive
前言
我们知道Js的隐式类型转换主要出现在有运算符的情况下【逻辑运算符、关系运算符、算术运算符】。那么在接触toPrimitive之前,我们需要先知道其他值到某个类型值的转换规则。
其他值到数值的转换规则
Boolean: true — 1 false — 0
Null:0
Undefined:NaN
String:若仅含数字,则结果跟用Number()强制转换一致,若存在非数字字符,则返回NaN
Symbol不能转换,会报错。
对象:会先转换成其对应的原始类型值【也就是基本类型值,像undefined就是基本数据类型,它的值也是Undefined,就是基本类型值】,如果返回的是非数字的原始类型值,就根据上述规则进行类型转换。
将对象转换成对应的原始类型值,就是进行toPrimitive抽象操作,他会根据传进来的对象以及目标类型,在内部调用不同方法(这里后文会细说),在对于目前对象到数值的转换中,它会优先调用valueOf(),返回结果如果是基本类型值,则直接使用,否则会继续调用toString()。如果这两个方法都不返回原始类型值,则会抛出TypeError。
其他值到字符串的转换规则
null:“null”
undefined: “undefined”
Boolean:true — “true” false — “false”。
Number :直接转换,极小和极大的数字会使用指数形式。
Symbol :只允许显式强制类型转换,使用隐式强制类型转换会产生错误。
const symbol2 = Symbol(42);
const symbol3 = Symbol('foo');console.log(String(symbol2));
// Expected output: falseconsole.log(symbol3.toString());
// Expected output: "Symbol(foo)"
对象:也是一样会先转换成其对应的原始类型值,再根据上述规则进行类型转换。不过在这里toPrimitive抽象操作会变成优先调用toString(),再降级到valueOf()。那么我们知道,除非该对象自定义了 toString() 方法,否则调用 toString()一定会是会沿着原型链调用到原型的toString()(Object.prototype.toString())来返回内部属性 [[Class]] 的值。
let obj ={toString:function(){return 'a'}
}
console.log(obj=='a')//true
let obj1 ={}
console.log(obj1=='a')//false
//上述过程说明是调用了toString()
let obj1 ={toString:function(){return 1}
}
console.log(obj1=='1')//true
//上述过程说明是拿到对应的原始类型值,再根据规则进行类型转换
let obj2 ={toString:function(){return {}},valueOf:()=>{return 1}
}
console.log(obj2=='1')//true
//上述过程说明是优先调用toString(),再降级到valueOf()去拿到对应的原始类型值
其他值到布尔值的转换规则
假值: undefined null false +0 -0 NaN “”
基本类型值在不同操作符的情况下隐式转换的规则
- +运算符的两边有至少一个string类型时,两边都会被隐式转换为字符串;其他情况下两边都会被转换为数字
- 其他算术运算符会将两边转成Number类型
- ==比较复杂
如果任一操作数是布尔值,则将其转化为数值再比较是否相等。false转化为0,true转化为1.
如果一个操作数是字符串,另一个操作数是数值,则会尝试将字符串转化为数值,再比较是否相等。
如果一个操作数是对象,另一个不是,则获取其原始值,再根据前面的规则进行比较。
在比较时,有如下特殊情况,那就是存在undefined与null的情况:
null和undefined相等
null和undefined不能转化为其他类型的值再进行比较。(那就是如果一边存在null和undefined,另一边若不是null或undefined,直接返回false)
若有任一操作数是NaN,则直接返回false。(另外,NaN是Number类型,但是是所有数据类型中唯一与自身不全等的数。在Object.is(NaN,NaN)中才会返回true。)
若两个操作数都是对象,则比较他们指向的是不是同一个对象。如果两个操作数都指向同一个对象,则会返回true,否则返回false。
toPrimitive是何方神圣
根据前面的规律,我们发现总有到对象的转换才需要用到toPrimitive。
然后它的本质上是:
ToPrimitive(input, PreferredType)
input是调用的对象,PreferredType是期望返回的结果类型
a:判断input是否是对象,如果不是直接return input
b:根据PreferredType定义hint,hint的取值一共有三种情况:‘default’(PreferredType为空), ‘number’(PreferredType是number), ‘string’(PreferredType是string)
c:判断该对象是否有Symbol.toPrimitive方法, 如果有则传入参数hint进行调用,若执行结果是基本类型,则return该结果,否则抛出TypeError。
d:如果hint是’default’,则改为’number’。也就是说默认是按’number’。除了Date对象,和Symbol对象。Date对象转换时hint参数是String。Symbol对象进行类型转换会抛出异常。
e: 执行OrdinaryToPrimitive运算 如果hint是’string’,调用toString方法,得到的是原始数据类型,返回该值;否则调用valueOf方法,如果得到的是原始数据类型,返回该值;否则抛出异常 如果hint是’number’,则相反;先调用valueOf方法,得到的是原始数据类型,返回该值;否则调用toString方法,如果得到的是原始数据类型,返回该值;否则抛出异常
js中加法操作,参数PreferredType一般是Default
+正号操作,参数PreferredType一般是Number
valueOf和toString的返回值
(1)对于Object
valueOf:返回对象本身
toString:返回的是内部属性"[object type]"字符串。
(2)对于Array
valueOf:返回对象本身
toString: 相当于用数组值调用join(‘,’)所返回的字符串。例如:[1,2,3].toString()会是"1,2,3"
let arr=[1,2,3]
let arr1=[]
console.log(arr.toString())//"1,2,3"
console.log(arr.valueOf())//[1, 2, 3]
console.log(arr1.toString())//""
console.log(arr1.valueOf())//[]
参考:聊聊JS中的ToPrimitive原始值转换方法
相关文章:
js中隐式类型转换与toPrimitive
前言 我们知道Js的隐式类型转换主要出现在有运算符的情况下【逻辑运算符、关系运算符、算术运算符】。那么在接触toPrimitive之前,我们需要先知道其他值到某个类型值的转换规则。 其他值到数值的转换规则 Boolean: true — 1 false — 0 Null…...

家政系统预约小程序具备哪些功能?
预约家政小程序有这么大的市场需求加上这么多的好处,相信未来发展前景不错。也必将吸引很多商家投资者着手开发属于自己的上门家政APP小程序软件,在实际的开发过程中需要具备哪些功能呢? 一、用户端功能: 1. 用户注册登录&#x…...
【LeetCode】46. 全排列
1 问题 给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。 示例 1: 输入:nums [1,2,3] 输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]] 示例 2: 输入&#x…...

宏电股份RedCap产品亮相迪拜华为MBBF,并参与RedCap全球商用阶段性成果发布
10月10-11日,由华为主办的第十四届全球移动宽带论坛(MBBF)在阿联酋迪拜成功举办。MBBF期间,华为联合宏电股份等产业伙伴集中发布RedCap商用阶段性成果。本次发布是RedCap产业的关键里程碑,标志着RedCap在全球已具备规模…...
Harris图像角点检测
角点检测算法大致有三类:基于灰度图像的角点检测,基于二值图像的角点检测,基于轮廓曲线的角点检测。基于灰度图像的角点检测又可分为基于梯度、基于模板和基于模板梯度组合3类方法,其中基于模板的方法主要考虑像素领域点的灰度变化,即图像亮度的变化,将与邻点亮度对比足够…...

互联网Java工程师面试题·Java 总结篇·第七弹
目录 68、Java 中如何实现序列化,有什么意义? 69、Java 中有几种类型的流? 70、写一个方法,输入一个文件名和一个字符串,统计这个字符串在这个文件中出现的次数。 71、如何用 Java 代码列出一个目录下所有的文件&a…...
UVa658 It’s not a Bug, it’s a Feature!(Dijkstra)
题意 给出一个包含n个bug的应用程序,以及m个补丁,每个补丁使用两个字符串表示,第一个串表示补丁针对bug的情况,即哪些bug存在,以及哪些bug不存在,第二个串表示补丁对bug的修复情况,即修复了哪些…...
Object 类常用方法
在Java中,java.lang.Object类是所有类的根类,因此所有对象都继承了Object类的方法。以下是Object类中一些常用的方法: equals(Object obj): 用于比较两个对象是否相等。默认实现是比较对象的引用是否相同,但通常需要…...
chromium 52 chrome 各个版本发布功能列表(58-84)
chromium Features 58-84 From https://chromestatus.com/features chromium58 Features:41 ‘allow-top-navigation-by-user-activation’ <iframe sandbox> keyword Adds a new keyword named “allow-top-navigation-by-user-activation” for iframe sandbox, wh…...

python web开发(四): Bootstrap
1.初步了解 别人已经写好的CSS样式,我们可以直接引用 下载 Link-BootStrap 解压,并放入到当前项目中 引用 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</tit…...

【EI会议征稿】2024年遥感技术与测量测绘国际学术会议(RSTSM 2024)
2024年遥感技术与测量测绘国际学术会议(RSTSM 2024) 2024 International Conference on Remote Sensing Technology and Survey Mapping 2024年遥感技术与测量测绘国际学术会议(RSTSM 2024)将在2024年1月12-14日于吉林长春召开。…...
灵感:VUE2实现权限按钮控制
运用场景; 根据权限码,实现判断当前用户是否能控制权限按钮 一、在main.JS 里面写入全局指令《自定义权限按钮》 // S 自定义按钮权限 Vue.directive(has, {inserted: function(el, binding) {const buttonList JSON.parse(localStorage.getItem(butt…...

【2023最新版】Python全栈知识点总结
python全栈知识点总结 全栈即指的是全栈工程师,指掌握多种技能,并能利用多种技能独立完成产品的人。就是与这项技能有关的都会,都能够独立的完成。 全栈只是个概念,也分很多种类。真正的全栈工程师涵盖了web开发、DBA 、爬虫 、…...

推荐系统离线评估方法和评估指标,以及在推荐服务器内部实现A/B测试和解决A/B测试资源紧张的方法。还介绍了如何在TensorFlow中进行模型离线评估实践。
文章目录 🌟 离线评估:常用的推荐系统离线评估方法有哪些?🍊 1. RMSE/MSE🍊 2. MAE🍊 3. Precision/Recall/F1-score🍊 4. Coverage🍊 5. Personalization🍊 6. AUC &…...
day1:Node.js 简介
day1:Node.js 简介 文章目录 day1:Node.js 简介Node.js 是什么?Node.js 的历史和发展 ?Node.js 的主要用途和优势 ?Node.js 是什么? 简单的说 Node.js 就是运行在服务端的 JavaScript。 Node.js 是一个基于 Chrome JavaScript 运行时建立的一个平台。 Node.js 是一个事…...

ESP RainMaker 客户案例 #1|Halonix
Halonix 是印度规模增长最快的电器公司之一,专注于照明、风扇等电器产品,正在进军健康和安全领域,现已推出紫外线消毒器和安全摄像头。Halonix 致力于创新,不断采用新兴前沿技术实现产品迭代,并通过加强设备间的互联互…...

【Linux】adduser命令使用
我们经常在linux系统中创建用户。有时候用的是 useradd 有时候用的是 adduser ,好混乱啊到底用哪个啊。今天咱们一起来学习一下。 adduser与useradd的区别 useradd 命令是内置的 Linux 命令,在任何 Linux 系统中都可用。然而,使用这种低级…...

中文连续视觉语音识别挑战赛
视觉语音识别,也称唇语识别,是一项通过口唇动作来推断发音内容的技术。该技术在公共安全、助老助残、视频验真等领域具有重要应用。当前,唇语识别的研究方兴未艾,虽然在独立词、短语等识别上取得了长足进展,但在大词表…...

(ubuntu) 安装JDK
文章目录 前言参看java版本的命令:安装jdk命令安装jps关闭防火墙:查看端口占用:(坑)ubuntu上Mysql默认标明 区分大小写 前言 提示:常以为人是一个容器,盛着快乐,盛着悲哀。但是人不…...

工程管理系统源码之全面+高效的工程项目管理软件
高效的工程项目管理软件不仅能够提高效率还应可以帮你节省成本提升利润 在工程行业中,管理不畅以及不良的项目执行,往往会导致项目延期、成本上升、回款拖后,最终导致项目整体盈利下降。企企管理云业财一体化的项目管理系统,确保…...

跨链模式:多链互操作架构与性能扩展方案
跨链模式:多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈:模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展(H2Cross架构): 适配层…...

12.找到字符串中所有字母异位词
🧠 题目解析 题目描述: 给定两个字符串 s 和 p,找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义: 若两个字符串包含的字符种类和出现次数完全相同,顺序无所谓,则互为…...
Unit 1 深度强化学习简介
Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库,例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体,比如 SnowballFight、Huggy the Do…...

基于Springboot+Vue的办公管理系统
角色: 管理员、员工 技术: 后端: SpringBoot, Vue2, MySQL, Mybatis-Plus 前端: Vue2, Element-UI, Axios, Echarts, Vue-Router 核心功能: 该办公管理系统是一个综合性的企业内部管理平台,旨在提升企业运营效率和员工管理水…...
掌握 HTTP 请求:理解 cURL GET 语法
cURL 是一个强大的命令行工具,用于发送 HTTP 请求和与 Web 服务器交互。在 Web 开发和测试中,cURL 经常用于发送 GET 请求来获取服务器资源。本文将详细介绍 cURL GET 请求的语法和使用方法。 一、cURL 基本概念 cURL 是 "Client URL" 的缩写…...

在 Spring Boot 中使用 JSP
jsp? 好多年没用了。重新整一下 还费了点时间,记录一下。 项目结构: pom: <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://ww…...

什么是VR全景技术
VR全景技术,全称为虚拟现实全景技术,是通过计算机图像模拟生成三维空间中的虚拟世界,使用户能够在该虚拟世界中进行全方位、无死角的观察和交互的技术。VR全景技术模拟人在真实空间中的视觉体验,结合图文、3D、音视频等多媒体元素…...
离线语音识别方案分析
随着人工智能技术的不断发展,语音识别技术也得到了广泛的应用,从智能家居到车载系统,语音识别正在改变我们与设备的交互方式。尤其是离线语音识别,由于其在没有网络连接的情况下仍然能提供稳定、准确的语音处理能力,广…...

嵌入式学习之系统编程(九)OSI模型、TCP/IP模型、UDP协议网络相关编程(6.3)
目录 一、网络编程--OSI模型 二、网络编程--TCP/IP模型 三、网络接口 四、UDP网络相关编程及主要函数 编辑编辑 UDP的特征 socke函数 bind函数 recvfrom函数(接收函数) sendto函数(发送函数) 五、网络编程之 UDP 用…...

AxureRP-Pro-Beta-Setup_114413.exe (6.0.0.2887)
Name:3ddown Serial:FiCGEezgdGoYILo8U/2MFyCWj0jZoJc/sziRRj2/ENvtEq7w1RH97k5MWctqVHA 注册用户名:Axure 序列号:8t3Yk/zu4cX601/seX6wBZgYRVj/lkC2PICCdO4sFKCCLx8mcCnccoylVb40lP...