内容: 类型转换 五个falsy值 内存图 垃圾回收 深浅拷贝
强制转换
一. 任意类型转Number
五种方法
- Number(x)
- parseInt(x, 10)
- parseFloat(x)
- x - 0
- +x
转换规则 参数是 基本类型 和 对象时是不同的
基本类型
- 数值 : 不变
- 字符串: 能解析为数字 Number(''324) //324
不能解析位数字 Number('324abc') //NaN
空字符串 Number('') //0 - 布尔值 : true //1 false //1
- undefined : NaN Number(undefined) // NaN
- unll : 0 Number(null) //0
对象 : NaN
Number({a;1}) //NaN
Number([1,2,3]) //NaN
除非是包含单个数值的数组 Number([5]) //5
二. 任意类型转String
三种方式
- String(x)
- x.toString()
- ' ' + x 芳芳推荐**
数值 : 相应字符串 123 //'123'
- 字符串: 不变
- 布尔值:true > "true" false > "false"
- undefined : "undefined"
- null : "null"
- object对象:如果是对象,返回一个类型字符串 ; //"[object object ]"
- 如果是数组,返回数组的字符串形式。
- String({a: 1}) // "[object object]"
- String([1,2,3]) // '1,2,3'
#三. 任意类型转布尔Boolean
两种方法
- Boolean(x)
- !! x 芳芳推荐
五个falsy值,其他都是True
NaN null undefined 0(正负) ' ' (空字符串)
所有的对象全部都是true
自动转换 以强制转换为基础
以下三种情况,JavaScript 会自动转换数据类型,即转换是自动完成的,用户不可见
- 1.不同类型的数据互相运算
- 对非布尔值类型的数据求布尔值
- 3.对非数值类型的值使用一元运算符(即+和-)
建议在预期为布尔值、数值、字符串的地方,全部使用Boolean、Number和String函数进行显式转换。
一. 自动转换为数值
除加法运算符,其他运算符都会把运算转为数值。
'5'-'2' // 3 '5' * [] // 0 '5' * '2' //10
false/ '5' // 0 true -'1' //0 'abc' - 1//NaN
false - 1 //-1 '1' - 1 // 0 undefined + 1 // NaN
unll + 1 //1 + 'abc' // NaN - "abc" //NaN
二 . 自动转换为布尔值 Boolean
条件部分转为布尔
五个falsy
undefined NaN null 0 ' '
方法 : ① !!X (推荐) ②Boolean(x)
三.自动转为字符串
自动转换主要发生在字符串的加法运算中
方法
- 1 ' ' + x(芳芳推荐)
- 2 window .String()
- 3 x.toString()
深复制是什么鬼
var a = 1
var b = a
b = 2 //这个时候改变 b
a 完全不受 b 的影响
那么我们就说这是一个深复制
对于简单类型的数据来说,赋值就是深拷贝。
对于复杂类型的数据(对象)来说,才要区分浅拷贝和深拷贝。
这是一个浅拷贝的例子
var a = {name: 'frank'}
var b = a
b.name = 'b'
a.name === 'b' // true
因为我们对 b 操作后,a 也变了
什么是深拷贝了,就是对 Heap 内存进行完全的拷贝。
var a = {name: 'frank'}
var b = deepClone(a) // deepClone 还不知道怎么实现
b.name = 'b'
a.name === 'a' // true