什么是Javascript中的类型强制转换Coercion?

栏目: JavaScript · 发布时间: 6年前

内容简介:类型强制Coercion是将值从一种类型转换为另一种类型的过程(例如字符串转换为数字,对象转换为布尔值等)。任何类型,无论是原始类型还是对象,都是类型强制的有效主体coercion有两种表现形式:显式和隐式。下面是显式明确方式的案例:

类型强制Coercion是将值从一种类型转换为另一种类型的过程(例如字符串转换为数字,对象转换为布尔值等)。任何类型,无论是原始类型还是对象,都是类型强制的有效主体

coercion有两种表现形式:显式和隐式。

下面是显式明确方式的案例:

var a = "42";

var b = Number(a);

a;              // "42"
b;              // 42 -- 数字型!

下面是隐式转换,也就是悄悄在做其他事时转换了。

var a = "42";

var b = a * 1;  // "42" 已经隐式转换到 42

a;              // "42"
b;              // 42 -- 数字型!

在90%的使用案例中,最好避免隐式类型强制。隐式强制是一种双刃剑:它是挫折和缺陷的重要来源,但也是一种有用的机制,它允许我们在不失去可读性的情况下编写更少的代码。

但是,JavaScript中只有三种类型的转换:

  • 转换到 string
  • 转换到 boolean
  • 转换到 number

原始类型和对象之间转换是不同的,但是原始类型和对象只能按照这三种方式转换。

字符串转换

要将值显式转换为字符串,请应用该String()函数。当任何操作符是字符串时,使用+二元运算符会触发隐式强制:

String(123)//显式
123 +''//隐式

所有原始值都会自然地转换为字符串:

String(123)                   // '123'
String(-12.3)                 // '-12.3'
String(null)                  // 'null'
String(undefined)             // 'undefined'
String(true)                  // 'true'
String(false)                 // 'false'

Symbol(符号 是ES6引入了一种新的原始数据类型,表示独一无二的值。它是 JavaScript 语言的第七种数据类型。Symbol转换有点棘手,因为它只能显式转换,但不能隐式转换:

String(Symbol('my symbol'))   // 'Symbol(my symbol)'
'' + Symbol('my symbol')      // TypeError is thrown

布尔转换

要将值显式转换为布尔值,请应用该Boolean()函数。

而隐式转换发生在逻辑上下文中,或由逻辑运算符(|| && !)触发。

Boolean(2)          // 显式
if (2) { ... }      // 隐式
!!2                 // 隐式
2 || 'hello'        // 隐式

逻辑运算符,如||和&&做布尔转换内部,但 实际上将返回原来的操作数的值 ,即使他们不是布尔值。

//返回数字123,而不是返回true 
//'hello'与123仍在内部强制转换为boolean以计算表达式
let x ='hello' && 123; // x === 123

一旦可能有两个的布尔转换结果:true或者false,它就更容易记住false:

Boolean('')           // false
Boolean(0)            // false     
Boolean(-0)           // false
Boolean(NaN)          // false
Boolean(null)         // false
Boolean(undefined)    // false
Boolean(false)        // false

不在上述列表中的任意值都会被转换为true,包括对象,函数Array,Date,用户定义的类型,等等。符号Symbols 是true。空对象和数组也是true的值:

Boolean({})             // true
Boolean([])             // true
Boolean(Symbol())       // true
!!Symbol()              // true
Boolean(function() {})  // true

数字转换

对于显式转换,只需应用Number()函数,就像使用Boolean()和执行一样String() 。

隐式转换很棘手,因为它在更多情况下被触发:

  • 比较运算符(>,<,<=,>=)
  • 按位运算符(| & ^ ~)
  • 算术运算符(- + * / %)。注意, 进行二进制文件+操作时,当任何一个操作数是字符串时,不会触发数字转换。
  • 一元运算+符
  • 松散的平等运算符==(包括  !=)。 
    请注意,使用两个等于号==,当两个操作数都是字符串时,不会触发数字转换。
Number('123')   // 显式
+'123'          // 隐式
123 != '456'    // 隐式
4 > '5'         // 隐式
5/null          // 隐式
true | 0        // 隐式

要记住两个 特殊规则

1. ==到null或undefined,数字转换不会发生。null仅等于null或等于或undefined等于其他任何东西。

2. NaN甚至不等于任何东西.

对象转换

对象和JS引擎遇到表达式[1] + [2,3]时,首先需要将对象转换为原始值,然后将其转换为最终类型。仍然只有三种类型的转换:数字,字符串和布尔值。

最简单的情况是布尔转换:无论对象或数组是否为空,任何非原始值都始终

被强制转换  true。

通过内部[[ToPrimitive]]方法将对象转换为原始类型,该方法负责数字和字符串转换。

规则1 :所有运算符将不同类型的操作数转换为数字。

例外1 逻辑运算符将它们转换为布尔值。

例外2:对象操作使用==和+ 时是使用ToPrimitive,首先为Date对象尝试toString,然后返回对象的包装符号值Symbol,null与undefined只在使用==时仅考虑彼此相等,不会转化为任何其它类型。

例外3:如果其中一个操作数是字符串,则+操作员也将另一个操作数转换为字符串。

Javascript/ES6专题

Javascript专题


以上所述就是小编给大家介绍的《什么是Javascript中的类型强制转换Coercion?》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

黑客攻防技术宝典(第2版)

黑客攻防技术宝典(第2版)

[英] Dafydd Stuttard、[英] Marcus Pinto / 石华耀、傅志红 / 人民邮电出版社 / 2012-6-26 / 99.00元

内容简介: Web应用无处不在,安全隐患如影随形。承载着丰富功能与用途的Web应用程序中布满了各种漏洞,攻击者能够利用这些漏洞盗取用户资料,实施诈骗,破坏其他系统等。近年来,一些公司的网络系统频频遭受攻击,导致用户信息泄露,造成不良影响。因此,如何确保Web应用程序的安全,已成为摆在人们眼前亟待解决的问题。 本书是Web安全领域专家的经验结晶,系统阐述了如何针对Web应用程序展开攻击与......一起来看看 《黑客攻防技术宝典(第2版)》 这本书的介绍吧!

在线进制转换器
在线进制转换器

各进制数互转换器

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具