js return的值取不到_【JS基础】隐式转换(一)
开篇
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()的转化规则如下:
- 数字不变
true
和false
分别转化为0
和1
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的结果我们要解释一下。不要忘记Array
和Function
也是对象哦,所以他们的执行顺序应该是下面这样的。
+o5 Array的执行顺序:
o5.valueOf()
返回[]
,此时[]
还是个Array对象,于是接下来执行[].valueOf().toString()
[].valueOf().toString()
返回""
Number("")
返回0
+o6 Function的执行顺序:
o6.valueOf()
返回function() {}
,此时还是个Function
对象,于是继续执行toString()
o6.valueOf().toString()
返回"function() {}"
Number("function() {}")
返回NaN
同样的,-
作为一个二元操作符也是与上面的执行类似,不过要注意-
是会取负的哦~
总结
今天我们学习到了一元运算符带来的隐式转换,主要要记得
Number()
的转换规则(尤其是对象)
今日习题:
{}+[]
在Chrome控制台打出的结果是?
小提示:Chrome控制台中前面的
{}
会被当成空代码块哦
作者想说的
- 希望大家看了可以提一些建议~ 嘿嘿嘿
- MacbookPro任务进度(2/2)
- 配图是女朋友拍的
- 转载请注明出处,告诉我一下我会很开心~
今天总算是开了一个隐式转换类型的头哈哈哈 ,当然写这方面也是因为自己想要更加深入的了解JavaScript。可能很多人会觉得这种情况我要知道干嘛,业务里面又用不到。
之前的我也这么想过。
但是,我逐渐发现,深入了解语言的特性,可以让自己对于代码的掌控能力越强,出现的BUG也越少,就算出现BUG了定位的效率也越来越高。其中滋味只能自己体会啦~(当然,写之前一定一定要自己梳理清楚整体逻辑和细节,尤其是复杂且紧急的需求,否则你就会留下深深的大坑。
高能预警
下篇不出意外的话应该还是隐式转换(毕竟是个大课题啊哈哈哈) 透露几个下期的关键词
关键字:原始值、valueOf、toPrimitive、==
下期更精彩哦~
js return的值取不到_【JS基础】隐式转换(一)相关推荐
- mysql not in 转化_解析MySQL隐式转换问题
一.问题描述 root@mysqldb 22:12: [xucl]> show create table t1G *************************** 1. row ***** ...
- mysql数据库隐式表_解析MySQL隐式转换问题
一.问题描述 root@mysqldb 22:12: [xucl]> show create table t1\G *************************** 1. row **** ...
- mysql 隐式失误_评“MySQL 隐式转换引起的执行结果错误”
今天看到一篇关于MySQL隐式转换引发执行结果错误的文章: ====================================================================== ...
- mysql日期隐式转换_关于MySQL隐式转换
一.如果表定义的是varchar字段,传入的是数字,则会发生隐式转换. 1.表DDL 2.传int的sql 3.传字符串的sql 仔细看下表结构,rid的字段类型: 而用户传入的是int,这里会有一个 ...
- js date转成 时间字符串_秋招快要开始了,前端笔试中的坑位-JS隐式转换问题
我们在写笔试题的时候,经常碰到涉及隐式转换的题目,例如 "1" + 2 obj + 1 [] == ![] [null] == false === 和 == === 叫做严格运算符 ...
- scala 环境搭建 变量 值 数据类型 元组 表达式块 语句 函数 柯里化 集合 面向对象 隐式转换
scala (scalable的简写) scala是一个比较冷门的语言,不太被人们所知道 为什么这么冷门的语言现在被我们使用 很多的大数据的项目的源码是是用scala语言编写的. 因为大数据技术不断被 ...
- 从 ++[[]][+[]]+[+[]]==10? 深入浅出弱类型 JS 的隐式转换
起因 凡是都有一个来源和起因,这个题不是我哪篇文章看到的,也不是我瞎几把乱造出来的,我也没这个天赋和能力,是我同事之前丢到群里,叫我们在浏览器输出一下,对结果出乎意料,本着实事求是的精神,探寻事物的本 ...
- JS的隐式转换 从 [] ==false 说起
前言 最近和大创扯淡时说到了[] == false,从结果上来看我俩都答错了,从气势上来说我俩的歪理都能出书了(恩,程序猿的骄傲),但是这其实背后隐藏了一潭很深的水,对,很深... 隐式类型转换 JS ...
- 从一道面试题说起—js隐式转换踩坑合集
前方提醒: 篇幅较长,点个赞或者收藏一下,可以在下一次阅读时方便查找 提到js的隐式转换,很多人第一反应都是:坑. 的确,对于不熟悉的人来说,js隐式转换存在着很多的让人无法预测的地方,相信很多人都深 ...
最新文章
- gitter 卸载_最佳Gitter频道:Scala
- 语言const的生命周期_C语言的角落——这些C语言不常用的特性你知道吗?
- 用python写脚本看什么书-你用 Python 写过哪些有趣的脚本?
- 3.11 总结-深度学习第四课《卷积神经网络》-Stanford吴恩达教授
- [转]ColorMatrixFilter--颜色矩阵滤镜
- 操作系统基础:存储管理知识笔记(二)
- html 表格文字颜色 css,CSS 表格-JavaScript中文网-JavaScript教程资源分享门户
- LeetCode 454. 四数相加 II(哈希)
- 嵌入式Linux系统编程学习之二常用命令
- 数据科学的原理与技巧 二、数据生成
- HEVC: 整个编码流程以及相关的函数介绍
- 水很深的深度学习(四)——卷积神经网络CNN
- android多线程网络通信
- Failed to introspect annotated methods on class 异常
- 学习强国:我国自研统信软件操作系统有了“终端管家”
- 无线串口服务器的辐射范围,揭真相!无线路由器的辐射到底可怕不?
- java 布尔值变成字符串,Java将布尔值转换为字符串
- Ubuntu synaptic install
- 海思3559万能平台搭建:OSD的自动反色
- 全志 A50/A133 新增驱动配置
热门文章
- linux查看本机所有预设的系统变量,如何设置与查看Linux系统中的环境变量?
- C语言实用算法系列之strtok字符串分割、strcat字符串拼接、strcpy、strcmp
- js微信小程序页面左上角返回跳转指定页面
- java中打开文件显示_在默认文件资源管理器中打开文件,并使用JavaFX或普通Java突出显示它...
- html属性和dom属性的区别,HTML属性与DOM属性的区别?
- 25q64存储多个数据_一篇文章看懂,存储虚拟化在不同用例中的实践与优势
- putty WinScp 免密登录远程 Linux
- 中国大学MOOC-陈越、何钦铭-数据结构-2019春期末考试(题目+部分解答)
- JVM内存管理(一)--GC简介
- CentOS7.x以上版本配置DNS失效解决办法