1 深复制+浅复制
1 简单描述:
1 浅复制: 复制的是引用地址
2 深复制: 复制的是堆内存中的对象, 是一个全新的对象, 跟之前是不同的引用地址
2 实现浅复制的方法: var hh = obj
3 实现深复制的方法:
1 var hh = json.parse(json.stringify(obj)) //基于 obj, 创建了新的对象 hh
2 let hh = {
...obj} //基于 obj, 创建了新的对象 hh
3 let hh = [...arr] // 基于 arr, 创建了新的数组 hh
2 判断数据类型的所有方式
1 判断数据类型的方式:
-----------------------------------------------------------------------------------------
1 typeof x
2 console.log(Object.prototype.toString.call(str))
-----------------------------------------------------------------------------------------
2 怎么判断一个变量是否为数组
-----------------------------------------------------------------------------------------
1 Array.isArray( hh ) // true / false
2 hh instanceof Array // true / false
-----------------------------------------------------------------------------------------
3 关于对象的
1 怎么判断某个对象是一个空对象:
-----------------------------------------------------------------------------------------
1 将json对象转化为json字符串,再判断该字符串是否为"{}"
2 console.log(JSON.stringify(a)==='{}') //true
-----------------------------------------------------------------------------------------
4 关于数据的
1
-----------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------
5 遍历对象的方法
1 遍历对象: for in 循环
-----------------------------------------------------------------------------------------
1 注意事项:
1 for in 只会遍历自定义属性, 不会遍历原型上的默认属性和方法
2 但在实际应用中, 若原型上新增了属性和方法, for in 就会把新增的属性和方法遍历出来 (解决方案, 如下代码)
3 for in 循环也可遍历数组, 但一般不那么干
2 代码范式:
1 基础格式
for (var k in obj) {
console.log(k) //obj的每个属性
console.log(obj[k]) //obj的每个属性对应的属性值
}
2 解决方式 1
for (var k in obj) {
if(!Object.prototype.hasOwnProperty.call(people,key)) continue;
console.log(k, obj[k]) //如上代码就, 解决了, 遍历新增属性和方法的这个特性
}
3 解决方式 2
for (var k in obj) {
if (obj.hasOwnProperty(k)){
//此方法会忽略掉, 从原型上得到的属性
console.log(k, obj[k])
}
}
-----------------------------------------------------------------------------------------
6 遍历数组的方法
1 for of 循环
-----------------------------------------------------------------------------------------
1 注意事项:
1 无法遍历对象
2 只会遍历数组元素
2 代码范式:
let arr = [1, 2, 3]
for (let v of arr) {
console.log(v) // v == 数组元素
}
-----------------------------------------------------------------------------------------
2 forEach() //操作
-----------------------------------------------------------------------------------------
1 注意事项:
1 没有返回值
2 可以改变原数组
2 使用场景:
1 在可以改变原数组的情况下使用
2 所以不需要有返回值
3 代码范式:
let arr = [1, 2, 3]
arr.forEach( (v, i) => console.log(v + '---' + i) )
-----------------------------------------------------------------------------------------
3 map() //操作
-----------------------------------------------------------------------------------------
1 注意事项:
1 有返回值
2 不可以改变原数组
2 使用场景:
1 不能改变原数组的时候使用
2 这样就可以, 生成我们需要的新数组, 并 return 出来
3 代码范式:
let arr = [1, 2, 3]
let hh = arr.map( (v, i) => v + i )
console.log(hh)
-----------------------------------------------------------------------------------------
4 filter //过滤
-----------------------------------------------------------------------------------------
1 作用: 过滤数组, 拿到我们需要的数组元素, 组成新的数组, 并 return 出来
2 代码范式:
let arr = [1, 2, 3]
let hh = arr.filter( v => v>2 )
console.log(hh)
-----------------------------------------------------------------------------------------
5 every //判断
-----------------------------------------------------------------------------------------
1 作用: 遍历所有数组元素, 只要存在一个不符合条件的, 就返回 false
2 代码范式:
let arr = [1, 2, 3]
var hh = arr.every(v => v>2) //只要发现一个, 不大于2的数组元素, 就返回 false
console.log(hh) // false
-----------------------------------------------------------------------------------------
6 some //判断
-----------------------------------------------------------------------------------------
1 作用: 遍历所有数组元素, 只要存在一个符合条件的, 就返回 true
2 代码范式:
let arr = [1, 2, 3]
var hh = arr.every(v => v>2) //只要发现一个, 大于2的数组元素, 就返回 true
console.log(hh) // true
-----------------------------------------------------------------------------------------
7 各种遍历方法之间的区别
1 for in / for of --> 区别
比较项 | for in | for of |
---|---|---|
作用 | 遍历对象 | 遍历数组 |
功能 | 可以遍历属性 | 不能遍历属性 |
2 forEach 和 for循环的区别 -> for 循环更加灵活
forEach | for |
---|---|
不支持 break操作 (报错) | 不报错 |
无法在遍历的同时删空自己 | 可以 |
不能控制循环的起点, 只能从0开始 | 可以自定义, 遍历起点 |
for 循环更加灵活, 可操作性强 | forEch 使用方便, 封装好的 API |
1 总结
-----------------------------------------------------------------------------------------
1 通常 for循环就可以解决我们的问题了
2 但是很多情况下, 使用 API可以更方便的解决问题
-----------------------------------------------------------------------------------------
8 其他知识点
1 页面跳转怎么传参:
-----------------------------------------------------------------------------------------
1 get传值
2 路由传参
3 Localstorage
-----------------------------------------------------------------------------------------
2 结束循环:
-----------------------------------------------------------------------------------------
1 break -- 结束整个循环 / switch 中防止穿透
2 continue -- 跳过当前循环项
3 return -- 结束函数 / 指定返回值
-----------------------------------------------------------------------------------------
3 微任务和宏任务:
-----------------------------------------------------------------------------------------
1 宏任务: script标签 / setTimeout / setInterval //常见的3个宏任务
2 微任务: promise.then 的回调; async 函数中await后面的程序
-----------------------------------------------------------------------------------------
4 前端是怎么加密信息的:
-----------------------------------------------------------------------------------------
1 JavaScript 加密后传输 -- 在数据发送前 -- 将数据进行哈希或使用公钥加密
2 浏览器插件内进行加密传输
3 Https 传输
-----------------------------------------------------------------------------------------