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
将值从一种类型转换为另一种类型就是所谓的类型转换。
ES6前,JS共有6种数据类型,分别是:
在JS中,可以通过Boolean函数来将其他类型转换为Boolean,目前有6种值会被转换为false,分别是:
其余都会被转换为true
在JS中,可以通过Number函数来将其他类型转换为Number,如果无法转换为Number,则返回NaN(Not a Number)。
根据规范,如果Number函数不传参,就会返回+0。如果传了参数,就会调用内部的ToNumber方法。
ToNumber
ToNumber方法对不同的类型有以下几种表现:
对于String类型,Number方法会尽力将它转换为一个整数或浮点数,并忽略所有前置的0,但如果它其中包含非数字,就会被转换为NaN。
由于Number方法比较严格,所以对于字符串还可以使用parseInt和parseFloat来进行转换。
parseInt只解析整数,parseFloat则可以解析整数和浮点数,都会跳过任意数量的前导空格,尽可能转换更多数值字符,但如果第一个非空格字符是非数字,将返回NaN。
在JS中,可以通过String函数来将其他类型转换为String。
根据规范,如果String函数不传参,就会返回空字符串。如果传了参数,就会调用内部的ToString方法。
ToString
ToString方法对不同的类型有以下几种表现:
所有的引用类型都会被转换为true
对象类型转Number和String都是通过待转换对象本身的两个方法来完成,分别是toString和valueOf。
toString
valueOf
toString方法返回调用它的对象的字符串表示。
源toString方法位于Object.prototype上,这个方法会根据调用它的对象内部的[class]属性,返回由 "[object " 和 class 和 "]" 三个部分组成的字符串。
[class]
举个例子;
console.log(Object.prototype.toString.call({})) // "[object Object]" console.log(({}).toString === Object.prototype.toString) // true
可以看出当调用对象的toString方法时,其实调用的就是Object.prototype上的toString方法。
但JS中的很多类都根据自身的特性,改写了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返回调用它的对象本身。
Array、function、RegExp简单继承了这个默认的方法,会返回它们自己本身。
但Date是个例外,当Date调用valueOf方法时,会返回日期的事件戳形式。
var date = new Date(2017, 4, 21); console.log(date.valueOf()) // 1495296000000
console.log(Number({})) // NaN console.log(Number({a : 1})) // NaN console.log(Number([])) // 0 console.log(Number([0])) // 0 console.log(Number([1, 2, 3])) // NaN console.log(Number(function(){var a = 1;})) // NaN console.log(Number(/\d+/g)) // NaN console.log(Number(new Date(2010, 0, 1))) // 1262275200000 console.log(Number(new Error('a'))) // NaN
console.log(String({})) // "[object Object]" console.log(String([])) // "" console.log(String([0])) // "0" console.log(String([1, 2, 3])) // "1,2,3" console.log(String(function(){var a = 1;})) // "function(){var a = 1;}" console.log(String(/\d+/g)) // "/\d+/g" console.log(String(new Date(2010, 0, 1))) // "Fri Jan 01 2010 00:00:00 GMT+0800 (中国标准时间)" console.log(String(new Error('a'))) // "Error: a"
当 + 运算符作为一元操作符的时候,其实就相当于调用了Number方法来进行转换。
Number
console.log(+'1'); // 1 console.log(+[]); // 0 console.log(+['1']); // 1 console.log(+['1', '2', '3']); // NaN console.log(+{}); // NaN console.log(+ new Date()) //1621838673336
当执行 + 运算的时候, 根据规范,遵循以下几个规则:
除了Date对象会遵循对象转String过程,其余都遵循对象转Number过程。
console.log(null + 1); //1 console.log([] + []); // ""空字符串 console.log({} + []); // "[object Object]"
"==" 用于比较两个值是否相等,当要比较的两个值类型不一样的时候,就会发生类型的转换。
"==" 遵循以下规则:
注意:NaN与NaN会返回false,+0与-0返回true,对象的引用地址相同则返回true。
console.log('1' == 1); //true console.log(true == '2') //false console.log(42 == ['42']) //true console.log(false == undefined) //false console.log(false == []) //true console.log([] == ![]) //true
以上的例子都符合第二条规则,类型不同,就会都先转换为number类型,再进行比较。
JavaScript深入之头疼的类型转换(上) JavaScript深入之头疼的类型转换(下)
The text was updated successfully, but these errors were encountered:
No branches or pull requests
将值从一种类型转换为另一种类型就是所谓的类型转换。
ES6前,JS共有6种数据类型,分别是:
基本数据类型之间的转换
基本数据类型转Boolean
在JS中,可以通过Boolean函数来将其他类型转换为Boolean,目前有6种值会被转换为false,分别是:
其余都会被转换为true
基本类型转Number
在JS中,可以通过Number函数来将其他类型转换为Number,如果无法转换为Number,则返回NaN(Not a Number)。
根据规范,如果Number函数不传参,就会返回+0。如果传了参数,就会调用内部的
ToNumber
方法。ToNumber
方法对不同的类型有以下几种表现:对于String类型,Number方法会尽力将它转换为一个整数或浮点数,并忽略所有前置的0,但如果它其中包含非数字,就会被转换为NaN。
由于Number方法比较严格,所以对于字符串还可以使用parseInt和parseFloat来进行转换。
parseInt只解析整数,parseFloat则可以解析整数和浮点数,都会跳过任意数量的前导空格,尽可能转换更多数值字符,但如果第一个非空格字符是非数字,将返回NaN。
基本类型转String
在JS中,可以通过String函数来将其他类型转换为String。
根据规范,如果String函数不传参,就会返回空字符串。如果传了参数,就会调用内部的
ToString
方法。ToString
方法对不同的类型有以下几种表现:对象类型转基本类型
对象类型转Boolean
所有的引用类型都会被转换为true
对象类型转Number和string(重点)
对象类型转Number和String都是通过待转换对象本身的两个方法来完成,分别是
toString
和valueOf
。toString
toString方法返回调用它的对象的字符串表示。
源toString方法位于Object.prototype上,这个方法会根据调用它的对象内部的
[class]
属性,返回由 "[object " 和 class 和 "]" 三个部分组成的字符串。举个例子;
可以看出当调用对象的toString方法时,其实调用的就是Object.prototype上的toString方法。
但JS中的很多类都根据自身的特性,改写了toString方法,主要有以下表现:
举个例子:
valueOf
valueOf返回调用它的对象本身。
Array、function、RegExp简单继承了这个默认的方法,会返回它们自己本身。
但Date是个例外,当Date调用valueOf方法时,会返回日期的事件戳形式。
举个例子:
对象类型转Number具体过程(重点)
举个例子:
对象类型转String具体过程(重点)
举个例子:
隐式类型转换
一元操作符 +
当 + 运算符作为一元操作符的时候,其实就相当于调用了
Number
方法来进行转换。举个例子:
二元操作符 +
当执行 + 运算的时候, 根据规范,遵循以下几个规则:
举个例子:
==相等
"==" 用于比较两个值是否相等,当要比较的两个值类型不一样的时候,就会发生类型的转换。
"==" 遵循以下规则:
举个例子:
以上的例子都符合第二条规则,类型不同,就会都先转换为number类型,再进行比较。
参考
JavaScript深入之头疼的类型转换(上)
JavaScript深入之头疼的类型转换(下)
The text was updated successfully, but these errors were encountered: