JavaScript 数据类型转换

JavaScript 数据范例转换

原文链接

JavaScript 是一种弱范例言语,即不需要明白声明变量的范例,能够随时给予恣意范例的值。

强迫转换(显式转换)

强迫转换主要指运用Number()String()Boolean() 三个组织函数,手动将各种范例的值,转换成数字、字符串或许布尔值。

转换成 Boolean 值

Boolean( [value] ) 依据 value 的值返回一个布尔值

返回 false 的 value 值(共6种): false、””(空字符串)、0、NaN、null、undefined

Boolean(undefined)     // false
Boolean("")            // false
Boolean(null)          // false
Boolean("12345hello")  // true
Boolean({})            // true

转换成数字

Number(arg) 把给定的值(恣意范例)转换成数字(能够是整数或浮点数),它转换的是全部值,而不是部分值,和 parseInt()parseFloat()不一样。假如该值不能完整转换为整型或浮点型,则返回NaN。

Number("123.1.2.3")       // NaN
parseInt("123.1.2.3",10)  // 123
parseFloat("123.1.2.3")   // 123.1
Number("123.1")           // 123.1
Number(true)              // 1
Number(null)              // 0
Number(undefined)         // NaN

原始范例有 5 种:UndefinedNullNumberBooleanString

当 Number() 的参数是一个对象时,内部处置惩罚步骤以下:

  1. 挪用对象本身的valueOf要领。假如返回原始范例的值,则直接对该值运用Number函数,不再举行后续步骤。

  2. 假如valueOf要领返回的照样对象,则改成挪用对象本身的toString要领。假如返回原始范例的值,则对该值运用Number函数,不再举行后续步骤。

  3. 假如toString要领返回的是对象,就报错。

var obj = {name:"percy",age:21};
Number(obj);

// 等同于

var obj = {name: "percy", age:21 };
if (typeof obj.valueOf() === 'object') {
  Number(obj.toString());
} else {
  Number(obj.valueOf());
}

parseInt 和 parseFloat 都是全局函数,不属于任何对象

parseInt(string, radix);

  • 将给定的字符串以指定基数(radix/base)剖析成为整数,字符串开首的空白符将会被疏忽,它是逐一对字符举行剖析的。

parseInt("  123 Hello",10)   // 123

parseFloat(string)

  • 将参数中指定的字符串剖析成为一个浮点数字并返回,它也是逐一对字符举行剖析的

parseFloat(" 1.2.3.sds")     // 1.2

下面来跳一个坑:

parseInt(0.000001)          // 0
parseInt(0.0000001)         // 1
parseFloat(0.000001)        // 0.000001
parseFloat(0.0000001)       // 1e-7

JavaScript 中精度小于0.000001的数字会自动转化为科学计数的字符串

转换成字符串

  • String() 能够把 nullundefined 转换为字符串,而用 toString() 转换的话,会报错

  • null 和 undefined 没有 toString() 要领,会报错

一切的对象都有toString()要领,作用就是返回一个反应这个对象的字符串。下面列出了一些:

  • Object.prototype.toString()

  • Number.prototype.toString()

  • RegExp.prototype.toString()

  • Function.prototype.toString()

  • ······

String(null)          // "null"
String(12+11+true)    // 24
(12).toString()       // "12"
(10).toString(16)     // "a"

当 String() 的参数是一个对象时,内部处置惩罚步骤以下:

  1. 先挪用对象本身的toString要领。假如返回原始范例的值,则对该值运用String函数,不再举行以下步骤。

  2. 假如toString要领返回的是对象,再挪用valueOf要领。假如返回原始范例的值,则对该值运用String函数,不再举行以下步骤。

  3. 假如valueOf要领返回的是对象,就报错。

String({name: "percy",age: 21})               // "[object Object]"

// 等同于

String(({name: "percy",age: 21}).toString())  // "[object Object]"

隐式转换

  • 将任何数据转换为数字的最简朴方法就是 对它举行“一元加”运算

+ "12"    // 12
+ "a12"   // NaN
+ true    // 1
  • 字符串和数字相加结果是字符串

2 + "3"     // "23"
"2" + 3     // "23"
2 + "3ab"   // "23ab"
  • 字符串和数字相减结果是字符串

2 - "3"    // -1
"2" - 3    // -1
2 - "3ab"  //NaN
  • 数字与布尔值相加减会自动转换

3 - true    // 2
3 + true    // 4

参考资料

    原文作者:percy507
    原文地址: https://segmentfault.com/a/1190000006750889
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞