本文主要介绍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中强制类型转换的详细解释和集成。希望对你有帮助。如果您有任何问题,请给我留言,边肖将及时回复您。非常感谢您对我们网站的支持!
原文地址:http://www.ccttoo.com/html/2343.html
本文来自网络,不代表菜鸟教程之家立场,转载请注明出处。