JS 里的数据类型转换

将其他的数据类型转换为String 字符串

  1. ?.toString
  2. String(?)
  3. '' + ? 问号此处代表的是其他数据类型
    上面三种方法均不适用于对象object,所得结果是"[object object]"
1.?.toString方法
  • toString 方法适用于number与Boolean类型
  • 将数值转换为字符串时要注意需要把转换的数值用()括号包起来
  • 对null和undefined使用这种方法时会报错
null.toString() //Uncaught TypeError: Cannot read property 'toString' of null
undefined.toString() //Uncaught TypeError: Cannot read property 'toString' of undefined
  • 对object使用toString方法时所得结果不准确,均为"[object object]"
({}).toString() //"[object Object]"
2. String(?)方法
  • string()方法适用于所有数据类型
  • object类型转换结果依旧为"[object object]"
3. ' '+?方法
  • 原理:‘+’ 运算符只能相加相同的数据类型,如果两边的数据类型不同,他会优先将其转换成字符串来相加
  • ' ' +?方法适用于所有数据类型
  • object类型转换结果依旧为"[object object]"
  • 此种方法最简洁,但需注意转换数值时不要忘记加括号()

将其他的数据类型转换为Number 数值

  1. Number(?)
  2. parseInt(?,?)
  3. parseFloat(?)
  4. '?' - 0
  5. + '?'
1. Number(?)方法
  • Number函数将字符串转为数值,要比parseInt函数严格很多。基本上,只要有一个字符无法转成数值,整个字符串就会被转为NaN
  • Number方法的参数是对象时,将返回NaN,除非是包含单个数值的数组
Number({a: 1}) // NaN
Number([1, 2, 3]) // NaN
Number([5]) // 5
2. parseInt(?,?)方法
  • 如果字符串头部有空格,空格会被自动去除
  • 如果parseInt的参数不是字符串,则会先转为字符串再转换
parseInt(1.23) // 1
// 等同于
parseInt('1.23') // 1
  • 字符串转为整数的时候,是一个个字符依次转换,如果遇到不能转为数字的字符,就不再进行下去,返回已经转好的部分
parseInt('2a') // 2
parseInt('1e2') // 1
  • 如果字符串的第一个字符不能转化为数字(后面跟着数字的正负号除外),返回NaN
  • parseInt()方法默认转换成十进制,不过需要注意的是,如果参数本身就是number类型,且是0x开头(16进制),或0o开头(八进制),0b开头(二进制),0开头且后面的数字没有8和9(视为八进制),那么parseInt方法会将其以相应的进制转换成十进制展示出来
parseInt(0o377)  //255
parseInt(0xff)  //255
parseInt(0b11)  //3
  • 如果字符串以0x或0X开头,parseInt会将其按照十六进制数解析,如果字符串以0开头,将其按照10进制解析

  • 为了防止意外解析成其他进制,建议添加第二个参数按照特定进制解析:如果第二个参数不是数值,会被自动转为一个整数。这个整数只有在2到36之间,才能得到有意义的结果,超出这个范围,则返回NaN。如果第二个参数是0、undefined和null,则直接忽略

parseInt('1000', 2) // 8
parseInt('1000', 6) // 216
parseInt('1000', 8) // 512
parseInt('10', 37) // NaN
parseInt('10', 1) // NaN
parseInt('10', 0) // 10
parseInt('10', null) // 10
parseInt('10', undefined) // 10
3. parseFloat(?)方法
  • parseFloat方法用于将一个字符串转为浮点数
parseFloat('3.14') // 3.14
  • 如果字符串符合科学计数法,则会进行相应的转换
  • 如果字符串包含不能转为浮点数的字符,则不再进行往后转换,返回已经转好的部分
parseFloat('3.14more non-digit characters') // 3.14
4.'?' - 0方法

字符串减去零

'11' - 0 //11
5. + '?'方法
  • 字符串,这里的+并不是取正值的意思,负数一样可行
+ '-011' ; // -11

将其他数据类型转换为Boolean布尔类型

1. Boolean()
Boolean(1)  //true
Boolean({})  //true
2. 双重取反:!! x
!true //false
!!true //true
!!1 //true
五个falsy值,即转换成Boolean后为false得值

0 、 NaN 、 null 、 undefined 、' ' (空字符串)

  • 所有的object 转换结果都为true

内存图

  • JS引擎将内存分为代码区和数据区
  • 数据区分为Stack(栈内存)、Heap(堆内存)
  • 简单类型的数据直接存在 Stack 里、复杂类型的数据是把 Heap 地址存在 Stack 里

垃圾回收

GC 垃圾回收 如果一个对象没有被引用,那么它就是垃圾,将会被浏览器回收

  • 引用包括事件触发引用,如果一个函数被页面上的事件引用了,也不会算作垃圾被回收,将事件赋值null,就表示不再引用
  • IE6 BUG 无法正常的在页面关闭时,将没有人引用的垃圾正常的清除。设置window.onunload事件,将所有的事件都设置为null
  • 内存泄露:表示该被标记为垃圾的数据没有被标记,内存就会被永久的占用。除非把整个浏览器关闭,否则浏览器就会吃很多的内存,无法再分配新的内存用于存储数据

深拷贝与浅拷贝

var b = a
b = 2 //这个时候改变 b

a 完全不受 b 的影响
那么我们就说这是一个深复制
对于简单类型的数据来说,赋值就是深拷贝。
对于复杂类型的数据(对象)来说,才要区分浅拷贝和深拷贝

  • 赋值操作对另一个对象产生影响叫做浅拷贝

你可能感兴趣的:(JS 里的数据类型转换)