We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
当我们在使用 Boolean() 来进行转换时,有如下转换规则:
Boolean()
另外需要注意的是,如果在使用Boolean()时不传参数结果也是为false的
false
console.log(String(0)) // '0' console.log(String(1)) // '1' console.log(String(100)) // '100' console.log(String(NaN)) // 'NaN' console.log(String(10n)) // '10' console.log(String(10n) === '10') // true
记忆方法:
null
0
Symbol
NaN
undefined
console.log(new Object('1')) // String{'1'} console.log(new Object(1)) // Number{1} console.log(new Object(true)) // Boolean{true} console.log(new Object(Symbol(1))) // Symbol{Symbol(1)} console.log(new Object(10n)) // BigInt{10n} console.log(new Object(null)) // {} console.log(new Object(undefined)) // {}
传入的基本数据类型是什么类型的,那么最终的结果就会转为对应的包装类,但是对于 null、undefined 它们会被忽略,生成的会是一个空对象。
原始值转对象主要有以下总结:
String
Number
Boolean
new
new Object()
基本类型的包装对象的特点:
typeof
object
toString()
ToPrimitive(input, PreferredType?)
参数:
input
PerferredType
而它对于传入参数的处理是比较复杂的,看看这幅流程图:
数组转字符串主要是这样:
[]
""
","
配合着引用类型转字符串的图:
NaN这个六亲不认的连它自己都不全等(也就是 NaN===NaN 的结果为false),只有用 Object.is(NaN, NaN) 才会被判断为true。
NaN===NaN
Object.is(NaN, NaN)
若是一方为null、undefined,则另一方必须为null或者undefined才为true,也就是null == undefined为true或者null == null为true,因为undefined派生于null。
会把String转成Number再来比较:
会将Boolean转为Number来比较,而通过上篇我们知道,Boolean转Number那是相当简单的,只有两种情况:
会将对象执行类似ToNumber操作之后再进行比较的,但是又由于对象的valueOf()基本都是它本身,所以我们可以认为省略了这一步:
当使用 == 进行比较的时候,会有以下转换规则(判断规则):
==
2 == 3
true
null == undefined
null == null
当一方有为对象的时候,实际是会将对象执行ToNumber操作之后再进行比较的,但是又由于对象的valueOf()基本都是它本身,所以我们可以认为省略了这一步。
可以对照下面的流程图看一下:
!
当使用 ! 的时候,实际上会将 ! 后面的值转换为布尔类型来进行比较,而且这种转换是不会经过 valueOf 或者 toString 的,而是直接转换为了布尔值。
valueOf
toString
+
-
*
/
%
对象的 + 号类型转换:
toPrimitive
hint
default
valueof
The text was updated successfully, but these errors were encountered:
No branches or pull requests
其它数据类型转布尔值
当我们在使用
Boolean()
来进行转换时,有如下转换规则:原始值转字符串
数字转字符串
原始值转数字
记忆方法:
null
转为0
Symbol
会报错NaN
,undefined
都会被转为NaN
原始值转对象
传入的基本数据类型是什么类型的,那么最终的结果就会转为对应的包装类,但是对于
null
、undefined
它们会被忽略,生成的会是一个空对象。原始值转对象主要有以下总结:
String
、Number
、Boolean
有两种用法,配合new
使用和不配合new
使用,但是 ES6 规范不建议使用new
来创建基本类型的包装类。new Object()
来创建或转换为一个基本类型的包装类。基本类型的包装对象的特点:
typeof
检测它,结果是object
,说明它是一个对象toString()
调用的时候返回的是原始值的字符串toPrimitive
参数:
input
,表示要处理的输入值PerferredType
,期望转换的类型,可以看到语法后面有个问号,表示是非必填的。它只有两个可选值,Number
和String
。而它对于传入参数的处理是比较复杂的,看看这幅流程图:
数组转字符串主要是这样:
[]
是被转换为空字符串""
","
连接配合着引用类型转字符串的图:
使用==比较时的类型转换
NaN 与其它类型的比较
NaN这个六亲不认的连它自己都不全等(也就是
NaN===NaN
的结果为false),只有用Object.is(NaN, NaN)
才会被判断为true。null/undefined 与其它类型的比较
若是一方为null、undefined,则另一方必须为null或者undefined才为true,也就是null == undefined为true或者null == null为true,因为undefined派生于null。
String 与 Number 的比较
会把String转成Number再来比较:
Boolean 与其它类型的比较
会将Boolean转为Number来比较,而通过上篇我们知道,Boolean转Number那是相当简单的,只有两种情况:
Object 与 String/Number/Symbol 的比较
会将对象执行类似ToNumber操作之后再进行比较的,但是又由于对象的valueOf()基本都是它本身,所以我们可以认为省略了这一步:
总结
当使用
==
进行比较的时候,会有以下转换规则(判断规则):2 == 3
肯定是为false
的null
、undefined
,则另一方必须为null
或者undefined
才为true
,也就是null == undefined
为true
或者null == null
为true
,因为undefined
派生于null
String
,是的话则把String
转为Number
再来比较Boolean
,是的话则将Boolean
转为Number
再来比较当一方有为对象的时候,实际是会将对象执行ToNumber操作之后再进行比较的,但是又由于对象的valueOf()基本都是它本身,所以我们可以认为省略了这一步。
可以对照下面的流程图看一下:
!
运算符的转换当使用
!
的时候,实际上会将!
后面的值转换为布尔类型来进行比较,而且这种转换是不会经过valueOf
或者toString
的,而是直接转换为了布尔值。+
、-
、*
、/
、%
的类型转换-
、*
、/
、%
这四种都会把符号两边转成数字来进行运算+
由于不仅是数字运算符,还是字符串的连接符,所以分为两种情况:对象的
+
号类型转换:+
号字符串连接的时候,toPrimitive
的参数hint
是default
,但是default
的执行顺序和number一样都是先判断有没有valueOf
,有的话执行valueOf
,然后判断valueof
后的返回值,若是是引用类型则继续执行toString
。+
号字符串连接的时候,优先调用toString()
方法。参考资料
The text was updated successfully, but these errors were encountered: