将其他的数据类型转换为String 字符串
?.toString
String(?)
-
'' + ?
问号此处代表的是其他数据类型
上面三种方法均不适用于对象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 数值
Number(?)
parseInt(?,?)
parseFloat(?)
'?' - 0
+ '?'
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 的影响
那么我们就说这是一个深复制
对于简单类型的数据来说,赋值就是深拷贝。
对于复杂类型的数据(对象)来说,才要区分浅拷贝和深拷贝
- 赋值操作对另一个对象产生影响叫做浅拷贝