文章目录
- 包装对象
- 类型转换
- 显示转换
- 隐式转换
- 作用域
- let与const的用法:
- 作用域链
- 闭包与模块化
- 封装
包装对象
为什么原始类型可以使用方法和属性:
- toString()
- split()
- length属性
包装对象:
- new String()
- new Number()
- new Boolean()
let num = 123;
console.log(typeof num.toString());
let str = "hello world";
console.log(str.split(""));
console.log(str.length); // new String(str)
原始类型调用方法或属性的时候,程序的后台会自动将他们转换成对应的包装对象。
转换后,立即销毁:
转换成包装对象,并成功执行方法后,包装对象会立即销毁,变量又重新回到原始类型的状态
总结:永远不要主动创建包装对象
创建包装对象的构造函数可以用来做类型转换:
- String()
- Number()
- Boolean()
类型转换
在开发项目的时候,我们经常会用到类型转换,例如:
DOM输入的字符串,我们希望实现数学运算,要转换成数值。
类型转换可以分成两类:
- 显示转换(强制转换) Number String Boolean
- 隐式转换(自动转换)
显示转换
- Number()
- String()
- Boolean()
- toString(): null和undefined不能调用toString方法实现类型转换
- parseInt()
- parseFloat()
Number、parseInt的区别,Number传的参数必须是纯数字,不能有字母,parseInt可以有,但是如果字母位于第一位,则返回NaN
隐式转换
- if语句
- while语句
- 逻辑与
- 逻辑或
- 逻辑非
==
: 使用===
代替==
,既可以避免歧义,也可以提升性能
各种数据类型是如何实现类型转换的呢:
- 数值类型只有0和NaN会转换成false
- null和undefined都会转换成false
- 空字符串会转换成false,其他为true
- 所有对象都会转换成true
逻辑与左侧的值转化为布尔值,如果为true,那么逻辑与表达式的返回值就是第二个值,如果左侧为false,那么返回值就是第一个值
逻辑或左侧的值转化为布尔值,如果为false,那么逻辑与表达式的返回值就是第二个值,如果左侧为true,那么返回值就是第一个值
作用域
- 函数外面能否使用函数内部定义的变量
- if语句或for语句外面能够使用语句内定义的变量
每一个变量都有自己的作用域:
- 全局变量
- 局部变量
let与const的用法:
- 抛弃var,永远使用let定义变量
- 通常引入外部模块,或是定义函数表达式,可以使用const定义常量
- let const有块级作用域
作用域链
在作用域中嵌套作用域时,就会形成一个作用域链,更底层的作用域可以访问上层及其更上层的变量,但是上层无法直接访问底层的变量。
闭包与模块化
什么是闭包:
简单一句话概括:函数嵌套,内部函数就叫做闭包。
/*
1. 函数嵌套,内部函数就是闭包
2. 内部函数没有执行完成,外部函数内存空间不会被销毁
*/
function outerFun() {
let n = 10
function innerFun() {
console.log(n)
}
return innerFun
}
let fun = outerFun()
fun() // 10
闭包有什么用:封装
封装
将一个功能放到一个模块中
var a = (function () {
var n = 10
var m = 20
function add() {
console.log(n + m)
}
return add
}()
但是现在实际开发中我们会使用es6的语法来封装
总结:
- 函数嵌套
- 内部函数可以使用外部函数的变量
- 闭包作为返回值,内部函数没有运行完成,外部函数中变量不会被销毁
- 可以用来实现模块化或封装代码