`

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

 
阅读更多

原文: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?
分享到:
评论

相关推荐

    单元十:数据类型的隐式转换-数据类型的隐式转换完整版资料.pptx

    1. 隐式类型转换:这是最常见的一种隐式转换方式,编译器或解释器会自动将一种数据类型转换为另一种数据类型。 2. 显式类型转换:这是开发者主动地将一种数据类型转换为另一种数据类型。 隐式转换的优点: 1. 提高...

    C语言隐式类型转换规则

    ### C语言隐式类型转换规则详解 #### 一、引言 C语言作为一种广泛使用的编程语言,具有严格的类型检查机制。在C语言中,不同类型的数值可以通过类型转换来进行混合运算。这种转换分为两种:隐式类型转换和显式类型...

    JavaScript程序设计课件:数据类型转换.pptx

    在这份"JavaScript程序设计课件:数据类型转换"中,主要讲解了如何在JavaScript中进行数据类型的转换,主要包括获取数据类型的方法以及三种主要的数据类型转换:字符串转换、数字转换和布尔型转换。 首先,了解数据...

    类的转换C++的内部数据类型遵循隐式类型转换规则

    这种转换通常分为两种类型:转换构造函数和成员转换函数,这两种方法都遵循C++的隐式类型转换规则。 首先,转换构造函数是一种特殊的构造函数,它的作用是将非本类类型的对象转换成本类的对象。在给定的代码示例中...

    JavaScript隐式类型转换_.docx

    JavaScript中的隐式类型转换是其弱类型特性的重要体现,它允许不同数据类型的值在运算时进行自动转换,但这也可能导致一些意料之外的结果。在JavaScript中,数据类型包括字符串(String)、数字(Number)、布尔(Boolean...

    Scala编程详解 第20讲-Scala编程详解:隐式转换与隐式参数 共9页.pptx

    【课程大纲】第1讲-Spark的前世今生 共12页第2讲-课程介绍、特色与价值 共13页第3讲-Scala编程详解:基础语法 共8页第4...共13页第20讲-Scala编程详解:隐式转换与隐式参数 共9页第21讲-Scala编程详解:Actor入门 共8页

    简单介绍JavaScript数据类型之隐式类型转换

    JavaScript中的隐式类型转换是编程过程中常常遇到的现象,它指的是在特定上下文中,JavaScript自动将一种数据类型转换为另一种数据类型。这种转换通常发生在不同类型的变量进行运算、比较或者其他操作时。JavaScript...

    隐式类型转换

    "隐式类型转换" 隐式类型转换是C语言中的一种重要概念,它指的是在编译时由编译程序按照一定规则自动完成的数据类型转换。这种转换在C语言的表达式中经常出现,当不同类型的数据参与同一运算时,编译器就会按照规定...

    前端面试题之baseJS-==隐式类型转换.zip

    本文将详细探讨“前端面试题之baseJS-==隐式类型转换”这一主题,帮助你掌握JavaScript中的类型转换规则,以便在面试中能够自信地解答相关问题。 在JavaScript中,“==”双等号运算符用于比较两个值是否相等。然而...

    erbing#blog#02:数据类型转换 && 隐式转换 || 显式转换2

    一、从 数字类型 转换成 字符串类型A、 显式转换console.log(typeof numberA) // numberB、 隐式转换console.log

    浅析JavaScript中的隐式类型转换

    隐式类型转换是JavaScript语言中一个十分重要的概念,它是指在某些运算、条件判断或方法调用过程中,不同类型的数据会自动转换为另一种类型,而这种转换是在代码中没有明确指定的情况下发生的。在JavaScript中,类型...

    JavaScript强制类型转换和隐式类型转换操作示例

    本文实例讲述了JavaScript强制类型转换和隐式类型转换。分享给大家供大家参考,具体如下: 在JavaScript中声明变量不需指定类型, 对变量赋值也没有类型检查,同时JavaScript允许隐式类型转换。这些特征说明...

    OAuth:OAuth2.0授权模式:隐式模式技术教程.docx

    OAuth:OAuth2.0授权模式:隐式模式技术教程.docx

    JavaScript中的一些隐式转换和总结(推荐)

    JavaScript中的隐式转换是编程时需要注意的重要概念,它涉及到不同数据类型之间的比较和运算。在JavaScript中,数据类型主要包括Number、Boolean、String、Undefined、Null、Symbol(ES6新增)以及Object(其中Array...

    Java中类型转换.pdf

    在 Java 中,类型转换可以分为两种:隐式类型转换和显式类型转换。隐式类型转换是指自动类型转换,系统自动完成的类型转换。显式类型转换是指强制类型转换,用户明确指明的类型转换。 在实际开发中,类型转换非常...

    JS面试题大坑之隐式类型转换实例代码

    JavaScript中的隐式类型转换是开发者在编写代码时经常会遇到的一个陷阱,尤其在面试中,它经常作为考察开发者对语言理解深度的问题出现。本篇主要探讨的是JavaScript中的隐式类型转换,特别是那些容易出错的实例代码...

    跟我学习javascript的隐式强制转换

    JavaScript中的隐式强制转换是指在进行运算或比较时,不同类型的数据会自动转换成适合的类型,以保证表达式的正确执行。这种转换不依赖于开发者明确的类型转换命令,而是由JavaScript引擎根据语言的规则在背后完成。...

    c++隐式类型转换示例分享

    在C++编程语言中,隐式类型转换(Implicit Type Conversion)是一种编译器自动进行的数据类型转换,通常发生在不需要程序员明确指定的情况下。这种转换在某些操作中是允许的,但可能会导致意料之外的结果,因此需要...

    javascript最常用数据类型转换(最全).doc

    在 JavaScript 中,还可以使用隐式转换将其他类型转换为字符串类型。例如,可以使用加号(+)运算符将其他类型转换为字符串类型。 例如: ```javascript var a = true; var str = a + ""; console.log(str); // ...

Global site tag (gtag.js) - Google Analytics