JS 中如何进行数据类型的转换?
类型转换可以分为两种,隐性转换和显性转换
显性转换
主要分为三大类:数值类型、字符串类型、布尔类型
三大类的原始类型值的转换规则我就不一一列举了
数值类型(引用类型转换)
Number({a: 1}) // NaN
Number([1, 2, 3]) // NaN
Number([5]) // 5第一步,调用对象自身的`valueOf`方法。如果返回原始类型的值,则直接对该值使用`Number`函数,不再进行后续步骤。第二步,如果`valueOf`方法返回的还是对象,则改为调用对象自身的`toString`方法。如果`toString`方法返回原始类型的值,
则对该值使用`Number`函数,不再进行后续步骤。第三步,如果`toString`方法返回的是对象,就报错。补充一点:`valueOf`和`toString`方法,都是可以自定义的
复制代码
字符串类型(引用类型转换)
String({a: 1}) // "[object Object]"
String([1, 2, 3]) // "1,2,3"`String`方法背后的转换规则,与`Number`方法基本相同,只是互换了`valueOf`方法和`toString`方法的执行顺序。
复制代码
隐性转换
类型 | 转换前 | 转换后 |
---|---|---|
number | 4 | 4 |
string | "1" | 1 |
string | "" | 0 |
boolean | true | 1 |
boolean | false | 0 |
undefined | undefined | NaN |
null | null | 0 |
闭包
闭包是指有权访问另一个函数作用域中的变量的函数 ———— 《JavaScript高级程序设计》
-
闭包用途:
- 能够访问函数定义时所在的词法作用域(阻止其被回收)
- 私有变量化
- 模拟块级作用域
- 创建模块
-
闭包缺点:闭包调用函数的变量,并且这个变量在函数执行完之后,不能释放,会导致函数的变量一直保存在内存中,过多的闭包可能会导致内存泄漏。
-
解决:变量设置成null
原型和原型链
原型
- 每个对象都有一个 proto 属性,该属性指向自己的原型对象
- 每个构造函数都有一个 prototype 属性,该属性指向实例对象的原型对象
- 原型对象里的 constructor 指向构造函数本身
原型链
当试图访问一个对象的属性时,它不仅仅在该对象上搜寻,还会搜寻该对象的原型,以及该对象的原型的原型,依次层层向上搜索,直到找到一个名字匹配的属性或到达原型链的末尾null