当前位置: 首页 > wzjs >正文

主流的网站开发技术有长沙市seo百度关键词

主流的网站开发技术有,长沙市seo百度关键词,北京好网站制作公司哪家好,做网站代下JS 进阶(part3) 深浅拷贝 只针对引用类型 浅拷贝 浅拷贝只拷贝外面一层的属性, 如果对象里面还有对象, 那么这个对象的引用会被拷贝过去, 所以修改其中一个属性会影响到另一个对象 const obj {name: "zhangsan",age: 18,child: {name: "xiaoming",ag…

JS 进阶(part3)

深浅拷贝

  • 只针对引用类型

浅拷贝

  • 浅拷贝只拷贝外面一层的属性, 如果对象里面还有对象, 那么这个对象的引用会被拷贝过去, 所以修改其中一个属性会影响到另一个对象
const obj = {name: "zhangsan",age: 18,child: {name: "xiaoming",age: 10,},
};const obj2 = { ...obj };
console.log(obj2); // {name: "zhangsan", age: 18, child: {name: "xiaoming", age: 10}}obj2.name = "lisi";
obj2.child.age = 12;
console.log(obj); // {name: "zhangsan", age: 18, child: {name: "xiaoming", age: 12}}const obj3 = {};
Object.assign(obj3, obj);
console.log(obj3); // {name: "zhangsan", age: 18, child: {name: "xiaoming", age: 10}}obj3.name = "wangwu";
obj3.child.age = 15;
console.log(obj); // {name: "zhangsan", age: 18, child: {name: "xiaoming", age: 15}}

深拷贝

  • 拷贝的是对象, 即拷贝的是对象本身, 内部的属性也会被拷贝, 所以修改其中一个属性不会影响到另一个对象

  • 常用方法:

    1. 通过递归实现深拷贝: 递归遍历对象的所有属性, 如果属性是对象, 则递归调用深拷贝函数, 否则直接赋值;

    2. 通过 JSON.parse(JSON.stringify())实现深拷贝: 先将对象序列化成 JSON 字符串, 再将 JSON 字符串反序列化成对象, 这样就实现了深拷贝;

    3. 通过 lodash.cloneDeep()实现深拷贝: 这个方法内部也是通过 JSON.parse(JSON.stringify())实现的;

递归实现深拷贝
function deepClone(newObj, oldObj) {for (let key in oldObj) {if (oldObj[key] instanceof Array) {// 如果属性是数组, 则递归调用深拷贝函数newObj[key] = [];deepClone(newObj[key], oldObj[key]);} else if (oldObj[key] instanceof Object) {// 如果属性是对象, 则递归调用深拷贝函数newObj[key] = {};deepClone(newObj[key], oldObj[key]);} else {// 如果属性是基本类型, 则直接赋值newObj[key] = oldObj[key];}}
}// 先判断数组, 再判断对象, 最后判断基本类型
JSON.parse(JSON.stringify())实现深拷贝
const obj = {name: "zhangsan",age: 18,child: {name: "xiaoming",age: 10,},
};const obj2 = JSON.parse(JSON.stringify(obj));
console.log(obj2); // {name: "zhangsan", age: 18, child: {name: "xiaoming", age: 10}}obj2.name = "lisi";
obj2.child.age = 12;
console.log(obj); // {name: "zhangsan", age: 18, child: {name: "xiaoming", age: 10}}
lodash.cloneDeep()实现深拷贝
const obj = {name: "zhangsan",age: 18,child: {name: "xiaoming",age: 10,},
};const obj2 = _.cloneDeep(obj);
console.log(obj2); // {name: "zhangsan", age: 18, child: {name: "xiaoming", age: 10}}obj2.name = "lisi";
obj2.child.age = 12;
console.log(obj); // {name: "zhangsan", age: 18, child: {name: "xiaoming", age: 10}}

异常处理

throw 关键字

  • throw 关键字用于抛出一个异常, 并将其传递到调用者, 调用者可以选择捕获这个异常并处理, 也可以继续抛出这个异常, 直到被捕获为止
function add(a, b) {if (typeof a !== "number" || typeof b !== "number") {throw new Error("参数必须是数字");}return a + b;
}

try…catch 语句

  • try…catch 语句用于捕获异常, 如果 try 代码块中的代码抛出了异常, 则 catch 代码块中的代码将被执行, 并将异常对象作为参数传入
try {add(1, 2);
} catch (error) {console.log(error); // Error: 参数必须是数字
} finally {console.log("finally");
} // 一定会执行的代码

自定义异常

  • 自定义异常需要继承 Error 类, 并实现构造函数, 并将错误信息作为参数传入
class MyError extends Error {constructor(message) {super(message);this.name = "MyError";}
}try {throw new MyError("自定义异常");
} catch (error) {console.log(error); // MyError: 自定义异常
}

this 关键字

  • this 关键字在函数执行的时候, 绑定的是函数执行时所在的作用域, 而不是函数定义时所在的作用域, 谁调用函数, this 就指向谁

  • 在全局作用域中, this 指向 window

  • 在函数中, this 指向调用函数的对象

  • 在方法中, this 指向调用方法的对象

  • 在构造函数中, this 指向新创建的对象

  • 在箭头函数中, this 指向定义箭头函数时所在的作用域

  • 在事件处理函数中, this 指向绑定事件的对象

  • 在 setTimeout、setInterval 中, this 指向全局对象 window

  • 在 Promise 中, this 指向 undefined

  • 在 class 中, this 指向实例对象

  • 在模块中, this 指向模块对象

  • 在自定义对象中, this 指向自定义对象本身

改变 this 指向

  • 在函数中, 可以使用 apply、call、bind 方法改变 this 指向

  • apply、call、bind 方法的第一个参数是 this 要指向的对象, 第二个参数是函数参数数组

function add(a, b) {return a + b;
}const obj = {name: "zhangsan",age: 18,
};const result1 = add.apply(obj, [1, 2]); // this 指向 obj, 参数为 [1, 2]
const result2 = add.call(obj, 1, 2); // this 指向 obj, 参数为 1, 2
const result3 = add.bind(obj)(1, 2); // this 指向 obj, 参数为 1, 2

防抖

  • 单位时间内, 频繁触发事件, 但是只执行(最后一次)一次, 防止函数被频繁调用

通过 _.debounce 实现防抖

const box = document.getElementById("box");
box.addEventListener("mousemove",_.debounce(() => {console.log("mousemove");}, 1000)
); // 1000 毫秒内只执行一次

通过 setTimeout 实现防抖

function debounce(func, wait) {let timeout;return function () {if (timeout) clearTimeout(timeout);timeout = setTimeout(() => {func.apply(this, arguments);}, wait);};
}const box = document.getElementById("box");
box.addEventListener("mousemove",debounce(() => {console.log("mousemove");}, 1000)
); // 1000 毫秒内只执行一次

节流

  • 单位时间内, 频繁触发事件, 但是只执行(等待第一次实现完成)一次, 防止函数被频繁调用

通过 _.throttle 实现节流

const box = document.getElementById("box");
box.addEventListener("mousemove",_.throttle(() => {console.log("mousemove");}, 1000)
); // 1000 毫秒内只执行一次

通过 setInterval 实现节流

function throttle(func, wait) {let timeout;return function () {if (!timeout) {timeout = setTimeout(() => {timeout = null;func.apply(this, arguments);}, wait);}};
}const box = document.getElementById("box");
box.addEventListener("mousemove",throttle(() => {console.log("mousemove");}, 1000)
); // 1000 毫秒内只执行一次

记录视频播放进度

const video = document.getElementById("video");video.ontimeupdate = _.throttle(() => {localStorage.setItem("videoProgress", video.currentTime);
}, 1000);video.onloadedmetadata = () => {video.currentTime = localStorage.getItem("videoProgress") || 0;
};
http://www.dtcms.com/wzjs/115867.html

相关文章:

  • 搜狗搜索引擎入口武汉seo网站推广
  • 深圳制作网站推荐亚马逊开店流程及费用
  • 公司建网站搭建服务器优化手机流畅度的软件
  • 网易那个自己做游戏的网站是什么百度热门排行榜
  • 做日语网站活动推广方案
  • 做网站阿里云买哪个服务器好点百度推广做二级域名
  • 菠菜网站怎么做排名泰安网站seo
  • 网站制作成品免费ui设计公司
  • 化妆品购物网站排名竞价排名是什么
  • 哪个网站的品牌特卖做的好外贸平台排行榜前十名
  • 南昌自助建站模板海门网站建设
  • 网站的ico图标做多大2345纯净版推广包
  • 百度免费网站如何建设成都电脑培训班零基础
  • 一个服务器多个网站好吗国内的搜索引擎排名
  • 网站定做一份完整的电商运营方案
  • 产品营销型网站建设郑州seo服务公司
  • 建设网站前的市场分析包括哪些内容网页制作html代码
  • 用什么网站做封面最好天津优化网络公司的建议
  • 凡科网做的网站在百度上能找到吗百度快照推广一年要多少钱
  • 做网站怎么给客户打电话湖北疫情最新消息
  • 国内做外单的网站有哪些网络推广费用预算表
  • 哪些网站是用asp.net开发的口碑营销的前提及好处有哪些
  • 云南网站建设公司前十名百度seo报价
  • 金融网站建设方案网站模板及源码
  • 做我女朋友网站p0rn视频杭州疫情最新消息
  • 做门户网站公司最新nba排名
  • 网站怎样设计网页网络营销是什么
  • 惠州高端网站建设服务南宁seo排名优化
  • 网站前台页面的设计与实现外贸网站外链平台
  • 网站去公安局备案流程深圳市企业网站seo营销工具