首页 > 编程语言 >【JavaScript系列八】—讲述JS学习历程的知识分享!

【JavaScript系列八】—讲述JS学习历程的知识分享!

时间:2024-09-09 09:21:57浏览次数:5  
标签:function obj2 讲述 函数 JavaScript JS key var 拷贝

前言

本篇主要讲述JS中较为重要的一环,函数的用法,深拷贝和浅拷贝的概念和区别,闭包和递归,包括一些案例:例如递归实现斐波那契数列,求阶乘等等

一、关于函数

定义函数的方式

  • function关键字
  • 函数表达式(匿名函数)var fn = function(){}
  • new function()

函数的调用及其this指向

  • 普通函数——指向window
  • 对象的方法——该方法所属对象
  • 构造函数——实例对象,原型对象方法里面的 this 也指向实例对象
  • 绑定事件函数——绑定事件的对象
  • 定时器函数——指向window
  • 立即执行函数——指向window

改变this指向的方法

  • call

可以调用函数,也可以改变 this 指向。多用于构造函数的属性继承

  • apply

Math.max.apply(Math, [3,1,2])

  • bind

特点:不会直接调用函数

严格模式

  • 消除了 Javascript 语法的一些不合理、不严谨之处,减少了一些怪异行为

  • 消除代码运行的一些不安全之处,保证代码运行的安全

  • 提高编译器效率,增加运行速度

  • 禁用了在 ECMAScript 的未来版本中可能会定义的一些语法,为未来新版本的 Javascript 做好铺垫。比如一些保留字如:class,enum,export, extends, import, super 不能做变量名

如何开启严格模式

  • 脚本开启严格模式
<script>
   "use strict"; //当前script标签开启了严格模式
</script>
  • 函数开启严格模式
function fn(){
  "use strict";
  return "123";
}

开启严格模式后的某些变化

  • 严格模式下使用未声明的变量会报错
  • 严格模式下不允许删除变量
  • 严格模式下全局作用域下的this指向是undefined
  • 严格模式下函数中的参数名不能重复
  • 严格模式下if语句和for语句下不允许声明函数

高阶函数

将函数作为参数或者返回值的函数

二、闭包

闭包是指一个函数访问了另一个函数作用域中变量的函数

闭包的作用

延伸变量的使用范围

function fn() {
    var num = 10;
    function fun() {
        console.log(num);
    }
    return fun;
}
var f = fn();
f();

闭包案例

计算打车的价格:

需求分析
    打车起步价13(3公里内), 之后每多一公里增加5块钱。用户输入公里数就可以计算打车价格
    如果有拥堵情况,总价格多收取10块钱拥堵费
var car = (function () {
    var start = 13; // 起步价  局部变量
    var total = 0; // 总价  局部变量
    return {
        // 正常的总价
        price: function (n) {
            if (n <= 3) {
                total = start;
            } else {
                total = start + (n - 3) * 5
            }
            return total;
        },
        // 拥堵之后的费用
        yd: function (flag) {
            return flag ? total + 10 : total;
        }
    }
})();
console.log(car.price(5)); // 23

三、递归

函数内部自己调用自己, 这个函数就是递归函数

案例一:利用递归求1~n的阶乘

function fn(n) {
    if (n == 1) { //结束条件
        return 1;
    }
    return n * fn(n - 1);
}
console.log(fn(3));

案例二:利用递归求斐波那契数列

// 利用递归函数求斐波那契数列(兔子序列)  1、1、2、3、5、8、13、21...
// 输入一个数字 n 就可以求出这个数字对应的兔子序列值
// 我们只需要知道输入的n的前面两项(n-1 n-2)就可以计算出n对应的序列值
function fb(n) {
    if (n === 1 || n === 2) {
        return 1;
    }
    return fb(n - 1) + fb(n - 2);
}
console.log(fb(3));

四、深拷贝和浅拷贝

  • 浅拷贝只是拷贝一层,更深层次对象级别的只拷贝引用
  • 深拷贝拷贝多层,每一级别的数据都会拷贝
浅拷贝


var obj1 = {
    name: 'ifer',
    age: 18,
    sex: '男'
};
var obj2 = {};
for(var key in obj1) {
    obj2[key] = obj1[key];
}
console.log(obj2);
深拷贝



var obj1 = {
    name: 'ifer',
    age: 18,
    sex: '男',
    test: {
        xxx: 'xxx',
        yyy: 'yyy'
    }
};
var obj2 = {};

// o1 => origin, o2 => new
function deepCopy(o1, o2) {
    for(var key in o1) {
        // 注意顺序要先判断 Array,如果先判断 Object,那 [] 也是 Object,就区分不出是 {} 还是 [] 了
        if(o1[key] instanceof Array) {
            // 如果 key 对应的value是 Array,[]
            o2[key] = [];
            deepCopy(o1[key], o2[key]);
        } else if(o1[key] instanceof Object) {
            // 如果 key 对应的value是 Object,{}
            o2[key] = {};
            deepCopy(o1[key], o2[key]);
        } else {
            o2[key] = o1[key];
        }
    }
}

deepCopy(obj1, obj2);
obj1.test.xxx = 'fffff';
console.log(obj2.test.xxx);

简便实现方法:

  • 浅拷贝:Object.assign(obj1,obj2)

把obj2拷贝给obj1

  • 深拷贝:JSON.stringify和JSON.parse

还可以自己封装一个深拷贝的函数,有兴趣的可以自己试试噢~        私信我获取深拷贝封装函数

有不明白的或者有其他问题的可以评论区留言噢

私信回复JS思维导图可获取完整知识导图~

今天的知识分享就到这里啦~希望大家在这能学到知识一起分享一起进步,成为更好的自己!

标签:function,obj2,讲述,函数,JavaScript,JS,key,var,拷贝
From: https://blog.csdn.net/m0_60623820/article/details/141951433

相关文章

  • 【JavaScript系列九】—讲述JS学习历程的知识分享!
    前言本篇主要是讲述ES6的新增语法和相关运用一、ES6ES的全称是ECMAScript,它是由ECMA国际标准化组织,制定的一项脚本语言的标准化规范。泛指2015年6月之后发布的版本为什么使用ES6语言更加完善功能更加强大变量提升特性增加了程序运行时的不确定性语法过于......
  • java导入json数据至doris
    表结构字段名称与json key名称一致:packagecom.ruoyi.doris;importcn.hutool.core.io.FileUtil;importcn.hutool.http.HttpRequest;importcn.hutool.http.HttpResponse;importcom.alibaba.fastjson.JSONArray;importcom.alibaba.fastjson.JSONObject;importlomb......
  • 基于Node.js+vue基于的营养配餐评价系统(开题+程序+论文) 计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容研究背景随着人们生活水平的提高和健康意识的增强,科学合理的膳食搭配成为了现代人追求健康生活方式的重要组成部分。然而,在日常饮食中,许多人因缺乏专业的营养知识和......
  • 基于Node.js+vue应急物资管理平台(开题+程序+论文) 计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容研究背景在自然灾害、公共卫生事件等突发事件频发的背景下,应急物资的高效管理与快速调配成为保障人民生命财产安全、维护社会稳定的关键环节。然而,传统的应急物资管......
  • 基于Node.js+vue基于的外卖订餐系统(开题+程序+论文) 计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容研究背景随着互联网技术的飞速发展和智能手机的普及,外卖订餐服务已成为现代生活中不可或缺的一部分。人们越来越倾向于通过便捷的手机应用解决日常餐饮需求,这不仅节......
  • 基于Node.js+vue基于springboot的茶文化交流平台的设计与实现(开题+程序+论文) 计算机
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容研究背景在全球化日益加深的今天,文化的传承与交流显得尤为重要。茶文化作为中国传统文化的瑰宝,不仅承载着深厚的历史底蕴,还蕴含着丰富的哲学思想和审美追求。然而,随......
  • JavaScript高级——数据、变量、内存
    1、数据存储在内存中代表特定信息的东西,本质上是010101…….数据的特点:可传递、可运算一切皆数据内存中所有操作的目标:数据操作包括:算术运算、逻辑运算、赋值、运行函数(调用函数传参)。2、内存内存条通电后产生的可存储数据的空间(临时的)内存产生和死亡:内存条(电路板)——> ......
  • 基于Node.js+vue应急平台(开题+程序+论文) 计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容研究背景在全球化与信息化的时代背景下,自然灾害、公共卫生事件等突发事件频发,对社会稳定、经济发展及人民生命财产安全构成了严重威胁。传统应急响应机制往往面临信......
  • 基于Node.js+vue基于机器学习的高考志愿推荐(开题+程序+论文) 计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容研究背景随着教育改革的深入和高等教育普及率的提升,高考作为学生生涯中的关键节点,其志愿填报环节日益受到重视。然而,面对海量且复杂的院校、专业信息及不断变化的高......
  • 基于Node.js+vue中医文献管理系统(开题+程序+论文) 计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容研究背景中医,作为中华民族宝贵的文化遗产,其理论与实践体系博大精深,承载着数千年的医学智慧。随着中医研究的不断深入和全球化传播,中医文献的数量急剧增加,涵盖了古籍......