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

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

内容简介:类型强制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?》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

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

白话机器学习算法

白话机器学习算法

[新加坡] 黄莉婷、[新加坡] 苏川集 / 武传海 / 人民邮电出版社 / 2019-2 / 49.00元

与使用数学语言或计算机编程语言讲解算法的书不同,本书另辟蹊径,用通俗易懂的人类语言以及大量有趣的示例和插图讲解10多种前沿的机器学习算法。内容涵盖k均值聚类、主成分分析、关联规则、社会网络分析等无监督学习算法,以及回归分析、k最近邻、支持向量机、决策树、随机森林、神经网络等监督学习算法,并概述强化学习算法的思想。任何对机器学习和数据科学怀有好奇心的人都可以通过本书构建知识体系。一起来看看 《白话机器学习算法》 这本书的介绍吧!

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

HTML 编码/解码

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具