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,一经查实,立即删除!

相关文章

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

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

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"…

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;你永远无法用一条直…

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…

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

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

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

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

window xp系统安装php环境_Windows Server 2003及XP系统如何安装SQL Server 2000数据库?

年头年初节假日就是小编的梗&#xff0c;忙得不可开交&#xff0c;这不越冷越刮风昨天服务器又崩了&#xff0c;折腾了一天安装好Windows Server 2003和IIS(这系统是有点老了&#xff0c;主要是单位机子和各系统也有点年头了&#xff0c;没办法)&#xff0c;做好各项配置后总算…

rnn神经网络 层次_精讲深度学习RNN三大核心点,三分钟掌握循环神经网络

每天给小编五分钟&#xff0c;小编用自己的代码&#xff0c;让你轻松学习人工智能。本文将剖析循环神经网络(RNN)的工作原理&#xff0c;精讲循环神经网络的特点和实现方式。野蛮智能&#xff0c;小白也能看懂的人工智能。循环神经网络从何而来&#xff1f;我在我的这篇文章介绍…

摆脱匿名类

我真的很喜欢编写和阅读lambda表达式-它们简洁&#xff0c;富于表现力和时尚&#xff08;来吧&#xff0c;这样就没关系了&#xff01;&#xff09;。 将此与匿名类进行比较。 这就是为什么我喜欢摆脱它们&#xff01; 在过去的几个月中&#xff0c;这种认识慢慢地实现了&…

ARM学习(24)Can的高阶认识和错误处理

笔者来聊一下CAN协议帧的认识和错误处理。 1、CAN协议帧认识 CAN 差分信号&#xff0c;是经过CAN收发器转成差分信号的&#xff0c;CAN RX和TX是逻辑电平。CAN的基础知识&#xff0c;可参考笔者这边文章&#xff1a;ARM学习&#xff08;21&#xff09;STM32 外设Can的认识与驱…

云桌面 瘦终端_小米盒子连接Citrix云桌面

先前看到很多公司使用Wyse、Hp等瘦终端设备登陆Citrix云桌面&#xff0c;便想购得一台瘦终端设备&#xff0c;想来只是为了测试&#xff0c;况且瘦终端价格不低&#xff0c;便一直未买。后使用自己的平板连接Citrix XenDesktop创建的Win7桌面&#xff0c;感觉效果很好&#xff…

Apache Mesos + Marathon和Java EE

Apache Mesos是一个开放源代码群集管理器&#xff0c;可在分布式应用程序或框架之间提供有效的资源隔离和共享。 Apache Mesos从计算机&#xff08;物理或虚拟&#xff09;上提取CPU&#xff0c;内存&#xff0c;存储和其他计算资源&#xff0c;从而使容错和弹性的分布式系统易…

计算机指令中数据寻址的方式,1.变址寻址需要在指令中提供一个寄存器编号和一个数值。 2.计算机的指令越多,功能越强越好。 3.程序计数...

满意答案happysk72推荐于 2017.12.16采纳率&#xff1a;57% 等级&#xff1a;12已帮助&#xff1a;21199人1.对变址寻址就是将寄存器(该寄存器一般称作基址寄存器)的内容与指令中给出的地址偏移量相加&#xff0c;从而得到一个操作数的有效地址。变址寻址方式常用于访问某基…

babel原理_带你了解 snowpack 原理,你还学得动么(下)

作者&#xff1a;AlienZHOU转发链接&#xff1a;https://zhuanlan.zhihu.com/p/149351900目录带你了解 snowpack 原理&#xff0c;你还学得动么(上)带你了解 snowpack 原理&#xff0c;你还学得动么(下)本篇小编建议小伙们从第一篇开始&#xff0c;按照顺序来看&#xff0c;更清…

测试社交软件有哪些,性格测试:测你适合哪个社交平台

你喜欢通过什么方式和人交流&#xff1f;随着网络世界越来越发达&#xff0c;人们越来越倾向于使用社交工具来维系与家人、朋友、同事之间的关系。不但在现实生活中不好直接表达出来的话通过网上交流的方式可以顺畅地表达出来&#xff0c;而且也节约了时间上的成本&#xff0c;…

VS2012无法安装cocos2d-x-2.1.4 解决方法及VS2012新建coco2d-x项目(一)

转自&#xff1a;http://www.cnblogs.com/wangpei/admin/EditPosts.aspx?opt1 &#xff08;注&#xff1a;此方法是可行&#xff0c;仅供参考&#xff0c;建议大家直接看我的 一见命令解决vs安装并创建cocos2d-x&#xff0c;如果你习惯了和以前一样在vs点击创建就用这个方法&a…