码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • san.js源码解读之工具(util)篇——extend函数


    一、源码解读

    /**
     * 对象属性拷贝
     *
     * @param {Object} target 目标对象
     * @param {Object} source 源对象
     * @return {Object} 返回目标对象
     */
    function extend(target, source) {
        for (var key in source) { // 1
            if (source.hasOwnProperty(key)) { // 2
                var value = source[key];
                if (typeof value !== 'undefined') {
                    target[key] = value; // 3
                }
            }
        }
    
        return target;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    extend 函数用于拷贝对象属性。通过 for in 循环 source 对象中的可遍历属性, 需要注意的是 for in 循环也能遍历到对象上的继承属性,所以使用 hasOwnProperty 函数判断是否是属于自身属性,如果属于自身属性的拷贝,就进行拷贝(这里需要注意的是拷贝不是深拷贝而是浅拷贝)。最后返回目标对象

    1. for in 循环
    for in 循环大部分用于遍历对象,不用于遍历数组。

    mdn 描述

    for…in 语句以任意顺序迭代一个对象的除Symbol以外的可枚举属性,包括继承的可枚举属性。

    使用for in时需要注意一下几点

    1. 使用for in 遍历数组时,下标key 是字符串类型而不是数值类型
      请添加图片描述
    2. 遍历顺序是对象属性的枚举顺序,所以在数组遍历时不一定是按照下标顺序打印的
    3. 遍历对象时,遍历的是对象上的可枚举属性(包括自身和原型链上的)

    2. hasOwnProperty() 函数
    解释:该方法返回一个布尔值,表示对象自有属性(而不是继承来的属性)中是否具有指定的属性,它不会在对象原型链中检查指定的属性。

    3. target[key] = value

    target[key] = value

    这条赋值语句并没有判断tagrget中是否已经已经存在key,而是直接赋值,并且属于浅拷贝。

    二、示例

    1.extend 函数拷贝对象

    let khTarget = {};
    let khSource = {
        apple: {
            watch: ['s7', 's8', 's9'],
        }
    };
    
    console.log(extend(khTarget, khSource));
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    请添加图片描述
    其实当执行完 extend 函数属性拷贝后,直接打印 khTarget 变量结果和打印 extend(khTarget, khSource) 结果一致

    let khTarget = {};
    let khSource = {
        apple: {
            watch: ['s7', 's8', 's9'],
        }
    };
    
    extend(khTarget, khSource)
    
    console.log(khTarget); // 用到了副作用
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    请添加图片描述
    2.extend 函数是浅拷贝

    let khTarget = {};
    let khSource = {
        apple: {
            watch: ['s7', 's8', 's9'],
        }
    };
    
    extend(khTarget, khSource)
    
    khSource.apple.watch.push('s10'); // 修改原来对象中的数据
    
    console.log(khTarget); // 目标对象也跟着修改
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    请添加图片描述

    参考文档

    • mdn:typeof
    • mdn:hasOwnProperty
    • JavaScript中for in与for of
  • 相关阅读:
    抖音实战~关注博主
    Linux 通过 rpm 安装 RabbitMQ 详细步骤
    MySQL基础篇【第六篇】| 存储引擎、事务、索引、视图、DBA命令、数据库设计三范式
    Linux防火墙之firewalld
    HTML5期末考核大作业,电影网站——橙色国外电影 web期末作业设计网页
    1.7.4、计算机网络体系结构中的术语
    java学习笔记 day8.6
    Spark文章汇总
    2022年全球市场电动采光天窗总体规模、主要生产商、主要地区、产品和应用细分研究报告
    java计算机毕业设计网上拍卖系统源程序+mysql+系统+lw文档+远程调试
  • 原文地址:https://blog.csdn.net/qq_42683219/article/details/132870553
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号