一、闭包
简单理解就是在函数内部使用外层函数的变量。
从代码形式上看闭包是一个做为返回值的函数。
<script>
function foo() {
let i = 0;
// 函数内部分函数
function bar() {
console.log(++i);
}
// 将函数做为返回值
return bar;
}
// fn 即为闭包函数
let fn = foo();
fn(); // 1
</script>
-
可以扩大变量的作用范围
-
闭包本质仍是函数,只不是从函数内部返回的 闭包能够创建
-
外部可访问的隔离作用域,避免全局变量污染 过度使用闭包可能造成内存泄漏
注:回调函数也能访问函数内部的局部变量。
二、函数的参数
动态参数
arguments 是函数内部内置的伪数组变量,它包含了调用函数时传入的所有实参。
<script>
// 求生函数,计算所有参数的和
function sum() {
// console.log(arguments)
let s = 0
for(let i = 0; i < arguments.length; i++) {
s += arguments[i]
}
console.log(s)
}
// 调用求和函数
sum(5, 10)// 两个参数
sum(1, 2, 4) // 两个参数
</script>
arguments是一个伪数组,用于动态的获取传入的实参。
剩余参数
使用...展开运算符,在函数形参时使用,用于获取多余的实参
<script>
function config(baseURL, ...other) {
console.log(baseURL) // 得到 'http://baidu.com'
console.log(other) // other 得到 ['get', 'json']
}
// 调用函数
config('http://baidu.com', 'get', 'json');
</script>
...是一个真数组,箭头函数中没有 arguments,只能使用 ... 动态获取实参。
三、this
- this : 谁调用我,我就指向谁
- 普通函数
函数名(): window - 对象方法
对象名.方法名(): 对象 - 构造函数
new 函数名(): new创建的实例对象
四、call apply bind区别
- 共同点:都可以修改this,第一个参数都是
修改的this - 不同点:
1、、传参方式不同:call是逐一穿参,apply是数组/伪数组传参 call(修改的this,参数1,参数2…)、apply(修改的this,数组/伪数组)
2、执行机制不同:call和apply会立即执行函数,bind不会立即执行。
五、一些方法
Object
| 静态方法 | |
|---|---|
| Object.assign | 静态方法创建新的对象 |
| Object.keys | 静态方法获取对象中所有属性 |
| Object.values | 表态方法获取对象中所有属性值 |
Array
| 实例方法 | |
|---|---|
| forEach | 用于遍历数组,替代 for 循环 (重点) |
| filter | 过滤数组单元值,生成新数组(重点) |
| map | 迭代原数组,生成新数组(重点) |
| join | 数组元素拼接为字符串,返回字符串(重点) |
| find | 查找元素, 返回符合测试条件的第一个数组元素值,如果没有符合条件的则返回 undefined(重点) |
| every | 检测数组所有元素是否都符合指定条件,如果所有元素都通过检测返回 true,否则返回 false(重点) |
| some | 检测数组中的元素是否满足指定条件 如果数组中有元素满足条件返回 true,否则返回 false |
| concat | 合并两个数组,返回生成新数组 |
| sort | 对原数组单元值排序 |
| splice | 删除或替换原数组单元 |
| reverse | 反转数组 |
| findIndex | 查找元素的索引值 |
包装类型
String
| 实例方法 | |
|---|---|
| split(‘分隔符’) | 用来将字符串拆分成数组(重点) |
| substring(需要截取的第一个字符的索引[,结束的索引号]) | 用于字符串截取(重点) |
| startsWith(检测字符串[, 检测位置索引号]) | 检测是否以某字符开头(重点) |
| includes(搜索的字符串[, 检测位置索引号]) | 判断一个字符串是否包含在另一个字符串中,根据情况返回 true 或 false(重点) |
| toUpperCase | 用于将字母转换成大写 |
| toLowerCase | 用于将字母就转换成小写 |
| indexOf | 检测是否包含某字符 |
| endsWith | 检测是否以某字符结尾 |
| replace | 用于替换字符串,支持正则匹配 |
| match | 用于查找字符串,支持正则匹配 |
注:String 也可以当做普通函数使用,这时它的作用是强制转换成字符串数据类型。
Number
| 实例方法 | |
|---|---|
| toFixed | 用于设置保留小数位的长度 |
六、深拷贝 浅拷贝
-
首先浅拷贝和深拷贝只针对Object、Array这样的复杂对象。
-
浅拷贝只复制一层对象的属性,深拷贝则是复制了所有的层级。
-
对于字符串类型,浅复制是对值的复制,对于对象来说,浅复制是对对象地址的复制,并没 有开辟新的栈,也就是复制的结果是两个对象指向同一个地址,修改其中一个对象的属性,则另一个对象的属性也会 改变,而深复制则是开辟新的栈,两个对象对应两个不同的地址,修改一个对象的属性,不会改变另一个对象的属性。

被折叠的 条评论
为什么被折叠?



