从 ECMA标准看类型转换|探索永远是解决问题的最好方案🌟

简介: 从 ECMA标准看类型转换|探索永远是解决问题的最好方案🌟

抛出一个问题


昨天我的群里有人问了这样一个问题:


+[1]
// 1
+[1,2]
// NaN
// 提问:为什么第一个返回 1,第二个返回 NaN 呢?


这是一个很小的问题,但是我本能的反感,一看就是无聊到极致的面试官问出来的,如果是我就会反问:


  • 什么场景下会出现这种问题?
  • 如果真有这种场景要写这样的代码,你有没有考虑后续维护的问题?

但是作为一个温柔的小群主,我还是要去解答这个问题,但是我同时更想通过问题去提升提问者解决问题的能力,因为:

  • 问题是层出不穷的,而解决问题的能力是贯穿整个职业生涯的

于是就有了这篇文章,带着大家从看到问题到寻找权威的解释去对问题进行解答与探索,毕竟授人以鱼,不如授人以渔。


寻觅答案之旅


我们可以先将问题做一个转换:


Number([1])
// 1
Number([1,2])
// NaN


即:为什么数组 [1] 转为 Number 类型是 1,而数组 [1,2] 转为 Number 类型是 NaN。

这时我们可以前往 ECMA 的官网去寻找答案,众所周知 ECMAScript 语言规范所对应的是 ECMA-262:


www.ecma-international.org/publication…

根据网页中的指引,我们可以寻找到 ecma262 标准的文档:

tc39.es/ecma262/


对于上面的一些专有词汇进行简要解释:


  • ECMA:ECMA国际组织,全称是Ecma International (以前叫 ECMA - European Computer Manufacturers Association - 欧洲计算机制造商协会)是个行业标准组织,它所通过的标准都是 ECMA-nnn 这样进行编号。
  • tc39:是ECMA 国际组织第 39 号技术委员会( Technical Committee ),它是一个推动 JavaScript 发展的委员会。TC39 由各个主流浏览器厂商的代表构成,他们的主要工作就是制定 ECMAScript 标准,标准生成的流程,并实现。


进入到页面,我们第一步当然是找到 Number:


网络异常,图片无法展示
|


这时我们发现,Number 作为方法调用的时候我们会执行 ToNumeric(value) 方法:


网络异常,图片无法展示
|


这个方法会先去执行 ToPrimitive(value, number) 方法:


网络异常,图片无法展示
|


这个方法很长,也比较难去阅读,但是我们可以精准的发现,他无非是一个寻找转换类型 preferredType的过程,在这个问题里,我们这个类型就是 number,最后我们拿着这个东西去执行 OrdinaryToPrimitive(input, preferredType),我们似乎是看到曙光了:


网络异常,图片无法展示
|


这个方法会判断我们之前的 preferredType,因为我们这个类型是 number,所以 我们会先后执行 "valueOf", "toString",注意文档中的这句类代码:

If Type(result) is not Object, return result.


我们先执行了 valueOf ,如果返回值是个对象,我们才去执行 toString,然而,数组执行 valueOf 返回的是本身,所以这个方法最后返回的是 [xxx].toString()

而数组的 toString 会返回什么呢?,我们继续搜:


网络异常,图片无法展示
|


看到这里我们就不需要继续往下看了,很显然会执行数组的 join 方法,而 join 默认是由 ',' 进行拼接的:


网络异常,图片无法展示
|


而这个问题就很简单的转换为了:


Number('1')
// 1
Number('1,2')
// NaN


这样答案就显而易见了🌟

我们这次探索的目标也就达成了


解决问题是一种能力


其实我们做一个程序员,经常会遇到各种问题,但是遇到问题,我们可以通过自己的方法找到更加权威的解答一定是我们向上成长的关键能力。

相关文章
|
开发工具 数据安全/隐私保护 git
如何从Gitee中拉取项目到HBuilder中?
如何从Gitee中拉取项目到HBuilder中?
|
存储 Java 开发工具
WinServer服务器上搭建Git代码库
本文介绍如何在WinServer服务器上搭建Git代码库。
804 0
|
网络虚拟化 虚拟化 Windows
|
7月前
|
人工智能 API 网络安全
保姆级图文教程!阿里云轻量服务器部署OpenClaw+Docker极简方案+Skills集成及避坑指南
2026年,OpenClaw(曾用名Clawdbot)已成为开源AI自动化代理领域的标杆产品,凭借轻量化运行、自然语言驱动、插件化扩展三大核心优势,广泛应用于文件管理、信息检索、定时任务、网页自动化、内容处理等日常效率场景。对于零基础用户而言,阿里云轻量应用服务器是部署OpenClaw的最优载体——操作简单、性价比高、环境稳定且自带官方优化镜像,全程无需复杂运维知识,小白也能快速完成从服务器创建到AI助手上线的全流程。
1297 3
|
10月前
|
安全 C++
📈 模型评估
模型评估涵盖能力、安全与效率三大维度,包括语言理解、知识问答、推理代码等任务,常用MMLU、C-Eval、GSM8K等基准,结合Hugging Face工具实现自动化测评,关注幻觉、领域适配与人工协同评估。
|
自然语言处理 监控 API
亚马逊:使用全球开店API实现多国站点同步运营,降低管理成本
亚马逊全球开店API助力跨境电商实现多站点自动化运营,支持商品、库存、订单一键同步,自动转换多语言多货币,实时补货与就近履约。通过四步技术方案,降低30%以上成本,提升效率90%以上,打造高效智能的全球化销售体系。
|
Shell
亲测好用!解决国内短信受限的办法分享
随着国内多个平台暂停对个人用户的短信发送服务,不少人面临困扰。为此推荐一款实用工具——Spug推送平台,可满足发送短信验证码等需求。通过简单的注册、创建模板与调用接口步骤,即可快速实现短信发送功能。例如,使用bash命令调用接口:`curl https://push.spug.cc/send/xxx?code=6677&targets=151xxxx0875`。注意遵守平台规则和法律法规,确保正常使用。在短信权限受限的情况下,Spug无疑是个人用户的理想选择。
1207 3
亲测好用!解决国内短信受限的办法分享
|
SQL 监控 关系型数据库
如何查看MySQL使用的内存
综合运用上述方法,您可以全方位地监控和管理MySQL的内存使用。从简单查看配置到深入分析实时内存占用,每种方法都有其适用场景和优势。定期检查和调整MySQL的内存配置,对于维持数据库性能和稳定性至关重要。
2250 0
|
存储 缓存 数据处理
Flink 2.0 状态存算分离改造实践
本文整理自阿里云智能 Flink 存储引擎团队兰兆千在 FFA 2023 核心技术(一)中 的分享,内容关于 Flink 2.0 状态存算分离改造实践的研究。
1092 1
Flink 2.0 状态存算分离改造实践
|
存储 监控 BI
HIS系统是什么?一套前后端分离云HIS系统源码 接口技术RESTful API + WebSocket + WebService
医院管理信息系统(全称为Hospital Information System)即HIS系统。 常规模版包括门诊管理、住院管理、药房管理、药库管理、院长查询、电子处方、物资管理、媒体管理等,为医院管理提供更有力的保障。 HIS系统以财务信息、病人信息和物资信息为主线,通过对信息的收集、存储、传递、统计、分析、综合查询、报表输出和信息共享,及时为医院领导及各部门管理人员提供全面、准确的各种数据。 门诊医生工作站采用下拉式汉化菜单,界面友好,实用性强,设有与门诊挂号收费系统、医技科室信息系统、住院结算信息系统的软件接口。
1526 1

热门文章

最新文章