学习目标:
- 一周掌握 Js入门知识
学习内容:
- 函数的递归
- 两种遍历数组的方法forEach和for循环
- 遍历对象的方法for in
- 什么是简单数据
- 什么是复杂数据
- 数组对象的解构
- 数组的解构
- 浅拷贝
- 深拷贝
1.函数的递归
什么是递归?简单理解就是函数内部自己调用自己。但是一定要注意要有停止条件的return,不然函数会一直被调用、打印。可能会出现错误或是浏览器卡死等。
代码:
let a = 1
function fn() {
console.log('11');
if (a == 5) {
return
}
a++
fn()
}
fn()
结果:
2.两种遍历数组的方法forEach和for循环
第一种forEach:是数组的一种遍历方法,逐个遍历数组元素,需要注意的是forEach没有return值。
代码:
let arr = [1, 2, 3, 4, 5, 6]
arr.forEach((it) => {
console.log(it);
})
结果:
第二种方法就是利用for循环,结果是一样的。方法不同而已。
代码:
let arr = [1, 2, 3, 4, 5, 6]
for (let index = 0; index < arr.length; index++) {
console.log(arr[index]);
}
结果:
3.遍历对象的方法for in
for in 循环是一种特殊类型的循环,也是普通 for 循环的变体,主要用来遍历对象,使用它可以将对象中的属性依次循环出来,其语法格式如下: for (variable in object) {}
代码:
let obj = {
name: 'heyang',
age: 21,
hobby: 'luya',
}
for (const key in obj) {
console.log(obj, obj[key]);
}
结果:
4.简单数据类型
js把数据类型分为两类:
简单数据类型(Number,String,Boolean,Underfined,Null)
复杂数据类型(object);
代码:
var a1 = 1
var a2 = '1'
var a3 = true/false
var a4 = undefined
var a5 = NaN
简单数据类型放在栈中,存的是值 如果想修改某个值 其他的变量不会发生改变
示例:
let b = 10
let c;
c = b
c = 30
console.log(b, c);
结果:
5.复杂数据类型
复杂数据类型(object);
复杂数据类型 他们存的引用地址 当引用地址 中有一个 变量变了 其他同一个地址也会发生改变
代码:
let obj1 = {
name: 'heyang',
age: 21,
hobby: 'luya',
}
let obj2 = obj1
obj1.name = '11'
console.log(obj1, obj2);
结果:
6. 数组对象的解构
利用对象的属性名来解构
代码:
let obj3 = {
name: 'ya',
age: 15,
}
const { name,age } = obj3
console.log(name,age);
结果:
7.数组的解构
和数组对象解构很相似,数组的解构是利用位置(坐标)的一一对应。
代码:
let arr1 = [1,2,3,4]
let [q,w,e,f] = arr1
console.log(q,w,e,f);
结果:
8. 浅拷贝
浅拷贝是按位拷贝对象,它会创建一个新对象,有着原始对象属性值的一份精确拷贝。
8.1首先可以利用for in方法来实现浅拷贝
代码:
let obj4 = {
name:'ji',
age:18,
}
let obj5 = {}
for (const key in obj4) {
obj5[key]=obj4[key]
}
obj4.name='11'
console.log(obj5);
结果:
8.2利用assign()方法实现浅拷贝,这种简洁且易懂,
代码:
let obj6 = {
a:'d',
b:15,
}
let obj7 = {}
Object.assign(obj7,obj6)
obj6.a=c
console.log(obj7);
结果:
9.深拷贝
JavaScript的浅拷贝、深拷贝是一个老生常谈的话题,真正完美的深拷贝其实是比较困难的,但相对的能应用的场景也同样比较少。
9.1首先说一下完美的深拷贝,(老师没细讲,一时半会我也说不明白,仅供参考。)
let obj = {
b: 2,
hobby: {
jump: '跳'
}
}
function DeepCopy(obj) {
let newObj = {}
if(typeof obj != 'object') { // 如果传进来的obj 他不是一个对象 我就不执行了
return alert('他不是一个对象');
}
for (const key in obj) {
if(typeof obj[key] == 'object'){ //如果里面还是有引用数据类型
// newObj['b']
newObj[key] = DeepCopy(obj[key]) // 使用递归在调用当前函数
} else {
newObj[key] = obj[key] // 直接拷贝
}
}
return newObj
}
9.2难得不好懂,那当然也有简单的用法啦,利用JSON.stringify(),深拷贝
代码:
let obj8 = {
name:'lo',
hobby:{
lanqiu:'da',
zuqiu:'ti',
}
}
let obj9 = JSON.stringify(obj8)//转成JSON类型的字符串
console.log(obj9);
let obj10 = JSON.parse(obj9)//把JSON类型的字符串 转回 js 对象
console.log(obj10);
JSON.stringify()这个方法会把数组元素拷贝成字符串的形式
而JSON.parse()可以把字符串数组转回js对象形式
结果:
总结:
本节中说的堆和栈问题可以百度一下。
有巧方法当然优先利用啦,当自己有一定实力的时候再去深究一些完美方法,来增强自己。