当前位置: 首页 > news >正文

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 “”

基本类型值在不同操作符的情况下隐式转换的规则

  1. +运算符的两边有至少一个string类型时,两边都会被隐式转换为字符串;其他情况下两边都会被转换为数字
  2. 其他算术运算符会将两边转成Number类型
  3. ==比较复杂

如果任一操作数是布尔值,则将其转化为数值再比较是否相等。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&#xf…...

家政系统预约小程序具备哪些功能?

预约家政小程序有这么大的市场需求加上这么多的好处,相信未来发展前景不错。也必将吸引很多商家投资者着手开发属于自己的上门家政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样式&#xff0c;我们可以直接引用 下载 Link-BootStrap 解压&#xff0c;并放入到当前项目中 引用 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</tit…...

【EI会议征稿】2024年遥感技术与测量测绘国际学术会议(RSTSM 2024)

2024年遥感技术与测量测绘国际学术会议&#xff08;RSTSM 2024&#xff09; 2024 International Conference on Remote Sensing Technology and Survey Mapping 2024年遥感技术与测量测绘国际学术会议&#xff08;RSTSM 2024&#xff09;将在2024年1月12-14日于吉林长春召开。…...

灵感:VUE2实现权限按钮控制

运用场景&#xff1b; 根据权限码&#xff0c;实现判断当前用户是否能控制权限按钮 一、在main.JS 里面写入全局指令《自定义权限按钮》 // S 自定义按钮权限 Vue.directive(has, {inserted: function(el, binding) {const buttonList JSON.parse(localStorage.getItem(butt…...

【2023最新版】Python全栈知识点总结

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

推荐系统离线评估方法和评估指标,以及在推荐服务器内部实现A/B测试和解决A/B测试资源紧张的方法。还介绍了如何在TensorFlow中进行模型离线评估实践。

文章目录 &#x1f31f; 离线评估&#xff1a;常用的推荐系统离线评估方法有哪些&#xff1f;&#x1f34a; 1. RMSE/MSE&#x1f34a; 2. MAE&#x1f34a; 3. Precision/Recall/F1-score&#x1f34a; 4. Coverage&#x1f34a; 5. Personalization&#x1f34a; 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 是印度规模增长最快的电器公司之一&#xff0c;专注于照明、风扇等电器产品&#xff0c;正在进军健康和安全领域&#xff0c;现已推出紫外线消毒器和安全摄像头。Halonix 致力于创新&#xff0c;不断采用新兴前沿技术实现产品迭代&#xff0c;并通过加强设备间的互联互…...

【Linux】adduser命令使用

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

中文连续视觉语音识别挑战赛

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

(ubuntu) 安装JDK

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

工程管理系统源码之全面+高效的工程项目管理软件

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

CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型

CVPR 2025 | MIMO&#xff1a;支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题&#xff1a;MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者&#xff1a;Yanyuan Chen, Dexuan Xu, Yu Hu…...

Opencv中的addweighted函数

一.addweighted函数作用 addweighted&#xff08;&#xff09;是OpenCV库中用于图像处理的函数&#xff0c;主要功能是将两个输入图像&#xff08;尺寸和类型相同&#xff09;按照指定的权重进行加权叠加&#xff08;图像融合&#xff09;&#xff0c;并添加一个标量值&#x…...

页面渲染流程与性能优化

页面渲染流程与性能优化详解&#xff08;完整版&#xff09; 一、现代浏览器渲染流程&#xff08;详细说明&#xff09; 1. 构建DOM树 浏览器接收到HTML文档后&#xff0c;会逐步解析并构建DOM&#xff08;Document Object Model&#xff09;树。具体过程如下&#xff1a; (…...

项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)

Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败&#xff0c;具体原因是客户端发送了密码认证请求&#xff0c;但Redis服务器未设置密码 1.为Redis设置密码&#xff08;匹配客户端配置&#xff09; 步骤&#xff1a; 1&#xff09;.修…...

基于Java+MySQL实现(GUI)客户管理系统

客户资料管理系统的设计与实现 第一章 需求分析 1.1 需求总体介绍 本项目为了方便维护客户信息为了方便维护客户信息&#xff0c;对客户进行统一管理&#xff0c;可以把所有客户信息录入系统&#xff0c;进行维护和统计功能。可通过文件的方式保存相关录入数据&#xff0c;对…...

推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)

推荐 github 项目:GeminiImageApp(图片生成方向&#xff0c;可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…...

JS手写代码篇----使用Promise封装AJAX请求

15、使用Promise封装AJAX请求 promise就有reject和resolve了&#xff0c;就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...

Python Einops库:深度学习中的张量操作革命

Einops&#xff08;爱因斯坦操作库&#xff09;就像给张量操作戴上了一副"语义眼镜"——让你用人类能理解的方式告诉计算机如何操作多维数组。这个基于爱因斯坦求和约定的库&#xff0c;用类似自然语言的表达式替代了晦涩的API调用&#xff0c;彻底改变了深度学习工程…...

用递归算法解锁「子集」问题 —— LeetCode 78题解析

文章目录 一、题目介绍二、递归思路详解&#xff1a;从决策树开始理解三、解法一&#xff1a;二叉决策树 DFS四、解法二&#xff1a;组合式回溯写法&#xff08;推荐&#xff09;五、解法对比 递归算法是编程中一种非常强大且常见的思想&#xff0c;它能够优雅地解决很多复杂的…...

Android屏幕刷新率与FPS(Frames Per Second) 120hz

Android屏幕刷新率与FPS(Frames Per Second) 120hz 屏幕刷新率是屏幕每秒钟刷新显示内容的次数&#xff0c;单位是赫兹&#xff08;Hz&#xff09;。 60Hz 屏幕&#xff1a;每秒刷新 60 次&#xff0c;每次刷新间隔约 16.67ms 90Hz 屏幕&#xff1a;每秒刷新 90 次&#xff0c;…...