JavaScript 类型转换

JavaScript 中有两种类型转换:隐式类型转换和显式类型转换。

隐式类型转换指 JavaScript 在运行时自动将一种类型转换为另一种类型。例如,在数学运算中,JavaScript 会将字符串转换为数字。

显式类型转换指在代码中使用内置函数或全局对象将一种类型显式地转换为另一种类型。例如,使用 Number() 函数将字符串转换为数字,使用 String() 函数将数字转换为字符串。

另外,JavaScript 还提供了一些常用的类型转换函数,如 parseInt() 和 parseFloat() 用于将字符串转换为整数和浮点数。

还有一些其它的方法来进行类型转换,如:

  • 使用 + 运算符将字符串转换为数字
  • 使用 valueOf() 方法将对象转换为原始类型
  • 使用 toString() 方法将数字、布尔值、对象转换为字符串

需要注意的是,在 JavaScript 中使用 == 运算符进行比较时会发生隐式类型转换,而使用 === 运算符进行比较时不会发生类型转换,所以在比较值的相等性时建议使用 === 运算符。

需要注意的是,JavaScript 的类型转换有一些需要特别注意的地方:

  • 当一个值被赋值给另一个变量时,它会被隐式地转换为该变量的数据类型。
  • 当一个值用于布尔运算时,它会被隐式地转换为布尔值。
  • 当一个值用于数学运算时,它会被隐式地转换为数字。
  • 当一个值被作为字符串连接时,它会被隐式地转换为字符串。
  • 当一个值被作为对象的属性时,它会被隐式地转换为字符串。

 

以下是一些 JavaScript 类型转换的示例:

1、隐式类型转换:

let num = "42";
console.log(num + 2); // "422"

2、显式类型转换:

let num = "42";
console.log(Number(num) + 2); // 44

3、parseInt() 和 parseFloat() 函数转换:

console.log(parseInt("42", 10)); // 42
console.log(parseFloat("3.14")); // 3.14

4、toString() 函数转换:

console.log((42).toString()); // "42"
console.log((true).toString()); // "true"

5、布尔值转换:

console.log(Boolean(0)); // false
console.log(Boolean("hello")); // true

6、运算符转换:

console.log(+"42") // 42

7、使用 Object() 函数将原始类型转换为对象:

console.log(typeof Object(42)); // object

8、使用 Symbol() 函数将字符串转换为 Symbol 类型:

console.log(typeof Symbol("hello")); // symbol

9、使用 JSON.parse()JSON.stringify() 函数将字符串转换为对象和对象转换为字符串:

let jsonString = '{"name":"John","age":30}';
let obj = JSON.parse(jsonString);
console.log(obj); // { name: 'John', age: 30 }

let jsonString2 = JSON.stringify(obj);
console.log(jsonString2); // '{"name":"John","age":30}'

需要注意的是,上述类型转换方式需要满足一定的条件,需要注意数据的合法性,如 JSON.parse() 和 JSON.stringify() 方法只能解析和序列化 JSON 格式的字符串。

还有一些需要注意的地方:

  • 当使用 parseInt() 和 parseFloat() 方法将字符串转换为数字时,如果字符串不符合数字格式,则会返回 NaN,因此需要使用 isNaN() 函数判断转换结果是否为 NaN。

  • 当使用 JSON.parse() 方法将字符串转换为对象时,如果字符串不符合 JSON 格式,则会抛出错误。

  • 当使用 Symbol() 函数将字符串转换为 Symbol 类型时,在内部存储的是一个符号,不是字符串。因此,当比较两个 Symbol 类型的值时,它们只有在内存中的地址相同时才相等。

  • 当使用 Object() 函数将原始类型转换为对象时,会创建一个包装对象。因此,在使用包装对象时需要注意包装对象和原始值之间的差异。

在使用类型转换时,需要根据实际需求进行选择,并且要注意隐式类型转换的影响。

作者:yuzhihui
出处:http://www.cnblogs.com/yuzhihui/ 声明:欢迎任何形式的转载,但请务必注明出处!!!
本文转载于网络 如有侵权请联系删除

相关文章

  • 漫画:程序员不是修电脑的!

    耶稣问众门徒:人们都说我是谁?众门徒回答:有人说您是施洗的约翰,有人说您是以利亚,又有人说您是耶利米或是先知里的一位。耶稣又问:那么你们觉得我是谁?门徒彼得回答:你是基督,是永生神的儿子。———摘自《马太福音》第16章笔者一向很喜欢这段文字对于耶稣的诠释。那么,身为程序员,我们又是什么样的人?如何为我们的职业做出恰当的诠释呢?请先看看下面似曾相识的情景:春节了,小灰回老家看望亲戚...... 程序员是修电脑的吗?虽然程序员平时工作中使用电脑相对多一些,但程序员真的不是修电脑的,更不是修手机、修冰箱洗衣机的。修电脑请找电脑维修员:修手机请找手机维修师:修冰箱洗衣机请找家电产品维修工:小灰继续去探亲......程序员是黑客吗?绝大部分程序员都不是黑客。 黑客(Hacker),是一群专门研究计算机系统和网络安全漏洞的人。在黑客当中,有些人致力于维护系统安全,被一些公司聘用为网络安全工程师;有些人对系统进行破坏,破坏系统的人被称为骇客(Cracker)。在当下,很多QQ盗号、网站植入木马等行为是骇客所为。同时也有很多并不真正懂技术的人参与进来,仅仅是利用了现成的骇客程序。因此,大多数计算机网

  • springboot学习笔记(一)

    springboot案例(一) Application.javapackagecom.xdr.spring; importorg.springframework.boot.SpringApplication; importorg.springframework.boot.autoconfigure.SpringBootApplication; /* *springboot的启动类或引导类 */ @SpringBootApplication//表明是springboot的引导类 publicclassApplication{ publicstaticvoidmain(String[]args){ //TODOAuto-generatedmethodstub System.out.println("启动springboot"); SpringApplication.run(Application.class,args); } }复制HelloController.javapackagecom.xdr.spring.controller; imp

  • ClickHouse整合Kafka(写数据)

    本文章主要讲解如何将ClickHouse中的消息写回到Kafka。ClickHouse读取Kafka数据详见ClickHouse整合Kafka(读数据)Kafka相关操作ClickHouse相关操作验证Kafka数据的写入登录到Kafka集群中消费kafka_writers数据kafka-console-consumer--bootstrap-serverlocalhost:9092--topickafka_writers复制新开另一个窗口对kafka_writers_readerKafka主题做生产数据操作kafka-console-producer--broker-listkafka:9092--topickafka_writers_reader<<END 4,"Data","Test","2020-12-2314:45:31" 5,"Plan","Test1","2020-12-2314:47:32" 22,"Plan",&quo

  • 【LeetCode两题选手】算法类题目(7.29)

    题一:翻转字符串里的单词给定一个字符串,逐个翻转字符串中的每个单词。示例1: 输入:"theskyisblue" 输出:"blueisskythe"复制示例2: 输入:"helloworld!" 输出:"world!hello" 解释:输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。复制示例3: 输入:"agoodexample" 输出:"examplegooda" 解释:如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。复制说明:无空格字符构成一个单词。 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。复制来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/reverse-words-in-a-string 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。 思路有两个

  • OpenVINO运行Tensorflow模型

    请先阅读我的上一篇文章《VisualStudio2017配置OpenVINO开发环境》,在VS2017中配置好OpenVINO环境。1模型转换1.1安装模型转换工具打开conda控制台,创建虚拟环境vino:condacreate-nvinopython=3.6复制创建完成后,执行activatevino。然后安装OpenVINO模型转换工具,具体命令如下:>activatevino >cdE:\OpenVINO\openvino_2019.3.334\deployment_tools\model_optimizer >pipinstall-rrequirements_tf.txt复制1.2模型转换以MobileNet为例,前往https://github.com/tensorflow/models/blob/master/research/slim/nets/mobilenet_v1.md下载MobileNet_v1_1.0_224模型,解压到目录E:\model后,对mobilenet_v1_1.0_224_frozen.pb执行如下命令完成模型转换:python

  • 性能测试统计

    这是几年前国外的一篇文章。众所周知,如果网站性能较差会降低用户好感度,甚至被用户抛弃,让企业遭受损失,但具体差到什么程度会引起用户不满呢?或者能让企业产生多大的损失呢?可能很多同学并不能给出准确的数据。今天这篇文章的目的,或许可以帮助我们更深入、更清晰的了解性能的重要性。销售额损失业内专家估计:应用程序性能问题可能会影响企业收入9%以上。较好性能的网站(提高访问速度)增加了7-12%收入。谷歌试验表明:查询结果放缓0.4秒,在广告收入方面每年将损失数百万美元。如果搜索结果慢了0.5秒,他们每天会失去800万美元。亚马逊表示:通过他们自己的计算,页面显示性能缓慢1秒,每年将损失16亿美元的销售额。每延迟100ms,他们将失去1%的销售额。用户/访问量损失Forrester发现:40%的消费者将会在等待页面加载超过3秒之前就关闭该网站。PhoCusWright表示,57%的在线购物者将放弃一个需要超过3秒加载的网站。37%-49%的体验用户放弃性能低下的网站或去其他同类网站。78%的用户说,使用一个缓慢的网站会让他们感到压力和愤怒。77%的用户表示他们会与别人分享他们的体会。—SeanPo

  • .NET Core中的验证组件FluentValidation的实战分享

    今天有人问我能不能出一篇FluentValidation的教程,刚好今天在实现我们的.NETCore实战项目之CMS的修改密码部分的功能中有用到FluentValidation,所以就以修改用户密码为实例来为大家进行一下ASP.NETCore中的验证组件FluentValidation的实战分享,希望能对大家有所帮助!由于本文以.NETCore实战项目之CMS中的项目为例,因此此篇文章会收录到系列教程的目录中。本篇文章已经收纳入《.NETCore实战项目之CMS第一章入门篇-开篇及总体规划》另附上.NETCore实战项目交流群:637326624有兴趣的朋友可以共同交流技术经验。 作者:依乐祝 原文地址:https://www.cnblogs.com/yilezhu/p/10397393.html 写在前面开始之前还是有必要为大家科普一下FluentValidation的概念,它是一个非常流行的用来构建强类型验证规则的.NET库。而且它对ASP.NETCore支持十分友好,可以很方便的进行集成使用,集成后我们可以很方便的对数据模型进行强验证。 为什么要使用它呢? 因为它足够简单,而且功

  • 一天一个设计模式:简单工厂模式

    存在的目的:  解耦,在a类中如何想使用b类的某种功能,必须new一个b对象出来,假如有一个c类,跟b实现了同一个接口,后续想要将b替换成c就需要更改在a中的代码,以此类推,代码的耦合度会随着项目复杂度越来越高,维护成本也会越来越高。  使用简单工厂,使a类与工厂做耦合,然后工厂来提供接口的实现类即可,这样只需要对工厂进行维护就可以实现替换了成功解耦。核心思想:  不在乎工厂是如何生产产品的,而是将产品的生产与产品的使用分开。      注:这里的产品指的是功能类的对象实际的应用:  jdk中的线程池:ThreadPoolExecutor,根据自己的需求传入corePoolSize、maximumPoolSize、keepAliveTimem、keepAliveTimem、unit、threadFactory、handler这几个参数,new一个指定的ThreadPoolExecutor出来。  jdk提供了Executors这个类,让开发者对线程池的使用与生产分离开,开发者只需要调用不同的方法就可以获取到不同的线程池,开发者不用关心线程池的实现细节,只需要调用api即可获取不同的线程

  • Livy Session 详解(中)

    本文基于incubator-livy0.4.0-incubating LivySession详解(上)-简书一文主要介绍了session整体的启动流程并详细分析了client端(livyserver端)是如何启动driver以及建立连接的。本文将进一步分析sessionserver端(即driver内部)是如何启动、初始化的以及执行代码片段的。注:如果对livy的整体架构以及sessionclient端不了解,请先阅读以下两篇相关文章:ApacheLivy实现思路及模块概述-简书LivySession详解(上)-简书一、整体启动、初始化流程如上图所示,driver内部的启动流程可以分为以下五个步骤:创建ReplDriver实例初始化server初始化SparkContext创建JobContextImpl实例并执行jobs等待退出1.1、创建ReplDriver实例ReplDriver是InteractiveSession对应的SparkAppdriver,用来接收livyserver的各种请求并进行处理。也是RSCDriver的子类,RSCDriver:持有等待RSCClient进行

  • 七日杀Liunx SteamCMD开服教程

    服务器要求内存:2G能满足正常进行游戏,内存越大,支持的人数越多。推荐8G以上。网络:5M以上的带宽,根据用户量增加,游戏服务器容易被DDOS攻击,最好弄高防御的服务器或者配置网络防御能力。端口:默认UDP26900,UDP26902,TCP8080,TCP8081,TCP8082安装环境#Ubuntu或Debian$sudoapt-getupdate$sudoapt-getupgrade#CentOS$yumupdate-y$yumupgrade-y复制安装服务端首先添加一个单独的用户$adduser7dtd复制安装依赖项#Ubuntu$sudoapt-getinstallglibc.i686libstdc++i686-y#CentOS$yuminstallglibc.i686libstdc++i686-y复制安装终端复用器根据个人喜好安装其中一个Tmux#Ubuntu$sudoapt-getinstalltmux#CentOS$sudoyuminstalltmux复制Screen#Ubuntu$sudoaptinstallscreen#CentOS$yuminstallscreen

  • Gym102040 .Asia Dhaka Regional Contest(寒假自训第9场)

    B.CountingInversion 题意:给定L,R,求这个区间的逆序对数之和。(L,R<1e15) 思路:一看这个范围就知道是数位DP。只是维护的东西稍微多一点,需要记录后面的各种数字的个数cnt,以及逆序对和sum,以及出现了多少种后缀num。 那么枚举到当前位时,假设为i,那么sum+=cnt[i+1]+cnt[i+2]+....cnt[9]; cnt[i]+=num;可以参考CF1073E。 #include<bits/stdc++.h> #definerep(i,a,b)for(inti=a;i<=b;i++) #definelllonglong usingnamespacestd; structin{ llnum,cnt[10],sum; in(){num=sum=0;memset(cnt,0,sizeof(cnt));} }dp[16]; intq[20],tot,vis[16]; indfs(intpos,intst,intlim) { if(!lim&&vis[pos])returndp[pos]; if(pos

  • 人物:Guido Van Rossum

    "人生苦短,我用Python"。Python不仅简明易懂容易上手,还因为高效丰富的库资源让程序员们节省了大量的编程时间,以至于程序员圈子流传的一个段子:用python的人秃顶的最少,不信请看看python之父的一头浓密的金发。     如果有谁能让更多的人把想法很容易变成可行的代码,这个人就是python之父,荷兰人GuidoVanRossum(中国的程序员们更喜欢叫他龟叔)。 龟叔在荷兰阿姆斯特丹大学学习数学时第一次学会了如何编程,并在职业生涯早期参与了一个短暂项目的CP4E(ComputerProgrammingforEverybody,人人会编程)。他曾经在接受采访时回忆道,“我在CWI开始的时候作为一个初级程序员加入了一个研究小组开发一种语言,目标是使没有编程经验的人能够快捷地开始编写计算机程序。” 1989年12月,为了打发圣诞节的无聊,他决心开发一个新的脚本解释程序语言,然后python就诞生了。历经三十年发展,Python已变成全世界最受欢迎的语言,在Web开发、自动化运维、人工智能,数据科学,游戏开发和各行各业的科学计算和应用大放异彩。 传奇的龟叔创

  • 如何从转储文件确定 /LARGEADDRESSAWARE

    有时在调试时,您希望知道某个特定进程是否使用/LARGEADDRESSAWARE标志链接,从而能够使用高于2Gb边界的用户模式地址。我的解决方案是:!address-summary将显示进程的有效用户模式地址空间:0:022>!address–summary..      Tot:7fff0000(2097088KB)Busy:278fd000(648180KB)<<<2Gbfornon-large-address-awareEXEorlargeaddressawareEXEonx86systemwithout/3Gbinboot.ini 或者 Tot:bd7f0000(3104704KB)Busy:23dee000(587704KB)<<<3Gbforlarge-address-awareEXEonx86systemwith/3Gbinboot.ini 或则 Tot:ffff0000(4194240KB)Busy:268b2000(631496KB)<<<4Gbfo

  • 上传图片转换格式为base64并预览

    <inputtype='file'id='fileEl'/> functionbase64(){ letfileObj=document.getElementById('fileEl').files[0]//获取文件对象 letreader=newFileReader()//新建一个FileReader对象 reader.readAsDataURL(fileObj)//将读取的文件转换成base64格式 reader.onload=function(e){ document.getElementById('img').src=e.target.result//将img标签的src换成base64格式,并显示出来 } } 复制   

  • 关于JDK1.7+中HashMap对红黑树场景的思考

    背景 在1.7之前的版本,当数组元素较多(几百、几千,或者更多)的时候,在这种前提扩容,涉及全量元素的遍历和坐标的重新定位,这个耗时会比较长。这是之前存在的一个弊端吧。那么引入红黑树之后就解决了问题,那是怎么解决的呢,我说下自己的理解。 过程分析 既然数组扩容导致了变慢,那就是从扩容方向思考,谁决定了扩容呢?负载因子和数组长度。数组长度是resize自动做的,所以对用户来讲这应该是一个关注不到的变量,那就只剩负载因子了。负载因子越大,扩容的频率就越低。 1.负载因子较小(小于1) hash碰撞几率小,当数组元素链表长度达到8个的时候才会转成红黑树,满足这种条件的应该很极端很极端了,与JDK1.7之前的差异其实不大,存在扩容时卡顿。 复制 2.负载因子较大(大于1) hash碰撞几率大,所以一个数组元素出现红黑树的几率变大,每个树的数量也会很多。因为扩容的阈值调的比较大,导致轻易不会扩容,整个hashmap更偏向与一颗颗红黑树。扩容就可以理解为对红黑树的维护,达到了丝般顺滑的效果。 总结 根据前面的分析,引入红黑树主要好处有2个: 极端情况下,保证hashmap碰撞过多的元素的高性能操

  • PHP 二维数组根据某个字段排序

    二维数组根据某个字段排序有两种办法,一种是通过sort自己写代码,一种是直接用array_multisort排序函数   一.手写arraysort  PHP的一维数组排序函数: sort 对数组的值按照升序排列(rsort降序),不保留原始的键 ksort对数组的键按照升序排列(krsort降序)保留键值关系 asort对数组的值按照升序排列(arsort降序),保留键值关系   方法:取出要排序的值组成值数组(为一维数组),按要求对值进行排序(保持键值关系),遍历值数组,按照键对应赋值给结果数组。 functionarraySort($array,$keys,$sort='asc'){ $newArr=$valArr=array(); foreach($arrayas$key=>$value){ $valArr[$key]=$value[$keys]; } ($sort=='asc')?asort($valArr):arsort($valArr); reset($valArr); foreach($valArras$key=>$

  • Sql注入的分类:数字型+字符型

    Sql注入: 就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。通过构造恶意的输入,使数据库执行恶意命令,造成数据泄露或者修改内容等,以达到攻击的目的。主要是由于应用程序对用户的输入没有进行严格的过滤而造成的。 一、万能密码 在说sql注入分类之前,先来看一下万能密码的构成原理。万能密码是由于某些程序,通过采用判断sql语句查询结果的值是否大于0,来判断用户输入数据的正确性造成的。当查询之大于0时,代表用户存在,返回true,代表登录成功,否则返回false代表登录失败。由于‘or1=1--'在执行后,结果始终为1,所以可以登录成功。因此,被称为万能密码。 二、注入的分类 注入的分类:数字型和字符型。攻击者目的只有一点,那就是绕过程序的限制,使用户输入的数据带入数据库执行,利用数据库的特殊性获取更多的信息或者更大的权限。 1、数字型注入 当输入的参数为整形时,如果存在注入漏洞,可以认为是数字型注入。 测试步骤: (1)加单引号,URL:www.text.com/text.php?id=3’ 对应的sql:select*fr

  • PostgreSQL 分区表

    CREATETABLEdatabase.ad_hourly_report( idbigserialNOTNULL,--自增ID settled_timetimestampNOTNULL,--日期时间 account_idint4NOTNULL,--广告主账号 campaign_idint4NOTNULL,--广告计划 adgroup_idint4NOTNULL,--广告单元 ad_idint4NOTNULL,--广告创意 view_countint4NOTNULLDEFAULT0,--曝光量 click_countint4NOTNULLDEFAULT0,--点击量 "cost"int8NOTNULLDEFAULT0,--花费 source_ad_idint8NULL,--对应平台广告创意 source_adgroup_idint8NULL,--对应平台广告单元 source_campaign_idint8NULL,--对应平台广告计划 source_account_idint8NULL,--对应平台广告主账号 insert_timetimestampDEFAULTCURRENT_TIM

  • (一)手写Spring项目之IOC

    项目地址:https://github.com/iamzhubaoliang/MySpring 1.什么是IOC IOCInversionofControl即控制反转,它可以降低代码之间的耦合性,最长见的就是Spring的依赖注入,它是怎么反转的?因为它的对象并不是我们new出来的而是被动的由容器进行注入的,spring相当于中间连接将原对象与属性进行了分离,由spring来控制对象的生命周期。 2.实现方式 我们依旧是使用三级缓存 回顾一下Spring的三级缓存过程,顺便回顾一下循环依赖是怎么解决的 首先Spring会执行GetBean,GetBean为空壳方法,调用doGetBean 然后执行getSingleton(Beanname,true)方法从一级缓存中查找,然后判断是不是正在创建,此时A一定不存在所以为空,然后进入它的重载方法getsingleTon(Beannaem,singletonFactory)方法,singletonFactory为一个lambda表达式,其为函数式接口的实现。 然后进入singleton方法中,执行lanbda表达式getObject(在接口

  • 单调队列基础模板

    一天我在luogu上看到这么一道题: 仔细思考之后... 恩,这不ST表吗! 然后一看数据范围: (这图片是不是特别熟悉...) 听说有同学改了改数组大小,把ST板子往上一粘... 并且一看这两个点一定是无可挽回的,无论怎么优化, 所以说即使这个算法拿到了这个题的大部分分,这个算法还是不适合的 这说明什么? luogu数据水 说明这题并不能用ST表过 那么有没有一种东西,它能够处理特定区间内的最值问题,还能跑的快(最好是O(n))呢? 下面引出今天的主角:单调队列! 在刚开始听的时候,觉得ta可能就是一个能够选取特定区间然后进行sort,最后还能处理出元素原来的入队顺序的STL? 其实并不是 首先ta并不是STL,一开始看到大佬打上\(deque\)时我还以为这就是单调队列,然而这只是双端队列 其次,单调队列指的单调并不是"单调函数"中的那个"单调",那个"单调"指的是"单调性",就是在指定的区间不上升或不下降 这里的单调指的是满足特定规则, 也就是说,这个队列中的元素既可以不上升,不下降,上升或下降,也可以在指定区间做像这样的运动: 只要ta符合一定的法则 具体的代码实现大

  • Java中的Serializable接口transient关键字,及字节、字符、对象IO

    1、什么是序列化和反序列化Serialization是一种将对象转为为字节流的过程;deserialization是将字节流恢复为对象的过程。2、什么情况下需要序列化a)当你想把的内存中的对象保存到一个文件中或者数据库中时候;b)当你想用套接字在网络上传送对象的时候;c)当你想通过RMI传输对象的时候;3、如何实现序列化将需要序列化的类实现Serializable接口就可以了,Serializable接口和Cloneable接口一样,不含任何方法,是个标记接口。 4、代码分析 packagecom.tonyluis; importjava.io.*; publicclassSolution{ publicstaticvoidmain(Stringargs[]){ ObjectOutputStreamobjectos=null; SerializableTestmyTest=newSerializableTest("str",12,1,"123456",8); try{ objectos=newObjectOutputStream(newFileOutputS

相关推荐

推荐阅读