Javascript隐式转换

乱想

javascript为什么需要隐式转换?如果没有会出现什么情况?

找了一圈没有看到关于这个的讨论,只好自己研究了,可能不一定正确,自行辨知。

郁闷就是郁闷在好好的,为什么要搞个隐式转换,一般来讲这样去想不太可能想出个结果,毕竟这门语言不是自己写的,如果换一个问题,可能会好点,如果没有隐式转换javscript会成什么样子?

比如下面这一段代码:

console.log("10" - 1)

如果没有隐式转换,也许会报错吧?或者返回NaN?,不太确定,但假如说javascript根本不存在隐式转换,或许你不会这样去写代码吧,那么就更奇怪了,设计隐式转换究竟何目的?目前能想到的一点就是因为它是一门动态语言,值是运行时才知道的,因此有很多不确定的因素,这可能是作者设计隐式转换的目的吧。

什么是隐式转换

console.log(1 + "2");//12

可以看到一个是Number类型的值和一个String类型的值进行了相加,结果是12。那为什么是12呢?如果是按照数字相加应该是3,但这里却是将1和2进行了字符串拼接,也就是说这里的1被转换成了字符串1。

结论

如果两个值(也可以是多个)的类型不同,但你却拿它们来运算,它们就会进行隐式转换,当然也不只是运算才会产生隐式转换。

谁被转换

console.log(10 + "2");//102console.log(10 - "2");//8 console.log(10 * "2");//20 console.log("2" - 10);//-8 console.log(10 / "2");//5

它们有一个小小的规律,如果是+号,数字会被转换成字符串,而如果是减乘除则会将字符串转换成数字。

那么为什么唯独+号比较特别呢,因为在javascript中,+号是有两个作用的,一个是数字相加,另一个是字符串拼接,而javscript默认把这种情况当成了字符串拼接。另减乘除就不存在这种问题,因此也只好将字符串转换成数字。

哪些情况下会进行隐式转换

上面的几个例子中,都是在讲运算符导致的隐式转换,那么除了这种情况还有哪些情况下会进行隐式转换?

某些函数

isNaN():

console.log(isNaN(2)) //false
console.log(isNaN("a")) //true console.log(isNaN("2")) //false

isNaN会将传进来的那个值进行转换如果能够转换成数字那么就是false(如果本身就是数字那么也是false),否则true。

条件判断
if(""){console.log(true); //不会被打印 } if(" "){ console.log(true); //会被打印 }

空字符串会被转换成false,否空字符串会被转换成true。

[0,-1,[],{},NaN,undefined,null,""," "].forEach(function(item,index){ if(item){ console.log(item); } }) // 打印的有:-1,[],{}," "

也就是除,非0的数字,数组,对象,非空字符串都会被转换成true,其他的false。

需要注意的是switch不会进行隐式转换

switch("5"){case 5:console.log(5); break; case "5": console.log("5"); //打印这条 break; } 

如果switch会进行隐式转换那么问题就出大了,甚至我们都不敢去使用它。那么为什么if会进行隐式转换,我的理解是,因为if它的值无非就是true跟false,而你传进来的不是这种类型,它自然需要进行转换,switch则不同,它判断的是一个值是不是和另外一个值相等,因此它不能去转换,换一句话说switch使用的是 === 比较。

其他类型的混合运算

相加

console.log([]+0); //0console.log(!+0); //true console.log(!+1); //false console.log(NaN+2); //NaN console.log(NaN+"2"); //NaN2 console.log(NaN+"a"); //NaNa console.log(undefined+0); //NaN console.log(undefined+"0"); //undefined0 console.log(null+0); //0 console.log(null+"0"); //null0 console.log({}+0); //[object Object]0 console.log({}+"0"); //[object Object]0 console.log(""+0); //0 console.log(""+"0"); //0 console.log(true + 0); //1 console.log(true + "0"); //true0 console.log(false + 0); //0 console.log(false + "0"); //false0 
  • []》 0
  • !》 会将后面的那个值转换成布尔类型,然后取反
  • undefined 》 根据后面的那个值来进行转换,如果是数字转换成NaN,否则字符串拼接
  • {} 》 [object Object]
  • true 》 1
  • false 》 0

其实有一个规律,除了[],{},其他的值具体转换是根据和它进行运算的那个值的类型来转换的。

相减

console.log([]-0); //0console.log(!-0); //true console.log(!-1); //false console.log(NaN-2); //NaN console.log(NaN-"2"); //NaN console.log(NaN-"a"); //NaN console.log(undefined-0); //NaN console.log(undefined-"0"); //NaN console.log(null-0); //0 console.log(null-"0"); //0 console.log({}-0); //NaN console.log({}-"0"); //NaN console.log(""-0); //0 console.log(" "-"0"); //0 console.log("1"-"0"); //1

除了相加以为,其他的几个运算符,主要还是将这些值转换成数字进行运算,比较特殊的是!(取反),它始终转换成的是一个布尔值。

一些有趣的事

根据这些隐式转换,有时我们可以用它来做一些不同寻常的事,比如直接利用隐式转换来取得一个object字符串。

console.log(({}+0).substring(1,({}+0).indexOf(" "))) //object

原理因为{}+0等于 = "[object Object]0",既然它是一个字符串,那么我们可以用字符串的方法,将其中的某个值取出来,也可以用[]的方式来取值。

也就是利用这些隐式转换你可以取得任何字符串,甚至中文,不过需要你对javascript有点基础罢了。

console.log(String.fromCharCode(20013)) //中

取中文需要你知道对应的字符串编码值

隐式转换带来的利与弊

好处就是,我们不需要直接显示的进行转换,比如你想将一个字符串转成数字,只需要这样:

console.log("15"-0) //数字15

传统的做法

console.log(parseInt("15")) //数字15

但也有坏处,就是有些你并不希望进行转换,但它却转换了,而往往你容易忘了它会进行隐式转换这一点,导致一些不太明显的bug。

总结

大致会进行隐式转换的情况如下:

1、不同类型的值进行运算
2、判断
3、个别函数

问答

这两年越来越多讨论关于全栈工程师的话题,而实际上所谓的全栈工程师就是早期的程序员,那时分工没有现在这么明细,很多活都是一个人干,后来才开始分前端后端等,现在又开始所谓的全栈,你怎么看?如果你想成为一个全栈工程师,你会怎么做?

转载于:https://www.cnblogs.com/libin-1/p/6130768.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/255826.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

双工位机器人 焊接夹具注意事项 o(╯□╰)o

焊接夹具设计注意事项 一套完美的夹具,需要机械设计人员正确的设计思想,良好的配件质量,钳工负责认真的装配质量,卡具在使用中不断的修磨和改进,才会达到好的效果。 本人非机械设计,只是在使用焊接卡具过程中遇到了很多卡具设计上…

【公共类库】加密解密

public static class MyEncryption{#region Md5加密/// <summary>/// 使用MD5加密/// </summary>/// <param name"str">需要加密的数据。</param>/// <param name"kind">加密类型&#xff1a;1-普通加密&#xff1b;2-密码加…

使用JOTM实现分布式事务管理(多数据源)

使用spring和hibernate可以很方便的实现一个数据源的事务管理,但是如果需要同时对多个数据源进行事务控制,并且不想使用重量级容器提供的机制的话,可以使用JOTM达到目的. JOTM的配置十分简单,spring已经内置了对JOTM的支持,一.<bean id"jotm" class"org.spri…

【机器学习】——《机器学习实战》面试复习

目录 一、机器学习概念 二、机器学习步骤 三、有监督学习 1、k-近邻算法 核心思想 实例&#xff1a;手写数字的识别 优缺点&#xff1a; 2、决策树 相关概念 核心思想 一些小技巧 优缺点 3、神经网络 4、SVM——支持向量机 核心思想 SVM和SVR的区别 ​ 优缺点…

一键分享代码

文章出处&#xff1a;http://share.baidu.com/code/advance 一、概述 百度分享代码已升级到2.0&#xff0c;本页将介绍新版百度分享的安装配置方法&#xff0c;请点击左侧列表查看相关章节。 二、代码结构 分享代码可以分为三个部分&#xff1a;HTML、设置和js加载&#xff0c;…

ubuntu安装LDAP

参考文献&#xff1a; https://help.ubuntu.com/12.04/serverguide/openldap-server.html&#xff08;最主要的&#xff09; http://www.linuxidc.com/Linux/2011-08/40020.htm http://blog.chinaunix.net/uid-24276740-id-3360306.html 前言 在网上搜索ldap的安装配置&#xf…

58.贪心算法练习:  最小新整数

总时间限制: 1000ms 内存限制: 65536kB 描述 给定一个十进制正整数n(0 < n < 1000000000)&#xff0c;每个数位上数字均不为0。n的位数为m。现在从m位中删除k位(0< m)&#xff0c;求生成的新整数最小为多少&#xff1f;例如: n 9128456, k 2, 则生成的新整数最小…

ABB机器人之LOADDATA

ABB机器人之LOADDATA loaddata是用来描述连接到机器人机械接口的负载&#xff08;机器人的安装法兰&#xff09;。loaddata数据通常定义有效载荷或负荷&#xff08;通过指令gripload设置机器人抓手负载 或mechunitload指令设置变位机负载。loaddata通常也作为tooldata的一部分&…

【深度学习】——性能指标(ROC、MAP、AUC等)

目录 一、分类任务性能指标 1、混淆矩阵 2、精确度ACCURACY 正确数/总数 3、查全率&#xff08;RECALL&#xff09;——真正正样本中预测正确的比例 4、查准率&#xff08;precision&#xff09;——预测为正样本中的预测正确的比例 5、F-score——对查准率和查全率进行结…

【深度学习】——过拟合的处理方法

目录 一、什么是过拟合&#xff1f;&#xff08;overfitting&#xff09; 二、过拟合的表现&#xff08;判定方法&#xff09; 训练集、测试集、验证集区别 测试集与验证集的区别 三、产生过拟合的原因 1、样本方面 2、模型方面 四、避免过拟合的方法 1、样本方面 1&…

ASP.NET页面的字符编码设置

在用ASP.NET写网上支付的接口程序时&#xff0c;遇到一个奇怪问题&#xff0c;通过表单提交过去的中文全是乱码&#xff0c;英文正常。而用asp程序进行测试&#xff0c;可以正常提交中文&#xff0c;asp页面中有这样的HTML代码&#xff1a; <meta http-equiv"Content-T…

帝人製机--适合的机遇--遇到恰到好处的产品--工业机器人减速机造就一个百年企业

持之以恒是成功的必要条件&#xff0c;但是也要有恰当的土壤。日本Nabtesco(纳博特斯克)旧名&#xff1a;帝人製机(TEIJINSEIKI)高性能日本RV减速机纳博特斯克(Nabtesco)公司是一家居世界领先地位的精密传动控制系统及组件製造商。目前全世界已有超过两百万件由Nabtesco製造的精…

Python个人项目--豆瓣图书个性化推荐

项目名称: 豆瓣图书个性化推荐 需求简述&#xff1a;从给定的豆瓣用户名中&#xff0c;获取该用户所有豆瓣好友列表&#xff0c;从豆瓣好友中找出他们读过的且评分5星的图书&#xff0c;如果同一本书被不同的好友评5星&#xff0c;评分人数越多推荐度越高。 输入&#xff1a;豆…

#define宏定义形式的函数导致的bug

定义了一个宏定义形式的"函数": #define SUM8(YY)\ {\ int Y YY>>2;\ ...\ } 然后使用的时候&#xff0c;传入了一个同名的变量Y: int Y Ywin[x]; SUM8(Y) 本意是想展开成int Y Ywin[x]>>2; 但实际上#define只是把参数名(YY)替换&#xff0c;与函数…

【深度学习】——BN层(batch normalization)

目录 一、“Internal Covariate Shift”问题 二、BatchNorm的本质思想 两个参数r和β的意义——精髓所在 三、训练阶段如何做BatchNorm 四、BatchNorm的推理(Inference)过程 五、BatchNorm的好处 一般使用在卷积层后、激活层前 Batch Normalization作为最近一年来DL的重要…

打印池

餐饮行业&#xff0c;打印池是必要的部件。 实现原理&#xff1a;每一台打印机都有自己的任务队列和处理任务队列的线程。 unit untPrintTask; interface uses System.SysUtils, System.Classes, Datasnap.DBClient, frxclass, System.Generics.Collections; type TBillContent…

JAXB vs XStream

2019独角兽企业重金招聘Python工程师标准>>> JAXB vs XStream 博客分类&#xff1a; java JAXB vs XStream 这两东东本质上是有差别的&#xff0c;JAXB称为OX binding工具&#xff0c;XStream应该算序列化工具&#xff0c;但OX binding工具也会marshall和unmarsha…

ABB 机器人 DRVIO_1通信报警

ABB 机器人DRVIO_1通信报警 2014.06.13 ABB1600弧焊机器人&#xff0c;从A地搬运到B地&#xff0c;到达B地后&#xff0c;机器人上电&#xff0c;报DRVIO_1通信故障&#xff0c;机器人进入故障停止模式。 DRVIO_1为LOCAL_GENERIC类型的ABB内部LOCAL总线类型的单元实例。 故障…

S2SH CRUD 整合

S2SH CRUD 整合 采用的框架 Struts2Spring4Hbiernate4. 目录结构 &#xff1a; EmployeeAction: 1 package com.xx.ssh.actions;2 3 import java.io.ByteArrayInputStream;4 import java.io.InputStream;5 import java.io.UnsupportedEncodingException;6 import java.util.…

ABB 机器人 添加多任务

首先&#xff0c;需要启用多任务选项的控制器。 要做到这一点&#xff0c;创建一个新的机器人控制器RobotStudio站 - >选择机器人&#xff08;控制器菜单&#xff09; - >.................. - >系统生成器 - >选择控制器 - >修改...下一页 - >下一步 - >…