Open jejuin opened 4 years ago
在上一篇 《ECMAScript 之数据类型转换(上)》中提到了数据类型转换分为两种:
本篇文章主要针对这两种类型转换进行介绍。
对象类型可显示调用 toString 和 valueOf 方法进行 ToPrimitive 转换。
toString
valueOf
对象类型的 toString 和 valueOf 方法均继承于 Object.proptotype。
Object.proptotype
Object.proptotype.toString
"[object ," + [[Class]] + "]"
var obj = new Object(); console.log(obj.toString()) // "[[object Object]]"
var strObj= "1"; console.log(strObj.toString()) // "1"
var boolean= false; console.log(booleanObj.toString()) // "false"
var numObj= new Number(1); console.log(numObj.toString()) // "1"
- ` Object.proptotype.valueOf`:返回对象内部属性 [[Value]] 的值。大部分内置对象都覆写了该方法,返回各自的实现。 ```js var obj = new Object(); console.log(obj.valueOf()) // {} var strObj= "1"; console.log(strObj.valueOf()) // 1 var boolean= false; console.log(booleanObj.valueOf()) // false var numObj= new Number(1); console.log(numObj.valueOf()) // 1
可显示调用 Boolean(input) 方法进行 ToBoolean 转换
Boolean(input)
可显示调用 Number(input) 、parseInt(string , radix)、parseFloat(string) 方法进行 ToNumber 转换。parseInt(string , radix) 与parseFloat(string) 只能用于 StringToNumber, Number(input) 可接收任何类型参数进行转换。
Number(input)
parseInt(string , radix)
parseFloat(string)
解析一个字符串并返回指定基数的十进制整数, radix 是2-36之间的整数,表示被解析字符串的基数。—— MDN
算法如下:
parseInt("Hello", 8); // NaN parseInt("546", 2); // NaN
// 以下例子均返回15 parseInt("0xF", 16); parseInt("F", 16); parseInt("17", 8); parseInt(021, 8); parseInt("015", 10); parseInt(15.99, 10); parseInt("15,123", 10); parseInt("FXX123", 16); parseInt("1111", 2); parseInt("15 * 3", 10); parseInt("15e2", 10); parseInt("15px", 10); parseInt("12 2 ", 13);
// 以下例子均返回 -15 parseInt("-F", 16); parseInt("-0F", 16); parseInt("-0XF", 16); parseInt(-15.1, 10); parseInt(" -17", 8); parseInt(" -15", 10); parseInt("-1111", 2); parseInt("-15e1", 10); parseInt("-12", 13);
// 下例中全部返回 4 parseInt(4.7, 10); parseInt(4.7 * 1e22, 10); // 非常大的数值变成 4 parseInt(0.00000000000434, 10); // 非常小的数值变成 4 => 0.00000000000434.toString() = "4.34e-12"
parseInt("0e0",16); // 224
> 示例来源 MDN ### parseFloat(string) >parseFloat() 函数解析一个字符串参数并返回一个浮点数。—— MDN 算法如下: 1. Call ToString(string). 2. 去除 Result(1) 字符串前面的所有空白 3. 如果给定字符串值不能被转换成数值,则会返回 NaN。 4. 如果第一个字符不能转换为数字,则会返回 NaN。 6. 如果 parseFloat 在解析过程中遇到了正号(+)、负号(-)、数字(0-9)、小数点(.)、或者科学记数法中的指数(e 或 E)以外的字符,则它会忽略该字符以及之后的所有字符,返回当前已经解析到的浮点数。 7. 第二个小数点的出现也会使解析停止(在这之前的字符都会被解析)。 ## ToString 可显示调用 `String(input)` 与 `toString()` 方法进行 ToString 转换 ## ToObject 原始数据类型可自动装箱为对应的包装类型对象。 关联阅读: - [ECMAScript 之原始数据类型包装对象](https://github.com/jejuin/Blog/issues/21) # 隐式数据类型转换 ## 一元运算符(+,-) 算法: 1. 对参数执行 ToNumber 操作 ```js console.log(+"123") // 123 console.log(+[]); // 0 console.log(+['1']); // 1 console.log(+['1', '2', '3']); // NaN console.log(+{}); // NaN console.log(-[]); // -0
算法:
console.log("abc" + 2) // abc2 console.log(1 + []) // “1” console.log(null + 1) // 1 console.log(null + []) // "null" console.log({} + []) // "[object Object]"。 console.log(1 + true); // 2 console.log(new Date() + 1); // Fri Nov 20 2020 10:50:35 GMT+0800 (中国标准时间)1 console.log( -0 + -0) // -0 console.log( -0 + 0) // 0 console.log( 0 + 0) // 0
注意:
如果在控制台中直接输入 {} + [] ,你会发现输出结果与 console.log 中的不同。
{} + []
console.log
这是因为 {} 被当成了一个独立的代码块,所以 {} + [] 相当于执行 +[] ,所以输出为 0。
{}
+[]
算法:对两个参数执行 ToNumber 操作,再执行运算操作
console.log(['2'] > 1) // true
当两个参数类型不同时:
console.log([] == 0) // true
if 语句中的条件,如果仅有一个参数时,会执行 ToBoolean 操作。
if
if (1) { console.log("test") } // test
三元运算符中的条件,如果仅有一个参数时,会执行 ToBoolean 操作。同 if
var a = 1 ? 'a' : 'b' // a = 'a'
逻辑运算符中的条件,如果仅有一个参数时,会执行 ToBoolean 操作。同 if
var a = 1 || 0 // a = 1 var a = 1 && 0 // a = 0
前言
在上一篇 《ECMAScript 之数据类型转换(上)》中提到了数据类型转换分为两种:
本篇文章主要针对这两种类型转换进行介绍。
关联阅读
显示数据类型转换
ToPrimitive
对象类型可显示调用
toString
和valueOf
方法进行 ToPrimitive 转换。对象类型的
toString
和valueOf
方法均继承于Object.proptotype
。Object.proptotype.toString
:返回对象内部属性 [[Class]] 的值"[object ," + [[Class]] + "]"
.。大部分内置对象都覆写了该方法,返回各自的实现。var strObj= "1"; console.log(strObj.toString()) // "1"
var boolean= false; console.log(booleanObj.toString()) // "false"
var numObj= new Number(1); console.log(numObj.toString()) // "1"
ToBoolean
可显示调用
Boolean(input)
方法进行 ToBoolean 转换ToNumber
可显示调用
Number(input)
、parseInt(string , radix)
、parseFloat(string)
方法进行 ToNumber 转换。parseInt(string , radix)
与parseFloat(string)
只能用于 StringToNumber,Number(input)
可接收任何类型参数进行转换。parseInt(string, radix)
算法如下:
// 以下例子均返回15 parseInt("0xF", 16); parseInt("F", 16); parseInt("17", 8); parseInt(021, 8); parseInt("015", 10); parseInt(15.99, 10); parseInt("15,123", 10); parseInt("FXX123", 16); parseInt("1111", 2); parseInt("15 * 3", 10); parseInt("15e2", 10); parseInt("15px", 10); parseInt("12 2 ", 13);
// 以下例子均返回 -15 parseInt("-F", 16); parseInt("-0F", 16); parseInt("-0XF", 16); parseInt(-15.1, 10); parseInt(" -17", 8); parseInt(" -15", 10); parseInt("-1111", 2); parseInt("-15e1", 10); parseInt("-12", 13);
// 下例中全部返回 4 parseInt(4.7, 10); parseInt(4.7 * 1e22, 10); // 非常大的数值变成 4 parseInt(0.00000000000434, 10); // 非常小的数值变成 4 => 0.00000000000434.toString() = "4.34e-12"
parseInt("0e0",16); // 224
二元运算符(+)
算法:
注意:
如果在控制台中直接输入
{} + []
,你会发现输出结果与console.log
中的不同。这是因为
{}
被当成了一个独立的代码块,所以{} + []
相当于执行+[]
,所以输出为 0。二元运算符(-、 *、%、/ )
算法:对两个参数执行 ToNumber 操作,再执行运算操作
关系运算符 (> < >= <=)
算法:
相等运算符(==)
当两个参数类型不同时:
if 条件判断语句
if
语句中的条件,如果仅有一个参数时,会执行 ToBoolean 操作。? : 三元运算符
三元运算符中的条件,如果仅有一个参数时,会执行 ToBoolean 操作。同
if
逻辑运算符
逻辑运算符中的条件,如果仅有一个参数时,会执行 ToBoolean 操作。同
if