https://wangdoc.com/javascript/features/conversion.html
(一). 类型转换
[1].转字符串
String()
参数类型 | 结果 |
---|---|
Undefined | “undefined” |
Null | “null” |
Boolean | true,返回“true”;false 返回“false” |
Number | 普通数字被转换为数字字符串;NaN被转为“NaN”;10n被转为“10” |
Symbol | “Symbol()” |
Object | 如果是对象,返回一个类型字符串;如果是数组,返回该数组的字符串形式。 |
[2]. 转布尔值
Boolean()
参数类型 | 结果 |
---|---|
false、undefined、null、+0、-0、NaN、“” | false |
除了上面的情况 | true |
如果对一个值连续做两次取反运算,等于将其转为对应的布尔值,与Boolean函数的作用相同。这是一种常用的类型转换的写法。
!!x
// 等同于
Boolean(x)
[3]. 转数字
Number()
-
纯数字的字符串(包括小数和负数、各进制的数),会被转为相应的数字
-
null
转为0
-
Symbol
会报错 -
其它的基本类型,包括非纯数字的字符串、
NaN
,undefined
都会被转为NaN
参数类型 结果 Undefined NaN Null +0 Boolean true,返回1;false,返回+0 String 纯数字的字符串转为相应的数字;空字符串转为0;否则为NaN;0x开头的字符串被当成16进制 Symbol 使用Number()转会报错 Object Number方法的参数是对象时,将返回NaN,除非是包含单个数值的 数组
。
一元数值运算符(+
)同样使用加号,数值运算符的作用在于可以将任何值转为数值(与Number函数的作用相同)。
+true // 1
+[] // 0
+{} // NaN
[4]. ==
- 比较双方都为基本数据类型
-
若是一方为null、undefined,则另一方必须为null或者undefined才为true,也就是null == undefined为true或者null == null为true,因为undefined派生于null。
-
其中一方为String,是的话则把String转为Number再来比较。
-
其中一方为Boolean,是的话则将Boolean转为Number再来比较。
-
一方为String,一方为Boolean时,遵循有布尔先将布尔转换为数字
-
比较的一方有引用类型
- 将引用类型遵循类似toPrimitive(obj, ‘number’)进行转换。(等同于:如果其中一方为Object,且另一方为String、Number或者Symbol,会将Object转换成字符串,再进行比较。
- 函数其实也是一个对象,所以在进行==比较时也和普通对象一样处理即可。
-
两方都为引用类型,则判断它们是不是指向同一个对象。
-
当我们使用
!
的时候,实际上会将!
后面的值转换为布尔类型来进行比较。而且这种转换是不会经过ToPrimitive()
的,而是直接转换为了布尔值, -
NaN !== NaN,只有用
Object.is(NaN, NaN)
才会被判断为true
[5]. +、-、*、/、%的类型转换
-
-、*、/、%
这四种都会把符号两边转成数字来进行运算 -
+
由于不仅是数字运算符,还是字符串的连接符,所以分为两种情况:-
两端都是数字则进行数字计算
-
有一端是字符串,就会把另一端也转换为字符串进行连接
-
对象的
+
号类型转换:- 对象在进行
+
号字符串连接的时候,toPrimitive
的参数hint
是default
,但是default
的执行顺序和number
一样都是先判断有没有valueOf
,有的话执行valueOf
,然后判断valueof
后的返回值,若是是引用类型则继续执行toString
。(类似题4.5
和4.6
) - 日期在进行
+
号字符串连接的时候,优先调用toString()
方法。(类似题4.7
) - 一元正号是转换其他对象到数值的最快方法,也是最推荐的做法,因为 它不会对数值执行任何多余操作。
- 对象在进行
https://juejin.im/post/6844904105874472974
https://juejin.im/post/6844904114099322893
-
[6]. toString()
-
作用: 把对象转换为字符串
-
谁可以调用toString()
除了
null、undefined
以外的其它数据类型(基本数据类型+引用数据类型),它们构造函数的原型对象上都有toString()
方法1.toString()
相当于
(1.)toString()会报错。因为将点归属给了1,
1…toString()就不会报错返回
“1”,数字要调用toString()需要借用变量或者将数字用括号括起来。 -
基本数据类型调用toString(),就是把原始值转换为字符串
console.log(Symbol(1).toString()) // 'Symbol(1)' console.log(10n.toString()) // '10'
-
引用类型调用toString()
-
数组的
toString
方法是将每一项转换为字符串然后再用","
连接 -
普通的对象(比如
{name: 'obj'}
这种)转为字符串都会变为"[object Object]"
-
函数
、class
、正则
会被转为源代码字符串 -
日期
会被转为本地时区的日期字符串 -
原始值的包装对象调用
toString
会返回原始值的字符串
console.log(['', ''].toString()) // "," console.log([' ', ' '].toString()) // " , " console.log(new Object(true).toString()) // "true" 原始值包装对象 console.log(new Object(1).toString()) // "1" 原始值包装对象
-
https://juejin.im/post/6844904105874472974#heading-18
[7]. valueOf()
-
作用:把对象转换成一个基本数据的值。
-
基本数据类型调用valueOf(),返回调用者原本的值。
console.log(Symbol(1).valueOf()) // Symbol(1) console.log(10n.valueOf()) // 10n
-
引用类型调用valueOf()
-
非日期对象的其他引用类型调用valueOf()默认返回它本身。
-
日期对象返回一个1970年1月1日以来的毫秒数。
console.log(['1'].valueOf()) // ['1'] console.log(function () {}.valueOf()) // ƒ () {} console.log(new Date().valueOf()) // 1585370128307
-
[8]. toPrimitive 运算符
ToPrimitive(input, PreferredType?)
参数一:input,表示要处理的输入值
参数二:期望转换的类型
-
例子
String({}) //等同于 toPrimitive({}, 'string')
(二) 判断数据类型
-
typeof
-
constructor
-
Object.prototype.toString.call()
-
Object.prototype.toString
返回某个数据的内部属性[[class]],能够帮助我们准确的判断出某个数据类型 -
它能够帮助我们准确的判断某个数据类型,也就是辨别出是数组还是数字还是函数,还是
NaN
。
function getclass(obj){ let typeString = Object.prototype.toString.call(obj); // "[object Array]" return typeString.slice(8, -1); } console.log(getClass(new Date)) // Date console.log(getClass(new Map)) // Map console.log(getClass(new Set)) // Set console.log(getClass(new String)) // String console.log(getClass(new Number)) // Number console.log(getClass(true)) // Boolean console.log(getClass(NaN)) // Number console.log(getClass(null)) // Null console.log(getClass(undefined)) // Undefined console.log(getClass(Symbol(42))) // Symbol console.log(getClass({})) // Object console.log(getClass([])) // Array console.log(getClass(function () {})) // Function console.log(getClass(document)); //HTMLDocument console.log(getClass(document.getElementsByTagName('p'))) // HTMLCollection console.log(getClass(new RegExp())); //RegExp console.log(getClass(new Error())); //Error console.log(getClass(window)); //Window console.log(getClass(arguments)) // Arguments
-