本节课的思维导图如下:
JavaScript历史与版本
基本数据类型与类型转换
基本数据类型
- 字符串string
- 数字number
- 布尔类型boolean
- undefined
- null
判断数据类型的方法:typeof和instanceof
数据类型转换
- 字符串与别的类型相加会转换为字符串
- +可以将字符串转化为数字
- 不建议使用==,会进行隐性类型转换,建议使用===
- falsy值:flase、0、“ ”、undefined、null、NaN
JavaScript变量
变量声明
-
var
-
let:块级作用域
同一作用域不能有两个相同名字的变量,内层作用域可以有与外层作用 域同名的变量。
-
const:变量地址不可改变
函数
函数声明
function关键字、参数、返回值
默认参数语法:
//当a和b不传入参数,默认值为0,有传入时则为传入值
function addWithDefault(a = 0, b = 0) {
return a + b;
}
函数声明提升
函数的声明会全部提升到作用域开头进行
函数表达式
//函数表达式,把函数赋值给一个变量
const getSum = function addWithDefault(a, b) {
return a + b;
}
注意:这种写法不会进行函数声明提升,相当于赋值操作
箭头函数
函数作为值的应用
将函数作为参数:
function binaryOperation(operand1, operand2, func) {
const res = func(operand1, operand2);
return res;
}
将函数作为返回值:
//这是一个生成函数的函数(工厂模式的思想)
//抽取出不同的地方,将不同的地方用参数代替
function buildRepeatChar = char => {
return num => {
let res = "";
while(num--) {
res += char;
}
return res;
}
}
闭包与作用域
函数作用域包含参数和一个块级作用域,参数和外部的变量是独立的,修改参数,外部变量不会变化。
- 每个函数都会永久“记住”当前函数定义时所在的作用域
- 函数与其词法环境的引用捆绑在一起构成闭包(closure)
注意:提供闭包的函数的每次被调用,生成的闭包各自独立(而不是同一个闭包),每次调用都有独自的函数作用域,里面的变量并不相通。而闭包函数(返回的函数)每次调用,都是对同一个闭包的操作。这两点要分清。
const buildRepeatCharWIthLog = char => {
let count = 0;
return num => {
count++;
console.log("第" + count + "次调用");
let res = "";
while(num--) {
res += char;
}
return res;
}
}
//下面两个都是第一次调用,生成两个不同的闭包,各自的count都为1
const repeatBar = buildRepeatCharWIthLog('-'); //第1次调用
const repeatExclamatory = buildRepeatCharWIthLog('!'); //第1次调用
//闭包函数对同一个闭包,所以count值为2
repeatBar(4); //第2次调用