原文: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 会令你感到惊讶,主要体现在两个方面:
- 首先,系统不会有任何警告。
- 其次,这些值将被自动转换,但确实错误的。
例如,加运算符(+),就有这方面的问题,因为**只要其中一个操作数是字符串,那么它就执行连接字符串的操作(而不是加法操作,即使它们是数字)**。
在下面的 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 表达式或语句中需要用到数字或字符串时,对象才被隐式转换。 当需要将对象转换成数字时,需要以下三个步骤:
- 调用
valueOf()
。如果结果是原始值(不是一个对象),则将其转换为一个数字。
- 否则,调用
toString()
方法。如果结果是原始值,则将其转换为一个数字。
- 否则,抛出一个类型错误。
第一步示例:
> 3 * { valueOf: function () { return 5 } }
15
第三步示例:
> function returnObject() { return {} }
> 3 * { valueOf: returnObject, toString: returnObject }
TypeError: Cannot convert object to primitive value
如果把对象转换成字符串时,则转换操作的第一步和第二步的顺序会调换: 先尝试toString()
进行转换,如果不是原始值,则再尝试使用valueOf()
。
四、相关阅读
- JavaScript中,{}+{}等于多少?
- JavaScript:将所有值都转换成对象
- 为什么 ++[[]][+[]]+[+[]] =
10?
分享到:
相关推荐
C语言隐式类型转换规则。了解一下对写程序有好处,可以防止不必要的错误
类的转换,C++的内部数据类型遵循隐式类型转换规则,成员转换函数
本文实例讲述了JavaScript强制类型转换和隐式类型转换。分享给大家供大家参考,具体如下: 在JavaScript中声明变量不需指定类型, 对变量赋值也没有类型检查,同时JavaScript允许隐式类型转换。这些特征说明...
JavaScript的数据类型分为六种,分别为null,undefined,boolean,string,number,object。object是引用类型,其它的五种...本章节单独介绍一下javascript中的隐式数据类型转换,对于它的良好掌握,在实际应用能够简化很多
JavaScript隐式类型转换_.docx
单元十:数据类型的隐式转换-数据类型的隐式转换完整版资料.pptx
=> 对两个 NULL 做比较时会返回 1,这两种情况都不需要做类型转换 – 两个参数都是字符串,会按照字符串来比较,不做类型转换 – 两个参数都是整数,按照整数来比较,不做类型转换 – 十六进制的值和非数字做比较时...
一、从 数字类型 转换成 字符串类型A、 显式转换console.log(typeof numberA) // numberB、 隐式转换console.log
jQuery第5天知识点:隐式迭代、链式编程、jQuery插件.7z
主要介绍了JavaScript中的一些隐式转换和总结,非常不错,具有参考借鉴价值,需要的朋友可以参考下
本文实例讲述了JavaScript隐式类型转换操作。分享给大家供大家参考,具体如下: JavaScript的数据类型是非常弱的(不然不会叫它做弱类型语言了)!在使用算术运算符时,运算符两边的数据类型可以是任意的,比如,一...
本文主要给大家介绍了关于JavaScript运算符规则和隐式类型转换的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。 隐式类型转换 在 JavaScript 中,当我们进行比较操作或者加减乘除四...
c编程过程中的数据类型隐式转换,帮助初学者了解数据结构的类型,减少数据类型锁带来的编码错误
谈谈JavaScript的隐式类型转换,我们知道在JavaScript中声明变量不需指定类型, 对变量赋值也没有类型检查,同时JavaScript允许隐式类型转换。这些特征说明JavaScript属于弱类型的语言。
如果把通过函数或方法调用,明确的将某种类型转换成另一种类型称为显示转换 ,相反则称为隐式类型转换 。google和维基百科中没有找到“显示类型转换”,“隐式类型转换”的字眼。暂且这么称呼。 一、 运算中存在的...
主要介绍了c++隐式类型转换的二个示例,需要的朋友可以参考下
之所以不同的数据类型之间可以做运算,是因为JavaScript引擎在运算之前会悄悄的把他们进行了隐式类型转换的,如下是数值类型和布尔类型的相加: 复制代码 代码如下: 3 + true; // 4 结果是一个数值型!如果是在C...