首页 web前端 前端问答 JavaScript类型转换(详解及实例)

JavaScript类型转换(详解及实例)

Jan 12, 2022 pm 06:05 PM
html javascript 前端

本篇文章给大家带来了JavaScript中类型转换的相关知识,将值转换为原始值、转换为数字和转换为字符串,这刚好对应了引擎内部的三种抽象操作:ToPrimitive()、ToNumber()、ToString(),希望对大家有帮助。

JavaScript类型转换(详解及实例)

JavaScript 加法规则

在JavaScript中,加法的规则其实很简单,只有两种情况:

  • 数字和数字相加

  • 字符串和字符串相加

所有其他类型的值都会被自动转换成这两种类型的值

在JavaScript中,一共有两种类型的值:

  • 原始值有:undefined、null、 布尔值(boolean)、 数字(number)、字符串(string)、symbol

  • 对象值:其他的所有值都是对象类型的值,包括数组(arrays)和函数(functions)

类型转换

加法运算符会触发三种类型转换:将值转换为原始值、转换为数字、转换为字符串,这刚好对应了JavaScript引擎内部的三种抽象操作:ToPrimitive()、ToNumber()、ToString()

通过 ToPrimitive() 将值转换为原始值

ToPrimitive(input, PreferredType?)
登录后复制

可选参数PreferredType可以是Number或者String,它只代表了一个转换的偏好,转换结果不一定必须是这个参数所指的类型,但转换结果一定是一个原始值.如果PreferredType被标志为Number,则会进行下面的操作来转换输入的值 (§9.1):

  • 如果输入的值已经是个原始值,则直接返回它.

  • 否则,如果输入的值是一个对象.则调用该对象的valueOf()方法.如果valueOf()方法的返回值是一个原始值,则返回这个原始值.

  • 否则,调用这个对象的toString()方法.如果toString()方法的返回值是一个原始值,则返回这个原始值.

  • 否则,抛出TypeError异常.

如果PreferredType被标志为String,则转换操作的第二步和第三步的顺序会调换.如果没有PreferredType这个参数,则PreferredType的值会按照这样的规则来自动设置: Date类型的对象会被设置为String,其它类型的值会被设置为Number.

通过ToNumber()将值转换为数字

01.png

如果输入的值是一个对象,则会首先会调用ToPrimitive(obj, Number)将该对象转换为原始值,然后在调用ToNumber()将这个原始值转换为数字.

通过ToString()将值转换为字符串

02.png

如果输入的值是一个对象,则会首先会调用ToPrimitive(obj, String)将该对象转换为原始值,然后再调用ToString()将这个原始值转换为字符串.

demo

var obj = {
    valueOf: function () {
        console.log("valueOf");
        return {}; // 没有返回原始值
    },
    toString: function () {
        console.log("toString");
        return {}; // 没有返回原始值
    }
}
登录后复制

Number作为一个函数被调用(而不是作为构造函数调用)时,会在引擎内部调用ToNumber()操作:

Number(obj)
// output
valueOf
toString
Uncaught TypeError: Cannot convert object to primitive value
String(obj)
// output
toString
valueOf
Uncaught TypeError: Cannot convert object to primitive value
登录后复制

加法

    value1 + value2
登录后复制

在计算这个表达式时,操作步骤是这样的:

  • 将两个操作数转换为原始值 (下面是数学表示法,不是JavaScript代码):

    prim1 := ToPrimitive(value1)
    prim2 := ToPrimitive(value2)
登录后复制

PreferredType被省略,因此 Date 类型的值采用String,其他类型的值采用Number.

  • 如果 prim1 或者 prim2 中的任意一个为字符串,则将另外一个也转换成字符串,然后返回两个字符串连接操作后的结果;

  • 否则,将 prim1 和 prim2 都转换为数字类型,返回他们的和。

[]+[]

输出: ''

[]会被转换成一个原始值,首先尝试 valueOf() 方法,返回数组本身(this):

> var arr = [];
> arr.valueOf() === arr
true
登录后复制

这样的结果不是原始值,所以再调用 toString() 方法,返回一个空字符串(是一个原始值)。因此,[] + [] 的结果实际上是两个空字符串的连接.

> [] + {}
'[object Object]'
登录后复制

{} + {}

输出:NaN

  • JavaScript引擎将第一个{}解释成了一个空的代码块并忽略了它

  • 这里的加号并不是代表加法的二元运算符,而是一个一元运算符,作用是将它后面的操作数转换成数字,和 Number() 函数完全一样。例如:

+{}
Number({})
Number({}.toString())  // 因为{}.valueOf()不是原始值
Number("[object Object]")
NaN
登录后复制
> {} + []
0
登录后复制
  • {} 忽略

  • +[] = Number([]) = Number([].toString()) = Number("") = 0

有趣的是,Node.js的REPL在解析类似的输入时,与Firefox和Chrome(和Node.js一样使用V8引擎)的解析结果不同.下面的输入会被解析成一个表达式,结果更符合我们的预料:

> {} + {}
'[object Object][object Object]'
> {} + []
'[object Object]'
登录后复制

总结

对象.valueOf() === 对象

数组对象.toString() === 数组对象.join()

对象.toString() === "[object Object]"

Javacript 中 + 号工作:

  • 数字 + 数字

  • 字符串 + 字符串

【相关推荐:javascript学习教程

以上是JavaScript类型转换(详解及实例)的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解锁Myrise中的所有内容
4 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

HTML 中的表格边框 HTML 中的表格边框 Sep 04, 2024 pm 04:49 PM

HTML 表格边框指南。在这里,我们以 HTML 中的表格边框为例,讨论定义表格边框的多种方法。

HTML 左边距 HTML 左边距 Sep 04, 2024 pm 04:48 PM

HTML 左边距指南。在这里,我们讨论 HTML margin-left 的简要概述及其示例及其代码实现。

HTML 中的嵌套表 HTML 中的嵌套表 Sep 04, 2024 pm 04:49 PM

这是 HTML 中嵌套表的指南。这里我们讨论如何在表中创建表以及相应的示例。

HTML 表格布局 HTML 表格布局 Sep 04, 2024 pm 04:54 PM

HTML 表格布局指南。在这里,我们详细讨论 HTML 表格布局的值以及示例和输出。

HTML 有序列表 HTML 有序列表 Sep 04, 2024 pm 04:43 PM

HTML 有序列表指南。在这里我们还分别讨论了 HTML 有序列表和类型的介绍以及它们的示例

HTML 输入占位符 HTML 输入占位符 Sep 04, 2024 pm 04:54 PM

HTML 输入占位符指南。在这里,我们讨论 HTML 输入占位符的示例以及代码和输出。

在 HTML 中移动文本 在 HTML 中移动文本 Sep 04, 2024 pm 04:45 PM

HTML 中的文本移动指南。在这里我们讨论一下marquee标签如何使用语法和实现示例。

HTML onclick 按钮 HTML onclick 按钮 Sep 04, 2024 pm 04:49 PM

HTML onclick 按钮指南。这里我们分别讨论它们的介绍、工作原理、示例以及各个事件中的onclick事件。

See all articles