开篇

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==

下期更精彩哦~

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

  1. mysql not in 转化_解析MySQL隐式转换问题

    一.问题描述 root@mysqldb 22:12: [xucl]> show create table t1G *************************** 1. row ***** ...

  2. mysql数据库隐式表_解析MySQL隐式转换问题

    一.问题描述 root@mysqldb 22:12: [xucl]> show create table t1\G *************************** 1. row **** ...

  3. mysql 隐式失误_评“MySQL 隐式转换引起的执行结果错误”

    今天看到一篇关于MySQL隐式转换引发执行结果错误的文章: ====================================================================== ...

  4. mysql日期隐式转换_关于MySQL隐式转换

    一.如果表定义的是varchar字段,传入的是数字,则会发生隐式转换. 1.表DDL 2.传int的sql 3.传字符串的sql 仔细看下表结构,rid的字段类型: 而用户传入的是int,这里会有一个 ...

  5. js date转成 时间字符串_秋招快要开始了,前端笔试中的坑位-JS隐式转换问题

    我们在写笔试题的时候,经常碰到涉及隐式转换的题目,例如 "1" + 2 obj + 1 [] == ![] [null] == false === 和 == === 叫做严格运算符 ...

  6. scala 环境搭建 变量 值 数据类型 元组 表达式块 语句 函数 柯里化 集合 面向对象 隐式转换

    scala (scalable的简写) scala是一个比较冷门的语言,不太被人们所知道 为什么这么冷门的语言现在被我们使用 很多的大数据的项目的源码是是用scala语言编写的. 因为大数据技术不断被 ...

  7. 从 ++[[]][+[]]+[+[]]==10? 深入浅出弱类型 JS 的隐式转换

    起因 凡是都有一个来源和起因,这个题不是我哪篇文章看到的,也不是我瞎几把乱造出来的,我也没这个天赋和能力,是我同事之前丢到群里,叫我们在浏览器输出一下,对结果出乎意料,本着实事求是的精神,探寻事物的本 ...

  8. JS的隐式转换 从 [] ==false 说起

    前言 最近和大创扯淡时说到了[] == false,从结果上来看我俩都答错了,从气势上来说我俩的歪理都能出书了(恩,程序猿的骄傲),但是这其实背后隐藏了一潭很深的水,对,很深... 隐式类型转换 JS ...

  9. 从一道面试题说起—js隐式转换踩坑合集

    前方提醒: 篇幅较长,点个赞或者收藏一下,可以在下一次阅读时方便查找 提到js的隐式转换,很多人第一反应都是:坑. 的确,对于不熟悉的人来说,js隐式转换存在着很多的让人无法预测的地方,相信很多人都深 ...

最新文章

  1. gitter 卸载_最佳Gitter频道:Scala
  2. 语言const的生命周期_C语言的角落——这些C语言不常用的特性你知道吗?
  3. 用python写脚本看什么书-你用 Python 写过哪些有趣的脚本?
  4. 3.11 总结-深度学习第四课《卷积神经网络》-Stanford吴恩达教授
  5. [转]ColorMatrixFilter--颜色矩阵滤镜
  6. 操作系统基础:存储管理知识笔记(二)
  7. html 表格文字颜色 css,CSS 表格-JavaScript中文网-JavaScript教程资源分享门户
  8. LeetCode 454. 四数相加 II(哈希)
  9. 嵌入式Linux系统编程学习之二常用命令
  10. 数据科学的原理与技巧 二、数据生成
  11. HEVC: 整个编码流程以及相关的函数介绍
  12. 水很深的深度学习(四)——卷积神经网络CNN
  13. android多线程网络通信
  14. Failed to introspect annotated methods on class 异常
  15. 学习强国:我国自研统信软件操作系统有了“终端管家”
  16. 无线串口服务器的辐射范围,揭真相!无线路由器的辐射到底可怕不?
  17. java 布尔值变成字符串,Java将布尔值转换为字符串
  18. Ubuntu synaptic install
  19. 海思3559万能平台搭建:OSD的自动反色
  20. 全志 A50/A133 新增驱动配置

热门文章

  1. linux查看本机所有预设的系统变量,如何设置与查看Linux系统中的环境变量?
  2. C语言实用算法系列之strtok字符串分割、strcat字符串拼接、strcpy、strcmp
  3. js微信小程序页面左上角返回跳转指定页面
  4. java中打开文件显示_在默认文件资源管理器中打开文件,并使用JavaFX或普通Java突出显示它...
  5. html属性和dom属性的区别,HTML属性与DOM属性的区别?
  6. 25q64存储多个数据_一篇文章看懂,存储虚拟化在不同用例中的实践与优势
  7. putty WinScp 免密登录远程 Linux
  8. 中国大学MOOC-陈越、何钦铭-数据结构-2019春期末考试(题目+部分解答)
  9. JVM内存管理(一)--GC简介
  10. CentOS7.x以上版本配置DNS失效解决办法