对象{}、防抖与节流、常用日期对象、new 操作符做了哪些事(面试题)、计时器与定时器、递归、阻止对象的默认行为、mouseover 和 mouseenter的区别

news/2024/5/10 17:38:17/文章来源:https://blog.csdn.net/TKY666/article/details/124111689

目录

一、对象是什么?

二、对象的构成

1.属性

2.方法

三、对象的创建及使用

创建对象的三种方式

1.对象字面量:

2.利用new Object创建对象 

new 操作符做了哪些事(面试题)

3.利用构造函数创建对象

for in 遍历对象

Object.keys()遍历对象

拷贝对象--扩展运算符

如何合并对象

Object.assign()

扩展运算符

如何删除对象属性

使用 delete 操作符

使用对象解构(较多属性操作时推荐)

使用Reflect (单个属性操作时推荐)

日期对象 

vue中设置日期及其格式模板

字符串对象+方法

计时器与定时器

防抖与节流

防抖简单方法封装:

节流简单方法封装:

阻止默认行为 

关于递归


一、对象是什么?

对象是一个具体的事物。

对象是一组无序的相关属性和方法的集合,所有的事物都是对象,比如,字符串,数值,数组,函数等

二、对象的构成

1.属性

属性:是指事物的特征,在对象中用属性来表示(常用名词)

2.方法

方法:是指事物的行为,在对象中用方法来表示(常用动词)

示例:

//代码表示<script>var iphone12 = {  //iphone:对象名price: 9999, //price:属性  9999:属性值sendTEL: function () { //方法console.log("我能打电话")},}console.log(iphone12.price);console.log(iphone12.sendTEL())</script>

三、对象的创建及使用

创建对象的三种方式

1.对象字面量:

花括号{ }里面包含了表达对象的属性和方法

示例:

            // var obj ={}  //创建了一个空对象               

总结:
1、创建对象

用字面量{ }创建对象,里面的属性或者方法采用的是:键:值 (键值对)的方式
多个属性或者方法之间是 ,(用逗号)隔开
方法 冒号后面跟的是一个匿名函数

2、 使用对象

(1)调用对象的属性,使用  对象名.属性名的方式,可以理解为,对象 的 属性
(2)调用对象的属性,也可使用 对象名[‘属性名’]的方式,注意加引号
调用对象的方法: 对象名.方法名() ,对象名.方法名() ,千万别忘了加小括号

3、变量、属性、函数、方法的总结
变量:单独声明赋值、单独存在
属性:对象里面的变量称为属性、不需要声明,用来描述该对象的特征
函数:单独存在的、通过  函数名() 的方式就可以调用
方法:对象里面的函数称为方法、方法不需要声明、使用 对象.方法名() 的方式就可以调用,方法用来描述该对象的行为和功能
变量和函数都需要声明,属性和方法不需要声明就可直接使用

2.利用new Object创建对象 

    <script>var obj = new Object()obj.name = '小坤';obj.age = 18;obj.sayHi = function () {console.log("我能说:只因你太美!")}console.log(obj.name);console.log(obj['age']);console.log(obj.sayHi());</script>

注意:在这里使用new Object() 创建对象,使用的是 =(等号)赋值的方法来添加对象的属性和方法

new 操作符做了哪些事(面试题)

1.创建一个空对象   new  Object()

2.把空对象的__proto__,指向构造函数的原型对象prototype

3.把空对象作为this的指向上下文

4.如果函数无返回值,则返回this

引用类型:数组,对象,函数每一个引用类型都有一个__proto__属性  隐式原型对象[[prototype]]每一个函数都有一个 显式原型对象 prototype1.创建一个空对象   new  Object()
2.把空对象的__proto__,指向构造函数的原型对象prototype
3.把空对象作为this的指向上下文
4.如果函数无返回值,则返回this

3.利用构造函数创建对象

为什么需要用构造函数创建对象?因为前面两种创建方法一次只能创建一个对象,请看下面代码:

 <script>var obj1 = {name: '张三疯',age: 18,sayHi: function () {console.log("hello")}}var obj2 = {name: '李四',age: 20,sayHi: function () {console.log("hello")}}</script>

可以发现,创建的对象属性和方法都相同,如果需要创建很多个,一个一个创建效率就会很低。但是,我们可以利用一个函数去重复创建对象,这个函数称为构造函数。构造函数中封装的不是普通代码,而是对象

构造函数:是一种特殊的函数,主要用来初始化对象,即为对象成员变量赋初始值,它总与new运算符一起使用,我们可以把对象中一些公共的属性和方法抽取出来封装到这个函数里面。

构造函数的语法格式:

function 构造函数名(){			//this可以理解为: 对象的...this.属性=值;this.方法=function(){}
}
使用构造函数:new 构造函数名            //注意:构造函数名首字母大写哟
//使用new调用构造函数返回的是一个对象

 示例:

<script>						function Obj(name, age) {	//创建构造函数,传入两个参数this.name = name;this.age = age;this.sayHi = function () {console.log("hello!");}}var obj1 = new Obj('小蔡', 18) //使用new调用构造函数,返回的是一个对象console.log(typeof (obj1));   //使用typeof()函数判断obj1的数据类型,证明返回的是对象console.log(obj1.name);		 //获取名称console.log(obj1.age);		//获取年龄console.log(obj1.sayHi());	//调用方法</script>

总结:

1、构造函数和对象的区别:

  1. 构造函数是把对象相同的属性(公共部分)封装在一起,泛指的某一大类,如:明星/汽车图纸
    他类似于java里面的类(class)

  2. 对象:特指的一个具体事物,如:刘德华/一辆真实的汽车

2、new关键字执行构造函数创建对象的过程

  1. 在内存中创建一个新的空对象
  2. 让this指向这个新对象
  3. 执行构造函数里面的代码,给这个对象添加属性和方法
  4. 返回这个新对象(所以构造函数里面不需要return)

通过new关键字创建对象的过程也加对象的实例化

for in 遍历对象

let obj = {name:'cxk',Music:'鸡你太美'};for(var item in obj){console.log(item); // name,Musicconsole.log(obj[item]); // cxk 鸡你太美}

Object.keys()遍历对象

作用:遍历对象
返回结果:返回对象中每一项key的数组

	// 1. 定义一个对象var obj = { 0:'熊大',1:'熊二',2:'光头强' }// 2. 使用Object.keys()方法var keyValue = Object.keys(obj)// 3. 打印结果console.log(keyValue)  // 得到是:["0","1","2"]

也可以结合forEach来使用
Object.keys(要遍历的对象).forEach((v,i) => {})

 Object.keys(obj).forEach(key => {console.log(key, obj[key]);})// 得到的是:0---熊大//          1---熊二//          2---光头强 

拷贝对象--扩展运算符

拓展运算符 ... 用于取出参数对象所有可遍历属性然后拷贝到当前对象。

一层嵌套为深拷贝let person1={name:"Amy",age:16};
let someone1={...person1}
person1.age=17
console.log(someone1); // {name:"Amy",age:16}多层嵌套为浅拷贝,也就是只能深拷贝一层嵌套的数据
let aa = {age: 18,name: 'aaa',address: {city: 'shanghai'}
}let bb = {...aa};
bb.address.city = 'shenzhen';console.log(aa.address.city);  // shenzhen

这种拷贝方式如果只是一层数组或是对象,其元素只是简单类型的元素,那么属于深拷贝,如果数组或对象中的元素是引用类型的元素,那么就是浅拷贝

如何合并对象

Object.assign()

同名属性会被覆盖
Object.assign种第一个值是目标对象,第二个值是源对象

const obj1={a:"1",b:"2"}
const obj2={b:"3",c:"4"}
const result = Object.assign(obj1,obj2)
console.log(result)
//a:1 b:3 c:4     obj1中b的值被后面传入的obj2的值给覆盖掉了

扩展运算符

同名属性会被覆盖

使用…扩展运算符合并对象obj1对象在前和在后最后打印的结果是不同的

const obj1={a:"1",b:"2"};
const obj2={b:"3",c:"4"};
const result = {...obj1,...obj2};
console.log(result)
//a:1 b:3 c:4     obj1中b的值被后面传入的obj2的值给覆盖掉了

如何删除对象属性

使用 delete 操作符

delete 将完全从对象中删除属性,会导致原始对象的发生改变,但速度很慢。

const item = { species: 'dog', age: 3, name: 'celeste', gender: 'female' 
}; delete item.gender; 
Object.keys(item); // ['species', 'age', 'name'] 
  • delete操作符移除对象指定属性,删除成功返回true,否则返回false。
  • 删除的属性不存在,delete不会起任何作用 ,但是仍会返回true。
  • 如果原型链有同名属性,只会删除自身的属性。
  • delete不能删除全局作用域函数以及作用域中用let或const声明的属性。
  • delete可以删除对象的函数。
  • 不可设置属性不能被删除。比如Math、Array、Object内置对象属性以及使用Object.defineProperty()方法设置的属性。
     

使用对象解构(较多属性操作时推荐)

通过用展开运算符(…)可以将需要省略特定属性的对象解构到新对象。这个技巧在需要删除多个属性时特别有用,并且不会更改原始对象。

const item = { species: 'dog', age: 3, name: 'celeste', gender: 'female' 
}; const { gender,name, ...newItem } = item; // 删除 gender,name,两个属性且生成一个深拷贝的新对象
Object.keys(item); // ['species', 'age', 'name', 'gender'] 
Object.keys(newItem ); // ['species', 'age'] 
console.log(Object.keys(item),Object.keys(newItem ),item == newItem);//false

使用Reflect (单个属性操作时推荐)

ES6新增的方法,Reflect.deleteProperty(对象,属性名),返回一个布尔值。

const item = { species: 'dog', age: 3, name: 'celeste', gender: 'female' 
}; Reflect.deleteProperty(item, 'gender')
Object.keys(item); // ['species', 'age', 'name'] 

日期对象 

getFullYear()
使用 getFullYear() 获取年份

getTime()
getTime() 返回从 1970 年 1 月 1 日至今的毫秒数

setFullYear()
如何使用 setFullYear() 设置具体的日期

toUTCString()
如何使用 toUTCString() 将当日的日期(根据 UTC)转换为字符串

getDay()
如何使用 getDay() 和数组来显示星期,而不仅仅是数字

转自菜鸟教程更多对象前往菜鸟教程查看

举例:

 var mydate = new Date();console.log(mydate);console.log(mydate.toLocaleDateString()); //2022/4/8 以本地日期字符串显示console.log(mydate.toLocaleTimeString()); //11:29:08 以本地时分秒字符串显示console.log(mydate.toLocaleString()); //2022/4/8 11:29:08 以本地日期字符串显示console.log(mydate.getFullYear());//年份console.log(mydate.getMonth()); //月份  0-11使用时要+1console.log(mydate.getDate()); //日期console.log(mydate.getHours()); //小时  24小时制console.log(mydate.getMinutes()); //分钟console.log(mydate.getSeconds()); //秒console.log(mydate.getMilliseconds()); //毫秒 1s=1000msconsole.log(mydate.getDay()); //   0-6  星期日-->0 星期一-->1 使用时要进行判断转化console.log(mydate.getTime()); //毫秒数  距离1970.1.1的毫秒数console.log(mydate.Date.now()); //也表示毫秒数  距离1970.1.1的毫秒数

vue中设置日期及其格式模板

created() {const date = new Date()const Y = date.getFullYear()   // 年const M = date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1;   //月const D = date.getDate() < 10 ? '0' + (date.getDate()) : date.getDate()   //日// const HH = date.getHours() < 10 ? '0' + (date.getHours()) : date.getHours()   //时// const MM = date.getMinutes() < 10 ? '0' + (date.getMinutes()) : date.getMinutes()   //分this.startDate = `${Y}-${M}-${D}`;this.endDate = `${Y}-${M}-${D}`;// this.dateValue = moment(new Date());// console.log(moment().format("YYYY-MM-DD"));// console.log(this.startDate, this.endDate,);},

字符串对象+方法

字符串的索引从零开始, 所以字符串第一字符为 [0],第二个字符为 [1], 等等

字符串(String)使用长度属性length来计算字符串的长度

indexOf() 方法可返回某个指定的字符串值在字符串中首次出现的位置

     // var a = new String("asdasffafg")// document.write(a.length)// for(var b = 0; b<=a.length-1;b++){//     document.write(a[b])//索引号 取值范围[0, b.length - 1]// }// var a = new String("asdafgsdfgsdfasd")// document.write(a.indexOf("3")) // .indexOf(参数1,参数2)//从参数2的位置开始查找参数1的位置 默认从 0 开始//参数1: 必需 查找的子串//参数2: 可选 开始查找到的位置//返回值:若查找到该子串 返回该字串在整个字符串第一次出现的位置 查找不到返回-1// .lastindexOf(参数1,参数2)// 从参数2的位置开始查找参数1的位置 默认从 最后一位 开始

计时器与定时器

计时器:setInterval(参数1,参数2) 间隔参数2的时间 执行一次参数1 的代码(不断执行

clearInterval();  取消setInterval的设置

定时器:setTimeout(参数1,参数2)   延迟参数2的时间,执行参数1里的代码  参数1 :待执行的代码串(只执行一次

clearTimeout();   取消setTimeout的设置

更多细节可查看链接

https://developer.mozilla.org/zh-CN/docs/Web/API/setIntervalhttps://developer.mozilla.org/zh-CN/docs/Web/API/setInterval

注意:

如setInterval(参数1,参数2);

参数一若为函数写法应是(函数名,参数2)("函数名()",参数2),注意小括号在哪种情况下应该写。

参数一若为匿名函数写法应是(function(){},参数2)

使用举例:

//方法一
function gundong() {oDiv.scrollTop += 100;console.log(oDiv.scrollTop);}timer = setInterval("gundong()", 500);
//方法二
function gundong() {oDiv.scrollTop += 100;console.log(oDiv.scrollTop);}timer = setInterval("gundong()", 500);
//匿名函数
timer = setInterval(function () {document.documentElement.scrollTop -= 20; //高度值每次减少数值  累减gdsz = document.documentElement.scrollTop;// console.log(gdsz);if (gdsz <= 0) {//计时器停止条件clearInterval(timer);}}, 10);

防抖与节流

防抖:若一段时间内多次触发事件,则重新计时。

节流:若一段时间内多次触发事件,则只有一次生效。

防抖与节流常用在定时器上面。读上面两句话感觉没什么区别,其实区别大了,(如上图)比如要实现所有路口点单击后触发显示同一个提示框(单击不同点显示内容不同,显示框4s后会自动消失),若按照节流思路来做会导致单击其他路口点时显示框不足4s就消失,因为只有一次生效,所以此处应使用防抖思路来解决。

防抖简单方法封装:

<template><div><button @click="timerClick">测试</button></div>
</template>
<script>
export default {data() {return {timer: null,//作用:控制定时器}},methods: {// 自定义防抖事件timerClick() {console.log("触发事件立即执行的操作");clearTimeout(this.timer);//执行前先清除上次的定时器this.timer = setTimeout(function () {console.log("4秒后的操作");}, 4000)console.log("重新计时");},}
}
</script>

节流简单方法封装:

<template><div><button @click="timerClick">测试</button></div>
</template>
<script>
export default {data() {return {flag: true,//作用:判断是否需操作执行}},methods: {// 自定义防抖事件timerClick() {console.log("触发事件立即执行的操作");let thit = this;if (this.flag) { // 判断下次是否可执行this.flag = false; //一次事件未执行完成下次既不可执行setTimeout(function () { // 注意此处this指向console.log("4秒后的操作");thit.flag = true; // 一次事件执行完成,下次可执行}, 4000)console.log("只触发了一次");}},}
}
</script>

阻止默认行为 

return false;放在要阻止执行的位置即可;还有其他更多方法,后续持续整理

 举例:

<body><form action=""><p><label for="uname">邮箱:</label><input type="text" id="uname" name="uname"></p><p><label for="pwd">密码:</label><input type="password" id="pwd" name="pwd"></p><input type="submit" value="提交" id="but"><!-- 提交有默认行为 提交 --></form>
</body>
<script>var _input1=document.getElementById("uname")var _input2=document.querySelector("#pwd")var _but = document.querySelector("#but")_but.onclick = function(){var a = _input1.valuevar b = _input2.valueif(a.indexOf("@")===-1){alert("请输入正确邮箱格式");return false;//阻止提交默认行为}if(b.length<6){alert("密码长度最少六位");return false;//阻止提交默认行为}}
</script>

关于递归

递归指的是在函数的定义中使用函数自身的方法

递归通常不在意具体操作,只关心初始条件、结束条件和上下层的变化关系。

递归函数需要有临界停止点(结束条件),即递归不能无限制的执行下去。通常这个点为必须经过的一个数。

递归可以被栈替代。有些递归可以优化。比如遇到重复性的可以借助空间内存记录而减少递归的次数

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_891068.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

企业站的最新导航标—SEO优化

于亿万网站之中&#xff0c;怎样让用户能够第一时间发现你的踪迹&#xff0c;点击、浏览、达成交易。这就是现在企业站比较重视的另一种营销模式——网站SEO优化。 以国内最大搜索引擎商为例&#xff0c;它们的竞价推广价格不菲&#xff0c;针对于中小企业而言&#xff0c;成本…

做SEO优化必须要做内容营销

百度算法规则更改之后&#xff0c;重点着重于用户体验&#xff0c;由此笔者小丹将原来的外链为主转移到了内容方面。直白简述&#xff0c;当下的SEO优化比较接近于内容营销。 当然&#xff0c;这里的内容营销并非是天外之笔&#xff0c;而是结合当下现在的稀缺性资源。今天笔者…

网站优化的未来趋向于UEO

SEO优化是现在网站推广中比较热门的优化方式&#xff0c;但是我们不知道SEO究竟能够走多远。笔者小丹之前看到过这样一篇文章&#xff0c;意思无外乎是SEO优化遇到了瓶颈&#xff0c;谷歌已经不再“信任”SEO优化。 作为世界第一搜索引擎的谷歌拒绝了SEO&#xff0c;而国…

解读SEO优化要注意的必须因素

SEO行业已经成为现在网站推广中最为热门的技术行业之一&#xff0c;现在大多数网站都配备自己专门的SEOer&#xff0c;其无论优化技术如何&#xff0c;都要围绕优化的必需因素来进行。 之前笔者小丹有分享过&#xff0c;影响SEO优化结果的因素多大二百多项&#xff0c;要…

求同存异的网站优化

SEO似乎已经成为现在网站推广的代名词之一&#xff0c;面对不同类型的网站我们的优化侧重点是否相同呢&#xff1f;这个可以说是仁者见仁智者见智了。现在网络如果按网站内容来划分的化可以分为企业站、博客、导航和商城&#xff0c;那么针对不同的网站我们要如何来对待呢&…

不能不知道的网站内部优化奥秘

搜索引擎算法规则的更新使得很多SEOer将工作重心移到了站内优化上。这不仅使得大家更为注重基础优化&#xff0c;对于网站信息内容和内链的质量要求上也更为关注。 做网站内部优化笔者小丹之前主要是集中在内链布局上&#xff0c;然后对于站内优化链接仅仅是其中的一部分&#…

软硬兼施的网站优化方式

网站优化到底我们要达到的目的是什么&#xff1f;很多SEOer会说是网站转换率和网站营销额。谨然如此&#xff0c;而事实上很多网站维护者更看重的是表象—网站排名。 其实作为一个“肤浅”的SEOer并不是什么可耻的事情&#xff0c;相反的在亿万万小型企业网站中&#xff0c;你只…

SEO实战:网站排名不靠外链靠基础

内容、外链是日常优化工作的必须&#xff0c;由于百度的绿萝算法把外链的质量进行的评估限定&#xff0c;使得一直以外链为主要SEO手段的网站受到了抨击。怎样的网站优化方式才能够让网站稳定&#xff0c;网站排名也能够提升呢&#xff1f;其实网站自身的质量更为重要。今天笔者…

凡客前副总张小军开服装B2C网站已获亿元风投

1月12日消息&#xff0c;薄荷时尚商城总裁赵承今日在其微博中爆料&#xff0c;前凡客诚品网“某”副总最近上线一个服装B2C网站成格风尚&#xff0c;该网站已获得2亿元的风投。 “又新上线一个服装行业电商 CEO是前凡客某副总&#xff0c;投资方也很厉害&#xff0c;上来就投2个…

凡客诚品官方网站:精彩生活从凡客开始

点此进入凡客诚品官方网站vancl.com 自从改革开放一直到今天&#xff0c;人们的生活水平翻了好几翻&#xff0c;在生活水平提高的同时&#xff0c;科学技术也在跟着提高&#xff0c;现在是讲究高效的时代&#xff0c;效率、时间决定一切。人们都很忙碌&#xff0c;没有多少人有…

大型互联网站解决高并发的常见策略

本文转自&#xff1a;http://www.javabloger.com/article/high-concurrent-common-coping-strategies.html 一个运营的系统在正式上线后将会遇到各种层级的高并发请求&#xff0c;因此我们必须对此做出相应的策略和技术解决方案&#xff0c;首先我们需要认清系统的高并发由3个层…

大型互联网站解决海量数据的常见策略

本文转自&#xff1a;http://www.javabloger.com/article/big-data-architecture.html 大型互联网站的数据存储与传统存储环境相比不仅是一个服务器、一个数据库那么简单&#xff0c;而是由网络设备、存储设备、应用服务器、公用访问接口、应用程序 等多个部分组成的复杂系统。…

在IIS上部署ASPNETMVC Beta网站

在IIS上部署ASPNETMVC Beta网站 在IIS上部署ASPNETMVC Beta网站&#xff0c;实际上和在IIS上部署其他类型的网站并没有太大的区别。个人觉得唯一比较有意思的是在配置IIS时&#xff0c;我们可以配置各种自定义的ISAPI扩展名&#xff08;也在MVC应用配置的&#xff0c;通常在Gl…

网页制作--苹果官方网站模仿

初入WEB前端设计第四天&#xff0c;我仿着做了一个网站&#xff0c;做的很垃圾&#xff0c;也没有一些约束&#xff08;浏览器页面小时会显示错误&#xff09; 成品图如下&#xff1a; 在这里我用了CSS字体 font awesome&#xff0c;不懂的可以去这篇博客&#xff1a;CSS图标…

初学盲打,免费,免安装,高颜值的在线打字练习网站

小时候不怎么接触电脑没有练习过打字&#xff0c;长大后深刻地意识到盲打对工作效率的提高&#xff0c;于是下决心学盲打。和大家一样&#xff0c;刚开始的时候四处搜寻办法&#xff0c;直到遇见了下面两个网站。 免费免安装&#xff0c;高颜值 练习打字的网站&#xff0c;均无…

分享一个打字练习网站

成为一个优秀的程序员&#xff0c;打字速度虽然不是必要条件。但是一个打字快的程序员&#xff0c;必然会享受自己的打字速度&#xff0c;速度快听着啪啪声实在是爽的不行。 Ratatype Ratatype 是一个在线的打字教程网站&#xff0c;能够帮助你提高键盘输入速度。 TYPING TUTO…

微信域名防屏蔽防封系统,轻松微信中域名网站被屏蔽被封的问题

做微信营销活动&#xff0c;域名没被封过&#xff0c;那你的营销人生肯定是不完整的。如果做到微信域名防封呢&#xff1f;这就要借助一些工具来实现有效的防封措施了。 第一步 你需要有一个微信域名检测接口&#xff0c;自己开发或是购买都可以。 第二步 配置你的程序&…

为什么中国免费学习网站那么少?都是收费的?

最近看到很多微信公众说不用钱&#xff0c;免费资料&#xff0c;但是到最后还是收钱&#xff0c;气人啊 &#xff0c;一个学学习程序员的新手有没有钱&#xff0c;什么程序员免费资源等等公众号&#xff0c;最后找到一个良心公众号真的免费资料&#xff0c;就是资源有点少&…

关于IIS6.0配置网站打开出现空白问题解决方法

1)iis配置中默认文档未设置成【index.html】 如图 2&#xff09;未把html交给.net托管 配置html给.net托管如下 1.打开IIS属性找到主目录选项卡 2.点击【配置】出现如下图 在其中ISAPI扩展中添加一条扩展名为【.html】的记录 其中可执行文件大多数都在【C:\WINDOWS\Microso…

第一次使用Python中的Django框架搭建网站学习路线总结

历时三个星期的零零散散时间&#xff0c;终于成功完成了数据库的综合实验---------一个小的网站。 第一次涉及Web开发领域&#xff0c;选择的是Python中的Django框架搭建的。本片博客用于学习路线的总结&#xff0c;方便日后快速回忆起来。如果你想要在短时间内搭建一个网站&a…