,,详解JavaScript中的强制类型转换

,,详解JavaScript中的强制类型转换

本文主要介绍JavaScript中的强制类型转换,通过示例代码介绍的非常详细,对大家的学习或者工作都有一定的参考价值。有需要的朋友下面和边肖一起学习。

avaScript 原语

JavaScript是建立在一系列基本单元之上的。您应该已经熟悉其中的一些,如字符串和数字:

var greet=' Hello

var年=89;

字符串和数字是语言的所谓“原语”的一部分。完整列表如下:

线

数字

布尔代数学体系的

不明确的

目标

符号(ES 6在ES6中增加,此处不介绍)

布尔值用来表示可能为真或为假的值。故意不将Null赋值。它通常被赋给一个变量,用来表示绑定完成,以后会填充有意义的内容。

var maybe=null

然后未定义,这意味着变量仍未附加:

var名称;

console.log(名称)

不明确的

Null和undefined看起来很像,但是是两个完全不同的实体,很多开发者还是不确定用哪个。

如果要判断JavaScript实例的类型,可以使用typeof运算符。让我们用绳子试试:

“亚历克斯”的类型

字符串

和数字:

9的类型

'编号'

用于布尔值:

假的类型

布尔型

未定义:

未定义的类型

'未定义'

和null:

null的类型

'对象'

结果令人惊讶!Null看起来像是一个对象,但实际上它是JavaScript的一个历史性错误,从语言诞生起就一直躺在那里。因为这些问题,JavaScript一直名声在外。但这仅仅是开始。

陌生的事情

在JavaScript中,在两种类型之间转换时有一些奇怪的规则。让我给你一些背景资料。我们用Python举个例子。在Python中执行以下指令:

你好89年

会给你一个明确的错误:

TypeError:只能将字符串(**而不是** 'int ')连接到字符串

在JavaScript中,只有天空是你的极限:

你好89年

事实上,鉴于:

你好,89

如果我们试图给一个字符串添加一个数组,它看起来会更奇怪:

你好'[]

会得到

你好

你好'[89]

会给你一个惊喜:

你好,89

这种转变的背后似乎有一定的逻辑。它甚至适用于具有更多元素的数组:

你好[89,150.156,'迈克']

获取:

你好,89,150.156,迈克

这两行JavaScript就足够Java程序员逃了。但是这个行为在JavaScript中是100%有意义的。因此,这种隐式转换,也称为强制类型转换,是值得探讨的。

当一个数字变成一个字符串

有些编程语言有一个概念叫做类型转换,意思是:如果我想把一个数字或实例转换成另一种类型,那么我必须进行显式转换。它也适用于JavaScript。请看下面的例子:

var greet=' Hello

var年=89;

如果我想显式转换,我可以在代码中指明我的意图:

var greet=' Hello

var年=89;

var yearString=year.toString()

或者这样做:

var greet=' Hello

var年=89;

var yearString=String(年份)

然后我可以连接两个变量:

迎接岁月的流逝;

但是JavaScript中有一个微妙的机制叫做隐式转换,它是由JavaScript引擎提供的。这种语言不会阻止我们添加数字和字符串:

你好89年

将获得:

你好,89

但这种转变背后的逻辑是什么?您可能会惊讶地发现,JavaScript中的加法运算符会自动将两个操作数中的任何一个转换为字符串,如果其中至少有一个是字符串的话!

更令人惊讶的是,这条规则与ECMAScript规范一脉相承。11.6.1节定义了加法运算符的行为,我在这里为大家做了一个总结:

如果x是字符串或y是字符串,则返回ToString(x ),然后返回ToString(y)

这一招只适用于数字吗?不完全是。数组和对象也经历相同的转换:

你好[89,150.156,'迈克']

将获得:

你好,89,150.156,迈克

那么下面代码的结果是什么呢:

您好' {姓名:'雅格布' }

要找到答案,您可以通过将对象转换为字符串来进行快速测试:

字符串({名称:'雅格布' })

将获得:

[对象对象]'

所以我有一种感觉:

您好' {姓名:'雅格布' }

将获得:

你好[对象对象]'

停下来。这是什么?

JavaScript中的[object Object]是什么意思?

“[object Object]”是最常见的JavaScript“怪癖”之一。

几乎每个JavaScript实例都有一个名为toString()的方法,有些方法由Object.prototype.toString提供

有些类型(如数组)实现自定义版本的toString(),以便在调用方法时将值转换为字符串。例如,Array.prototype.toString重写Object.toString()(也称为methodshading)。

但在普通JavaScript对象上调用toString()时,引擎会给出“[object Object]”,因为Object.toString()的默认行为是按实体类型(本例中为Object)返回字符串对象。

现在我们来关注一下JavaScript比较运算符,它和算术运算符一样奇怪。

等于还是不等于?

JavaScript中有两个主要的比较运算符。

第一种我们称之为“弱比较”。这是抽象的比较运算符(双等号):==。

另一种是“强比较”,可以用三个等号来标识:===也叫严格比较运算符。他们的行为方式完全不同。

看一些例子。首先,如果我们用两个运算符比较两个字符串,我们会得到相同的结果。

你好=='你好'

真实的

'你好'==='你好'

真实的

一切似乎都没问题。

现在试着比较两种不同的类型,数字和字符串。首先是“强对比”:

'1'===1

错误的

有道理!字符串“1”不同于数字1。但是“弱比较”会怎么样呢?

'1'==1

真实的

其实是真的!除非这个行为和我们之前看到的隐式转换有关,否则没有任何意义。

如果同样的规则适用呢?没错!Eccriptspec再次出击。结果抽象比较运算符在比较类型之前自动在它们之间进行转换。这是规范的摘要:

如下执行比较x==y:

如果x是字符串,y是数字,则返回与Number(x)==y的比较结果。

规范说:如果第一个操作数是字符串,第二个操作数是数字,那么就把第一个操作数转换成数字。有意思。

JavaScript规范中充满了这种疯狂的规则,我强烈建议您深入研究。

同时,除非你有充分的理由,否则避免在JavaScript代码中使用抽象的比较操作符。你以后会感谢自己的。

那么“强对比”怎么样?在规范中,在将值与第三类===进行比较之前,严格相等比较不会自动转换。在代码中使用严格的相等比较可以避免愚蠢的bug。

摘要

JavaScript有七个积木,分别是字符串、数字、布尔、空、未定义、对象和符号。这些类型被称为原语。

JavaScript开发人员可以使用算术和比较运算符来操作这些类型。但是要特别注意加法运算符和抽象比较运算符==,本质上倾向于类型之间的转换。

以上是边肖介绍的JavaScript中强制类型转换的详细解释和集成。希望对你有帮助。如果您有任何问题,请给我留言,边肖将及时回复您。非常感谢您对我们网站的支持!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: