简单数据和复杂数据,数组解构,深、浅拷贝

学习目标:

  • 一周掌握 Js入门知识

学习内容:

  1. 函数的递归
  2. 两种遍历数组的方法forEach和for循环
  3. 遍历对象的方法for in
  4. 什么是简单数据
  5. 什么是复杂数据
  6. 数组对象的解构
  7. 数组的解构
  8. 浅拷贝
  9. 深拷贝

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对象形式

结果:

总结:

本节中说的堆和栈问题可以百度一下。

有巧方法当然优先利用啦,当自己有一定实力的时候再去深究一些完美方法,来增强自己。

猜你喜欢

转载自blog.csdn.net/H524268015wsw/article/details/126059765