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
整理一波类型转换
Number('123') // 123 Number('-123') // -123 Number('1.2') // 1.2 Number('000123') // 123 Number('-000123') // -123 Number('a123') // NaN 有一个不为数字就为NaN Number('0x12') // 16进制转换为10进制整数 Number('') // 0 Number(' ') // 0 Number('123 123') // NaN
Number 转换函数传入一个字符串,它会试图将其转换成一个整数或浮点数,而且会忽略所有前导的 0,如果有一个字符不是数字,结果都会返回 NaN
String(0) // "0" String(-0) // "0"
我们发现对于String、Number、Boolean类型的变量,我们可以使用.运算符对它们进行操作,例如
.
var a = 1 a.name = '123'
这时候操作的是它们的包装对象,没有任何影响,但是null和undefined在期望把它们当成对象操作时,则会报错TypeError
所有对象转换布尔值结果都为true
调用valueOf和toString方法进行转换
对象调用toString的几种不同情况:
console.log(({}).toString()) // [object Object] console.log([].toString()) // "" console.log([0].toString()) // 0 console.log([1, 2, 3].toString()) // 1,2,3 console.log((function(){var a = 1;}).toString()) // function (){var a = 1;} console.log((/\d+/g).toString()) // /\d+/g console.log((new Date(2010, 0, 1)).toString()) // Fri Jan 01 2010 00:00:00 GMT+0800 (CST)
valueOf方法通常返回对象本身,但是日期对象是个例外,他返回从1970年到现在经历的毫秒数
从对象到字符串的转换过程
ToPrimitive
从对象到数字的转换过程
ToPrimitive(input[, PreferredType])
第一个参数是 input,表示要处理的输入值。 第二个参数是 PreferredType,非必填,表示希望转换成的类型,有两个值可以选,Number 或者 String。 当不传入 PreferredType 时,如果 input 是日期类型,相当于传入 String,否则,都相当于传入 Number。 如果传入的 input 是 Undefined、Null、Boolean、Number、String 类型,直接返回该值。 如果是 ToPrimitive(obj, Number),处理步骤如下: 如果 obj 为 基本类型,直接返回 否则,调用 valueOf 方法,如果返回一个原始值,则 JavaScript 将其返回。 否则,调用 toString 方法,如果返回一个原始值,则 JavaScript 将其返回。 否则,JavaScript 抛出一个类型错误异常。 如果是 ToPrimitive(obj, String),处理步骤如下: 如果 obj为 基本类型,直接返回 否则,调用 toString 方法,如果返回一个原始值,则 JavaScript 将其返回。 否则,调用 valueOf 方法,如果返回一个原始值,则 JavaScript 将其返回。 否则,JavaScript 抛出一个类型错误异常。----摘自冴羽大佬的JavaScript深入系列
第一个参数是 input,表示要处理的输入值。
第二个参数是 PreferredType,非必填,表示希望转换成的类型,有两个值可以选,Number 或者 String。
当不传入 PreferredType 时,如果 input 是日期类型,相当于传入 String,否则,都相当于传入 Number。
如果传入的 input 是 Undefined、Null、Boolean、Number、String 类型,直接返回该值。
如果是 ToPrimitive(obj, Number),处理步骤如下:
如果是 ToPrimitive(obj, String),处理步骤如下:
总结一下: 对象转字符串:
对象转数字:
const obj = { name: '123', valueOf() { return {} }, toString() { return {} } } console.log(String(obj)) // 报错 // 上面注释掉 const obj1 = { name: '123', valueOf() { return '456' }, } console.log(Number(obj1)) // 456 // 上面注释掉 const obj2 = { name: 12, toString() { return 'nb' } } console.log(String(obj2)) // nb
Number({}) // NaN
上述过程为首先调用valueOf返回{}本身,然后调用toStirng返回[object object],然后转换为数字,得到结果为NaN
{}
[object object]
NaN
+
一元运算符+会把变量类型隐式转换为Number类型
console.log(+[]); // 0 console.log(+['1']); // 1 console.log(+['1', '2', '3']); // NaN console.log(+{}); // NaN
当计算 value1 + value2时: lprim = ToPrimitive(value1) rprim = ToPrimitive(value2) 如果 lprim 是字符串或者 rprim 是字符串,那么返回 ToString(lprim) 和 ToString(rprim)的拼接结果 返回 ToNumber(lprim) 和 ToNumber(rprim)的运算结果----摘自冴羽大佬的JavaScript深入系列
当计算 value1 + value2时:
==
在==比较两个值时,也会发生类型转换 ES5规范中: 当执行x == y 时:
看了一下其实只需记住以下几种情况: 当二者类型相同时: 基础类型:当二者值完全相同时才相同,但是有几个例外
+0 == -0 // true NaN == NaN // false
引用类型:引用的地址相同时为true
当二者(x和y)类型不同时:x == y , y == x
x == y , y == x
null
undefined
[] == ![] // true
上面过程,首先进行![]转换,结果为false,符合规范中的第七条,所以将false转换为0,比较[] == 0,此时符合规范中的第9条,将[]转换为基础类型'',此时满足规范中的第5条,'' == 0,将''转换为数字为0,所以最终结果为true
![]
false
0
[] == 0
[]
''
'' == 0
The text was updated successfully, but these errors were encountered:
No branches or pull requests
整理一波类型转换
普通类型转换
普通类型转布尔类型
普通类型转数字
Number 转换函数传入一个字符串,它会试图将其转换成一个整数或浮点数,而且会忽略所有前导的 0,如果有一个字符不是数字,结果都会返回 NaN
普通类型转字符串
普通类型转对象
我们发现对于String、Number、Boolean类型的变量,我们可以使用
.
运算符对它们进行操作,例如这时候操作的是它们的包装对象,没有任何影响,但是null和undefined在期望把它们当成对象操作时,则会报错TypeError
对象转换为普通类型
对象转布尔值
所有对象转换布尔值结果都为true
对象转换为数字或字符串
调用valueOf和toString方法进行转换
对象调用toString的几种不同情况:
valueOf方法通常返回对象本身,但是日期对象是个例外,他返回从1970年到现在经历的毫秒数
从对象到字符串的转换过程
即先调用
ToPrimitive
将对象转换为基础类型,再将其转换为字符类型从对象到数字的转换过程
ToPrimitive
将对象转换为基础类型,再将其转换为数字类型ToPrimitive方法
总结一下:
对象转字符串:
对象转数字:
上述过程为首先调用valueOf返回
{}
本身,然后调用toStirng返回[object object]
,然后转换为数字,得到结果为NaN
运算符中的类型转换
一元运算符
+
一元运算符
+
会把变量类型隐式转换为Number类型二元操作符
+
==
值比较在
==
比较两个值时,也会发生类型转换ES5规范中:
当执行x == y 时:
看了一下其实只需记住以下几种情况:
当二者类型相同时:
基础类型:当二者值完全相同时才相同,但是有几个例外
引用类型:引用的地址相同时为true
当二者(x和y)类型不同时:
x == y , y == x
null
和undefined
比较,值为true,否则进行步骤2~5上面过程,首先进行
![]
转换,结果为false
,符合规范中的第七条,所以将false
转换为0
,比较[] == 0
,此时符合规范中的第9条,将[]
转换为基础类型''
,此时满足规范中的第5条,'' == 0
,将''
转换为数字为0,所以最终结果为trueThe text was updated successfully, but these errors were encountered: