js return的值取不到_【JS基础】隐式转换(一)

b9a821ab8bebe150eaa0f0650ff6ccc9.png

开篇

JS作为一门动态语言十分灵活,但是伴随而来的弱类型隐式转化的问题让我们十分头疼。

隐式作为一个大课题,很难用一个很简短的篇幅把JS的隐式转换讲解的十分清楚。所以我选择用多次少量的策略进行梳理,争取让你每看完一篇都会有加深对于JS隐式转换的理解。

一元操作符

说到隐式转换,就不得不提操作符了,绝大多数的隐式转换都与操作符有关。我们就从最简单的一元操作符开始我们的隐式转换探索之旅吧! gogogo!

先来一串+ 操作符的基础实践:

let n = 1
let s1 = '2'
let s2 = 'z'
let o = {valueOf: function() {return -1}
}n = +n  // 值不变
s1 = +s1 // 值变为 2
s2 = +s2 // 值变为 NaN
o = +o // 值变为 -1

由上面的代码可以看到,使用+操作符后,使用效果会像Number()转型函数一元进行解析。

而Number()的转化规则就是一元操作符隐式转化的精髓所在。

(开始划重点!

Number()的转化规则如下:

  • 数字不变
  • truefalse分别转化为01
  • null返回0
  • undefined返回NaN
  • string比较复杂
    • 如果为空,则返回0
    • 如果是数字(包括整型,浮点数,十六进制),则忽略前导0转化为对应十进制数字
    • 如果非上述格式,则返回NaN
  • 如果是对象,则首先调用valueOf方法,然后按照前面的规则转换,如转换结果还是对象(非原始值),则再调用对象的toString方法。
虽然红宝书中描述为“如果是对象,则首先调用valueOf方法转换返回的值,如果为NaN,则再进行toString方法”但是据我实践发现貌似此处的描述并不准确,或者谁来跟我讲讲

既然我们知道了+的转换规则,那么可以拓展来验证一下上面的规则,我们这里主要对于对象进行探究

PS: 没有记住规则不要紧,可以按照上面的规则走,多来几次就明白了~
let o1 = {valueOf: function() {console.log('执行valueOf')return 'a'},toString: function() {console.log('执行toString')return -1}
}o1 = +o1 // 执行valueof NaNlet o2 = {valueOf: function() {console.log('执行valueOf')return {}},toString: function() {console.log('执行toString')return -1}
}o2 = +o2 // 执行valueof 执行toString -1let o3 = {valueOf: function() {console.log('执行valueOf')return []},toString: function() {console.log('执行toString')return -1}
}o3 = +o3 // 执行valueof 执行toString -1let o4 = {valueOf: function() {console.log('执行valueOf')return function () {}},toString: function() {console.log('执行toString')return -1}
}o4 = +o4 // 执行valueof 执行toString -1let o5 = []
o5 = +o5 // 0let o6 = function() {}
o6 = +o6 // NaN

关于最后的o5,o6的结果我们要解释一下。不要忘记ArrayFunction也是对象哦,所以他们的执行顺序应该是下面这样的。

+o5 Array的执行顺序:

  1. o5.valueOf()返回[],此时[]还是个Array对象,于是接下来执行[].valueOf().toString()
  2. [].valueOf().toString()返回""
  3. Number("")返回0

+o6 Function的执行顺序:

  1. o6.valueOf()返回function() {},此时还是个Function对象,于是继续执行toString()
  2. o6.valueOf().toString()返回"function() {}"
  3. Number("function() {}")返回NaN

同样的,-作为一个二元操作符也是与上面的执行类似,不过要注意-是会取负的哦~

总结

今天我们学习到了一元运算符带来的隐式转换,主要要记得

  • Number()的转换规则(尤其是对象

今日习题:

{}+[]在Chrome控制台打出的结果是?

小提示:Chrome控制台中前面的{}会被当成空代码块哦

作者想说的

  • 希望大家看了可以提一些建议~ 嘿嘿嘿
  • MacbookPro任务进度(2/2)
  • 配图是女朋友拍的
  • 转载请注明出处,告诉我一下我会很开心~

今天总算是开了一个隐式转换类型的头哈哈哈 ,当然写这方面也是因为自己想要更加深入的了解JavaScript。可能很多人会觉得这种情况我要知道干嘛,业务里面又用不到。

之前的我也这么想过。

但是,我逐渐发现,深入了解语言的特性,可以让自己对于代码的掌控能力越强,出现的BUG也越少,就算出现BUG了定位的效率也越来越高。其中滋味只能自己体会啦~(当然,写之前一定一定要自己梳理清楚整体逻辑和细节,尤其是复杂且紧急的需求,否则你就会留下深深的大坑。

高能预警

下篇不出意外的话应该还是隐式转换(毕竟是个大课题啊哈哈哈) 透露几个下期的关键词

关键字:原始值valueOftoPrimitive==

下期更精彩哦~

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

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

相关文章

html5 loaded,How do you check if a HTML5 audio element is loaded?

问题I am wanting to know how to check if a HTML5 audio element is loaded.回答1:To find out when the audio is ready to start playing, add listeners for the oncanplay or oncanplaythrough events. To find out when the audio has loaded at all, listen to the onl…

Java的坏功能是什么

总览 当您第一次学习开发时,您会看到关于不同功能的过分笼统的陈述,对于设计,性能,清晰度,可维护性来说,都是不好的,感觉就像是黑客,或者他们只是不喜欢。 这可能会得到现实世界经验…

面试题(2)

逻辑推理 1、你让工人为你工作7天,给工人的回报是一根金条。金条平分成相连的7段 ,你必须在每天结束时给他们一段金条,如果只许你两次把金条弄断,你如何给你 的工人付费?   2、请把一盒蛋糕切成8份,分给8…

语句 查询每个人每个科目的最高分_转行数据分析师专栏(SQL篇)-05多表查询...

数据表(4张)及数据情况:搭建数据表数据参考:空杯希望:转行数据分析师专栏(SQL篇)-01SQL入门​zhuanlan.zhihu.com一、表的加法1、先新建一个表course1(和course表数据结构一致&#…

星海中学2021高考成绩查询,广东中考时间2021

忙碌了整整一个学期,同学们最关心的当然是什么时候能好好的回家调节一下学习的节奏,一起来看看广东各个大学的寒假放假时间吧!下面是由出国留学网小编为大家整理的“2021广东各大学寒假放假时间”,仅供参考,欢迎大家阅…

JDK 8 SummaryStatistics类

JDK 8中引入的三个新类是java.util包的DoubleSummaryStatistics , IntSummaryStatistics和LongSummaryStatistics 。 这些类使计算元素总数,元素最小值,元素最大值,元素平均值以及双精度,整数或long的集合中的元素总和…

plsql 设置鼠标行执行_如何制作键盘鼠标产品质量合格证

鼠标前盘属于办公用品套装,一般会一起销售,但是也不排除分开销售,无论是哪种方式键盘鼠标在生产销售时都需要携带对应产品质量合格证,对产品进行简单的说明,更能保障消费者的权益。那么如何制作产品质量合格证呢&#…

第四章例4-2

/* 输入一批学生的成绩&#xff0c;以负数作为结束标志&#xff0c;计算平均成绩&#xff0c;并统计不及格人数 */ #include<stdio.h> int main(void) {int count,num;double grade,total;num0;total0;count0;printf("Enter grades:");scanf_s("%lf"…

Spring RESTful错误处理

这篇文章将说明在Spring中可以为RESTful Web服务实现异常处理的方式&#xff0c;这种方式使得异常处理的关注点与应用程序逻辑分离。 利用ControllerAdvice批注&#xff0c;我们能够为所有控制器创建一个全局帮助器类。 通过添加用ExceptionHandler和ResponseStatus注释的方法…

html.action 访问分部视图,MVC+EF 随笔小计——分部视图(Partial View)及Html.Partial和Html.Action差异...

Partial View指可以应用于View中以作为其中一部分的View的片段(类似于之前的user control), 可以像类一样&#xff0c;编写一次&#xff0c; 然后在其他View中被反复使用。一般放在"Views/Shared"文件夹中以共享。创建Partial View&#xff1a;一般直接右键"Vie…

svm核函数gamma参数_非线性SVM与核函数

前面几篇我们介绍的都是线性支持向量机&#xff0c;换句话说&#xff0c;我们总可以用一条线或一个超平面将数据进行分割。如下图所示&#xff1a;但在更多情况下&#xff0c;有些数据是无法进行线性分割的。比如下面的例子&#xff1a;也就是说&#xff0c;你永远无法用一条直…

a查询计算机主机路由表信息,计算机网络主机A向其他主机B进行通信的流程

当主机A要与主机B通信时&#xff0c;地址解析协议可以将主机B的IP地址如(192.168.1.2)解析成主机B的MAC地址&#xff0c;以下为工作流程&#xff1a;第1步&#xff1a;根据主机A上的路由表内容&#xff0c;IP确定用于访问主机B的转发IP地址是192.168.1.2。然后A主机在自己的本地…

使用Java将数据流式传输到HPCC

高性能计算集群&#xff08;HPCC&#xff09;是类似于Hadoop的分布式处理框架&#xff0c;除了它运行以自己的称为企业控制语言&#xff08;ECL&#xff09;的特定领域语言&#xff08;DSL&#xff09;编写的程序外。 ECL很棒&#xff0c;但是偶尔您会想用其他语言来执行繁重的…

anychart说明文档

今天学习anychart&#xff0c;在慧都控件网上看有关文档&#xff0c;模仿试着做了个demo&#xff0c;发现慧都空间网的“Flash图表AnyChart应用教程六&#xff1a;创建圆形仪表”里的指针“<pointer type"bar" value"35" color"Gray" />”…

h5 神策埋点_咕咚技术总监唐平麟:神策使我们的数据平台成本降低约 75%,迭代效率提升 2~3 倍...

在这个数据爆炸的时代&#xff0c;数据成为各行各业出奇制胜的法宝&#xff0c;运动行业也不例外&#xff0c;那么大数据对运动业有什么价值呢&#xff1f;咕咚作为智能运动的倡导者和先行者&#xff0c;致力于成为全球领先的运动大数据和服务平台&#xff0c;现已为超过 1.5 亿…

JavaFX,Jigsaw项目和JEP 253

因此&#xff0c; Java 9可能会破坏您的代码 …… 如果您的项目使用JavaFX&#xff0c;则这尤其可能&#xff0c;因为许多自定义项和自制控件都需要使用内部API。 借助Project Jigsaw&#xff0c;这些内容将无法在Java 9中访问。幸运的是&#xff0c; Oracle在几天前宣布了 JE…

微型计算机技术6,微型计算机技术课后习题6-8章答案.ppt

微型计算机技术课后习题6-8章答案MOV AL L2: MOV CX,8 L1: OUT 20H,AL CALL DELAY2S ROR AL,1 LOOP L1 JMP L2 习题:8.24 8253A-5的计数通道0连接如图习8-4所示,试回答:(1)计数通道0工作于何种方式&#xff0c;并写出工作方式名称&#xff1b;(2)写出计数通道0的计数初值(列出计…

免费的.NET混淆和反编译工具

免费的.NET代码混淆工具&#xff1a; Eazfuscator.NET http://www.foss.kharkov.ua/g1/projects/eazfuscator/dotnet/Default.aspx Skater .NET Obfuscator Freeware Light Edition http://www.rustemsoft.com/freeware_obfuscator.htm VisualStudio2010中集成的Dotfuscator…

ios 获取是否静音模式_果粉感动:部分iOS“新功能”早已被安卓玩坏

一年一度的WWDC大会如期举行&#xff0c;今年不仅展示了全新的iOS、iPadOS以及macOS。当然&#xff0c;具体更新了什么相信早已经被各大媒体报道出来&#xff0c;本文并不是重复报道&#xff0c;相反的&#xff0c;iOS经过了13代的发展&#xff0c;有开创性的动作&#xff0c;也…

怎么把桌面计算机隐藏文件,怎么隐藏桌面文件夹名称?隐藏桌面图标下的文字的详细教程...

怎么隐藏桌面文件夹名称&#xff1f;桌面图标一多就会显得很凌乱&#xff0c;特别有的软件名称很长&#xff0c;那么有没有什么方法可以让桌面看起来很清爽呢&#xff1f;当然是有&#xff0c;去掉桌面应用的名称不就简洁清爽了&#xff1f;下面就教大家不利用第三方软件的情况…