「译」JavaScript 的怪癖 1:隐式类型转换

DisplayPort 1.4数据扰码实战:16bit LFSR并行优化技巧(附Verilog代码) 本文深入探讨了DisplayPort 1.4协议中16bit数据扰码的并行化实现。针对高带宽视频传输需求,文章详细推导了16位LFSR(线性反馈移位寄存器)的单周期16步并行计算公式,并提供了可直接使用的Verilog代码,解决了传统8bit串行处理吞吐量不足的瓶颈,为高速接口设计提供了关键优化技巧。 阅读详情

原文:JavaScript quirk 1: implicit conversion of values

译文:「译」JavaScript 的怪癖 1:隐式类型转换

译者:justjavac


零:提要

[此贴子是 javascript 的 12 个怪癖(quirks) 系列的第一篇。]

JavaScript 是非常宽容的,「来者不拒」,不在乎什么类型。 例如,它如果想要接受数字,它并不拒绝其他类型的值,而是试图把它们转换成数字:

> '5' - '2'
3
> '5' * '2'
10

自动转换为布尔值通常不会引起问题,而且往往很有用(译注:比如在C语言里,根本就没有布尔类型。by @justjavac)。 即使如此,这些隐式转换也会引起怪癖(quirks)。 但是当自动转换为字符串时,可能会引起问题。

一:隐式转换为布尔:“truthy”和“falsy”

当 JavaScript 需要一个布尔值时(例如:if 语句),任何值都可以被使用。 最终这些值将被转换为 true 或 false。

下面的值被转换为 false:

  • undefined, null
  • Boolean: false
  • Number: -0, +0, NaN
  • String: ''

所有其他值都认为是 true。 被转换成 'false' 的值我们成之为 falsy,被转换成 'true' 的值我们成之为 truthy。 您可以使用 Boolean 来测试一个值到底被转换成了什么。

Boolean 将其参数转换为布尔值(boolean):

> Boolean(undefined)
false
> Boolean(0)
false
> Boolean(3)
true

二、字符串的隐式转换

在 Web 开发中,我们经常得到字符串值,实际上我们期望的却是数字或者布尔值。 例如,用户输入的表单中的数据。 如果你忘了对这些字符串进行显式的转换,那么 JavaScript 会令你感到惊讶,主要体现在两个方面:

  1. 首先,系统不会有任何警告。
  2. 其次,这些值将被自动转换,但确实错误的。

例如,加运算符(+),就有这方面的问题,因为**只要其中一个操作数是字符串,那么它就执行连接字符串的操作(而不是加法操作,即使它们是数字)**。

在下面的 JavaScript 代码中,我们本来预期是把 1 和 5 相加。 但是,我们使用了字符串 '5' 和 '1' 。

> var x = '5';  // 错误的假设:x 是一个数字

> x + 1
'51'

此外,还有一些看似是 false 的值,如果转换成字符串,却成了 'true'。

例如:false。

> Boolean(false)
false
> String(false)
'false'
> Boolean('false')  // !!
true

例如: undefined.

> Boolean(undefined)
false
> String(undefined)
'undefined'
> Boolean('undefined')  // !!
true

三、对象的隐式转换

只有在 JavaScript 表达式或语句中需要用到数字或字符串时,对象才被隐式转换。 当需要将对象转换成数字时,需要以下三个步骤:

  1. 调用 valueOf()。如果结果是原始值(不是一个对象),则将其转换为一个数字。
  2. 否则,调用 toString() 方法。如果结果是原始值,则将其转换为一个数字。
  3. 否则,抛出一个类型错误。

第一步示例:

> 3 * { valueOf: function () { return 5 } }
15

第三步示例:

> function returnObject() { return {} }
> 3 * { valueOf: returnObject, toString: returnObject }
TypeError: Cannot convert object to primitive value

如果把对象转换成字符串时,则转换操作的第一步和第二步的顺序会调换: 先尝试 toString() 进行转换,如果不是原始值,则再尝试使用 valueOf()。

四、相关阅读

  1. JavaScript中,{}+{}等于多少?
  2. JavaScript:将所有值都转换成对象
  3. 为什么 ++[[]][+[]]+[+[]] = 10?
ubuntu-emto-cpa 测试和使用(单核运行) 阅读详情

相关推荐

《广告核心指标驱动的AI投放系统:从数据洞察到智能决策的全链路优化》

本方案通过构建广告核心指标驱动的AI投放系统,实现从数据采集到智能决策的全链路自动化。

专注Java领域与微服务架构,热爱人工智能与深度学习 1068

script转java_java script 数据类型的隐式与强制转换

隐式转换前提 定义一个数字类型 与js基本类型相乘var a=1;var b;var c= a*b;字符隐式转数字b=‘123’时     c=123;b='123a'时    c=NaN;布尔隐式转数字b=true       c=1;b=false c=0;b=null       c=0;b=undedined     c=NaN;...

weixin_29204121的博客 150

CGAL-5.6的安装与编译(Win10+vs2022+CGAL-5.6+Boost1.82.0)

CGAL是Computational Geometry Algorithms Library(计算几何算法库)的缩写,C++的高效算法库。CGAL只是一个头文件库(从5.0版本开始),这意味着CGAL无需编译,只需安装好CGAL的依赖项即可。CGAL5.6。

baidu_34931359的博客 3902

隐式类型转换

隐式转化介绍 在js中,当运算符在运算时,如果两边的数据类型不同意,CPU就无法计算,这时编译器会自动将两边的数据做一个数据类型转换,转成一样的类型再计算. 隐式转换规则 转换成string类型: + (字符串连接符) 转成number类型: ++/-- (自增运算符) + - * / % (算术运算符) > < >= <= == != === !===...

sunny1660的博客 517

3DGS实战避坑指南:从零搭建到成功训练

本文详细介绍了3D Gaussian Splatting(3DGS)从环境配置到成功训练的实战避坑指南。涵盖git clone的正确使用、依赖安装的隐藏陷阱、CUDA版本兼容性解决方案、首次训练验证、常见报错急救方案、性能优化技巧及可视化调试方法,帮助开发者高效搭建和训练3DGS模型。

weixin_29053383的博客 366

房产平台系统小程序源码

🏠 一键解锁购房新体验 🔓房产小程序 实现前端 发布二手房 租房 商品 求租 求购等信息;后台发布 新房,二手房租房 商品 写字楼 求租求购等房源信息;功能完善的一块房产小程序。

2401_84413757的博客 796

2020-11-04

记录2020-11-04前端学习脚步 总结:知识点比较容易理解,靠多敲代码,多使用可以掌握。 今天学习的知识点如下: *字面量 都是一些不可改变的值 * 比如 :1 2 3 4 5 * 字面量都是可以直接使用,但是我们一般都不会直接使用字面量 * * 变量 变量可以用来保存字面量,而且变量的值是可以任意改变的 * 变量更加方便我们使用,所以在开发中都是通过变量去保存一个字面量, * 而很少直接使用字面量 * 可以通过变量对字

weixin_50141423的博客 901

基于Scrapy+Playwright的学术会议信息智能爬取系统实战

本文详细介绍如何使用Python构建一个高效的学术会议信息爬取系统,结合Scrapy框架和Playwright无头浏览器技术,实现对全球学术会议数据的自动化采集、清洗和存储。文章包含完整的技术方案设计、代码实现细节以及性能优化策略,可帮助读者快速掌握现代网络爬虫开发的核心技术。关键词:Python爬虫、Scrapy、Playwright、学术会议、数据采集、反爬对抗python复制下载。

2201_76125261的博客 711

string的隐式转换,以及sizeof, strlen

问题来源:http://cxwangyi.blogspot.com/2010/05/hadoop-pipes-is-incompatible-with.html 关键部分截取如下: In your mapper you have the line:       context.emit("", "apple/norange/0banana/tpapaya"); The signature for the emit method is:       TaskContext::emit(co

928

动量因子在A股市场的有效性分析:量化实证研究

验证动量因子在A股市场的有效性及时间周期性分析不同时间窗口(短期/中期/长期)对动量效应的影响量化交易成本、市场流动性对动量策略收益的侵蚀程度比较A股与成熟市场(如美股)动量效应的差异特征理论框架:行为金融学解释动量效应的产生机制技术实现:Python全流程代码实现动量因子计算与回测实证分析:统计检验、风险收益指标、敏感性分析应用拓展:结合市场微观结构的策略优化方案动量因子(Momentum Factor)

2501_92132293的博客 2484

MATLAB点云处理(八):为点云添加高斯噪声

本文对如何借助MATLAB,为点云添加高斯噪声做出了说明,并给出实现代码。

孙悟空 2844

JavaScript进阶系列-类型转换、隐式类型转换

我的博客仓库 类型转换、隐式类型转换 用来放一些我看的书籍和学习的记录,欢迎点赞和讨论。 转换为字符串 ECMAScript 的 Boolean 值、数字和字符串的原始值都是伪对象,这意味着它们可以使用原型对象上面的属性和方法。 ECMAScript 定义所有对象都有 toString() 方法,无论它是伪对象,还是真对象。 let obj = {name:'obj'}; obj.toStri...

weixin_34318326的博客 1193

【论文复现】——基于欧式聚类的车载点云道路提取

针对车载激光点云道路信息提取的问题,提出了一种基于欧式聚类的道路提取方法。首先通过统计滤波去除噪点以免对后续处理结果产生影响,然后用坡度滤波去除路坎点,使道路边界与人行道、绿化带等与路坎相连的地物形成10~25 cm的高程阶跃,最后用欧式聚类将路面点云与其他地物点云聚类为一簇或多簇并保留道路簇,从而实现道路点云的精确提取。

点云侠的博客 1135

JavaScript 隐式类型转换

JavaScript 是非常宽容的,「来者不拒」,不在乎什么类型。 例如,它如果想要接受数字,它并不拒绝其他类型的值,而是试图把它们转换成数字: > '5' - '2' 3 > '5' * '2' 10 自动转换为布尔值通常不会引起问题,而且往往很有用(译注:比如在C语言里,根本就没有布尔类型。by @justjavac)。 即使如此,这些隐式转换也会引起怪癖(quirks)。 但是当自动转换为字符串时,可能会引起问题。 一:隐式转换为布尔:“truthy”和“falsy” 当 JavaScr

树上骑个猴的博客 795

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

总结javascript的那些怪癖

/**  *  * @authors Benjamin(http://blog.youkuaiyun.com/cuew1987)  * @date    2013-11-29 14:04:00  * @content 总结javascript的那些怪癖(trick)     */ /**  * trick01:NaN是个数值  * NaN:表示某个值不是数值,但其本身又是数值,且不等于其自

Benjamin——前端攻城师 1584

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

JavaScript-怪癖检测

例如,IE8及更早版本中存在一个bug,即如果某个实例属性与标记为[[DontEnum]]的某个原型属性同名,那么该实例属性将不会出现在fon-in循环当中。一般来说,“怪癖”都是个别浏览器所独有的,而且通常被归为bug。由于检测“怪癖”涉及运行代码,因此我们建议仅检测那些对你有直接影响的“怪癖”,而且最好在脚本一开始就执行此类检测,以便尽早解决问题。如果浏览器存在这个bug,那么使用for-in循环枚举带有自定义的toString()方法的对象,就会返回两个toString的实例。

zf888999666的博客 203

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

JavaScript 怪癖

如果对你来说JavaScript还是一门全新的语言,或者你是在最近的开发中才刚刚对它有所了解,那么你可能会有些许挫败 感。任何编程语言都有它自己的怪癖(quirks)——然而,当你从那些强类型的服务器端语言转向JavaScript的时候 ,你会感到非常困惑。我就是这样!当我在几年前做全职JavaScript开发的时候,我多么希望关于这门语言的许多事情我能尽早地知道。我希望通过本文中分享的一些怪癖能

u010804100的专栏 605

javascript客户端检测 记录一些“怪癖”

因为市面上多种浏览器之间的差异,和不同浏览器的“怪癖”,所以我们在开发时可能需要客户端检测,确保自己的代码能顺利的在全部浏览器上运行 第一种最常用的客户端检测——能力检测。能力检测的目标不是识别特定的浏览器,而是识别浏览器的能力 if(object.propertyInQuestion){ //使用object.propertyInQuestion } 就是在运行代...

weixin_30851409的博客 70

译文:Javascript的12个怪癖【未翻译完持续更新】

实际上javascript 是一个相当简洁的语言,但是也难免会有一些怪癖(quirks)。 这是这个系列的目录,可阅读已经译好的章节,也可收藏等待翻译完成。译者:justjavac 他在github上的原始目录:https://github.com/justjavac/12-javascript-quirks/blob/master/cn/content.md 原文:12 JavaScrip

kengdie1029的专栏 786

js怪癖

偶然看见,问问那些不注重细节的童鞋,哈哈哈~ 问题:为什么 ++[[]][+[]]+[+[]] = 10? 原理:js的隐式类型转换 参考链接:http://justjavac.com/javascript/2012/12/20/object-plus-object.html 注意:js运算符优先级 运算符 描述 . [] () 字段访问、数

panying0903的专栏 1374

翻译编辑-JavaScript有关的10个怪癖和秘密

数据类型和定义 1. Null是个对象 JavaScript众多类型中有个Null类型,它有个唯一的值null, 即它的字面量,定义为完全没有任何意义的值。其表现得像个对象,如下检测代码: alert(typeof null); //弹出 'object' 您可以狠狠地点击这里:null为对象测试demo 如下截图: 尽管typeof值显示是"object",但n...

amsm18138的博客 189

JavaScript 隐式转换

javascript 中的怪癖,js运算符隐式类型转换 x + "" //等价于 String(x) + x //等价于 Number(x),也可以写成x-0 !!x //等价于 Boolean(x),注意是双叹号! var now = new Date();//创建一个日期对象 typeof(now + 1)//=> "string":"+...

dianhang3622的博客 104

JavaScript有关的10个怪癖和秘密

JavaScript有关的10个怪癖和秘密 发布时间: 2011-08-25 15:11  阅读: 2313 次  原文链接  全屏阅读 [收藏]   摘要:在本片文章中,作者将向您讲述JavaScript中最鲜为人知的秘密。   原文作者:Andy Cro

我的博客 799

说说 JavaScript 对浏览器的怪癖检测

怪癖检测指的是识别浏览器的特殊行为,就是浏览器的缺陷行为。通常是运行一段代码来确定某个特性不能正常工作。在 IE8以及更早的版本中存在着这样一个 bug:如果某个实例属性与标记为 [[DontEnum]] 的某个原型属性同名,那么这个实例属性不会出现在 for-in 循环中,因此可以这样检测://IE8 及早期版本,会把某个与原型属性同名的属性,排除在 for-in 循环外 var hasDontE

读万卷书,行万里路 1027
上一篇: Object.create疑问
下一篇: 「译」JavaScript 的怪癖 2:两个「空值」:undefined 和 null
迷渡
迷渡 领域专家: 前端开发技术领域 领域专家: 前端开发技术领域
博客等级 码龄19年 2405粉丝 124原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值