javascript进阶知识2

172 阅读3分钟

1.数值转换

1-1 其他值转换到数值

有三个函数可以将非数值值转换为数值:Number()、parseInt()和parseFloat()。Number()是转型函数,可用于任何数据类型。后两个函数主要用于将字符串转换为数值。此外Symbol类型不能转换为Number类型。

(1)Number()

  • 布尔值,true转换为1,false转换为0
  • 数值,直接返回
  • null,返回0
  • undefined返回NaN
  • 字符串:
    • 包含数值,包括数值字符前面带加、减号的情况,则返回为一个十进制数值。Number('011')返回11
    • 浮点值格式则转换为相应的浮点值。Number('1.1')返回1.1
    • 空字符串返回0
    • 包含有效的十六进制格式如"0xf",则会转换为与该十六进制值对应的十进制整数值。
    • 其他情况,返回NaN
  • 对象,调用valueOf()方法,并按照上述规则转换返回的值。如果转换的是NaN,则调用toString()方法,再按照转换字符串的规则转换。

(2)parseInt()

只能得到整数,可以解析为不同进制。 如果第一个字符不是数值字符、加号、减号,parseInt()立即返回NaN。这意味着空字符串也会返回NaN(Number()它返回0)。此外,parseInt()可以传递第二个参数,用于指定底数(进制数)。比如如果知道要解析的值是十六进制,那么可以省略前面的"0x"

let n1 = parseInt(22.5) //22
let n2 = parseInt("1234blue")  //1234
let n3 = parseInt("")  //NaN

let num0 = parseInt("0xA") //10,解释为十六进制
let num  = parseInt("0xAF",16) //175
let num1 = parseInt("AF",16) //175
let num2 = parseInt("AF") //NaN

通过第二个参数,可以极大扩展转换后的结果类型。

(3)parseFloat()

和parseInt()类似,但是可以得到小数(浮点数),此外只能解析为十进制

let n1 = parseFloat("1234blue") //1234
let n2 = parseFloat("0xA")  //0
let n3 = parseFloat(22.5) //22.5
let n4 = parseFloat("22.34.5") //22.34
let n5 = parseFloat("0908.5") //908.5

1-2 其他值转换为字符串

  • Null 和 Undefined 类型 ,null 转换为 "null",undefined 转换为 "undefined",
  • Boolean 类型,true 转换为 "true",false 转换为 "false"。
  • Number 类型的值直接转换,不过那些极小和极大的数字会使用指数形式。
  • Symbol 类型的值直接转换,但是只允许显式强制类型转换,使用隐式强制类型转换会产生错误。
  • 对普通对象来说,除非自行定义 toString() 方法,否则会调用toString()(Object.prototype.toString())来返回内部属性 [[Class]] 的值,如"[object Object]"。如果对象有自己的 toString() 方法,字符串化时就会调用该方法并使用其返回值。

1-3 其他值转换为布尔值

以下这些是假值(false):

  • undefined
  • null
  • false
  • +0、-0 和 NaN
  • ""

逻辑上除了以上的就是转换为真值(true)

2.JavaScript的包装类型

在上一章中我们说过,原始值(基本值)是没有属性和方法的,他们是按值存储的。但是他们为什么会有方法呢?比如let str = 'abc123'; str.length //6。这是因为基本类型在调用它的属性和方法时,JS会在后台隐式地将基本类型的值转换为对象。

let name = ly;
name.toUpperCase() //LY

在访问name.toUpperCase()时,JS将'ly'在后台转换成String('ly'),然后再访问其toUpperCase()方法。最后再调用valueOf()方法将其包装类型转换为基本类型。

JavaScript也可以使用Object函数显式地将基本类型转换为包装类型