范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

20个JavaScript技术善于利用,可提升自己的开发效率

  1、Array.prototype.includes()
  includes()方法用来判断一个数组中是否包含某个指定的值,包含则返回 true,否则返回 false。
  语法
  arr.includes(findVal[, index])
  index 可选,表示从 index 索引处开始往后查找。如果为负值,表示从末尾开始往前跳 |index| 个索引,然后往后查找。默认值为0。
  let arr = ["leo", "lion", "ggj"]
  console.log(arr.includes("leo")) // true
  console.log(arr.includes("gao")) // false
  console.log(arr.includes("ggj",1)) // true
  console.log(arr.includes("Leo")) // false
  // 注意:使用includes()查找字符串是区分大小写的。
  2、幂运算符 **
  求某个数的幂,之前一般使用 Math.pow()
  console.log(Math.pow(2, 10)); // 1024
  使用幂运算符 **
  console.log(2 ** 10); // 1024
  // 注意:幂运算符的两个*号之间不能出现空格,否则语法会报错。
  3、Object.values()
  Object.values()返回一个新数组,里面的成员是传入的参数对象自身的(不含继承的)所有可遍历属性对应的值
  let obj = {
  name: "leo",
  age: 18,
  like: "music"
  };
  console.log(Object.values(obj)); // [ "leo", 18, "music" ]
  4、Object.entries()
  Object.entries()方法返回一个新数组,里面的成员是传入的参数对象自身的(不含继承的)所有可遍历属性的键值对数组
  let obj = {
  name: "leo",
  age: 18,
  like: "music"
  };
  console.log(Object.entries(obj)); // [ [ "name", "leo" ], [ "age", 18 ], [ "like", "music" ]
  扩展:Object.keys()方法返回一个新数组,里面的成员是传入的参数对象自身的(不含继承的)所有可遍历的属性
  let obj = {
  name: "leo",
  age: 18,
  like: "music"
  };
  console.log(Object.keys(obj)); // [ "name", "age", "like" ]
  // 注意:如果传入的参数是数组,则返回的是所有可遍历的索引。
  5、Object.getOwnPropertyDescriptors()
  Object.getOwnPropertyDescriptors()方法用来获取传入对象的所有自身属性的描述符
  let obj = {
  name: "leo",
  age: 18,
  like: "music"
  };
  let desc = Object.getOwnPropertyDescriptors(obj);
  console.log(desc);
  // 打印结果
  {
  name: {
  value: "leo", // value表示当前对象的默认值
  writable: true, // writable表示对象属性是否可以修改
  enumerable: true, // enumerable表示当前这个属性是否可以出现在对象的枚举属性中
  configurable: true // 表示当前对象的属性能否用delete删除
  },
  age: {
  value: 18,
  writable: true,
  enumerable: true,
  configurable: true
  },
  like: {
  value: "music",
  writable: true,
  enumerable: true,
  configurable: true
  }
  }
  我们可以使用Object.defineProperty()修改属性
  let obj = {};
  Object.defineProperty(obj, "name", {
  value: "leo",
  writable: false, // 设置为false,该属性无法修改
  configurable: false, // 设置为false,该属性不支持delete删除
  enumerable: false, // 设置为false,该属性不可被枚举
  });
  验证
  console.log(obj); // { name: "leo" }
  obj.name = "lion";
  console.log(obj); // { name: "leo" }
  delete obj.name
  console.log(obj); // { name: "leo" }
  for (let key in obj) {
  console.log(key); // ""
  }
  6、String.prototype.padStart
  把指定字符串填充到字符串头部,返回新字符串。
  语法
  str.padStart(targetLength [, padString])
  targetLength:当前字符串需要填充到的目标长度。如果这个数值小于当前字符串的长度,则返回当前字符串本身。
  padString:可选,如果字符串太长,使填充后的字符串长度超过了目标长度,则只保留最左侧的部分,其他部分会被截断。默认值为 " "。
  "abc".padStart(10); // " abc",填充默认值""
  "abc".padStart(10, "*"); // "*******abc"
  "abc".padStart(6,"123465"); // "123abc"
  "abc".padStart(1); // "abc"
  举例
  日期格式化:yyyy-mm-dd的格式
  let date = new Date();
  let year = date.getFullYear();
  // 月日如果是一位前面给它填充一个0
  let month = (date.getMonth() + 1).toString().padStart(2, "0");
  let day = (date.getDate()).toString().padStart(2, "0");
  console.log( `${year}-${month}-${day}` ); // 2022-01-09
  数字替换(手机号,银行卡号等)
  let tel = "18937640746"
  let newTel = tel.slice(-4).padStart(tel.length, "*")
  console.log(newTel) // *******0746
  7、String.prototype.padEnd
  把指定字符串填充到字符串尾部,返回新字符串。
  语法与padStart相同
  "abc".padEnd(10); // "abc ",填充默认值""
  "abc".padEnd(10, "*"); // "abc*******"
  "abc".padEnd(6, "123456"); // "abc123"
  "abc".padEnd(1); // "abc"
  7、async / await
  前面添加了async的函数在执行后都会自动返回一个Promise对象
  function fn() {
  return "leo";
  }
  console.log(fn()); // "leo"
  添加async后
  async function fn() {
  return "leo"; // Promise.resolve("leo")
  }
  console.log(fn()); // Promise对象
  async函数中使用await,那么await处的代码就会变成同步的,即只有等await后面的Promise执行完成得到结果才会继续往下执行,await意为等待
  function timeout() {
  return new Promise(resolve => {
  setTimeout(() => {
  console.log(1);
  resolve();
  }, 1000);
  })
  }
  async function fn() {
  await timeout(); // 执行完成才继续往下执行
  console.log(2);
  }
  fn(); // 不加async和await是 2、1,加了是 1、2
  注意:
  1、await 只能在 async 标记的函数内部使用,单独使用会触发 Syntax error;
  2、await后面需要跟异步操作,不然就没有意义,而且await后面的Promise对象不必写then,因为await的作用之一就是获取后面Promise对象成功状态传递出来的参数。
  更多详情请参考(具体场景)
  Js 异步请求按顺序调用解决方案(真实工作场景,axios、Promise、async await)_前端不释卷leo的博客-CSDN博客
  需求背景:现在需要调用多个异步请求,要求某个请求调用成功之后,接着调另外的请求,有时候需要用上一个请求得到的结果,作为下一个请求的参数或者条件,继续调用另一个请求。演示准备:安装axiosnpm install axios --save全局使用//main.jsimport axios from "axios"Vue.prototype.$axios = axios实现一:PromisePromise 是一个 ECMAScript 6 提供的类,目的是更加优雅地书写复.
  https://blog.csdn.net/qq_41809113/article/details/121086178?spm=1001.2014.3001.5502
  8、Rest & Spread
  spread 例子
  let text = {
  a: 1,
  b: 2,
  c: 3,
  }
  let newText = {
  ...text,
  c: 4
  }
  console.log(newText); // {a: 1, b: 2, c: 4}
  这块代码展示了 spread 语法,可以把 text 对象的数据都拓展到 newText 对象,这个功能很实用。需要注意的是,如果存在相同的属性名,后面的会把前面的覆盖。
  如果属性的值是一个对象的话,该对象的引用会被拷贝,而不是生成一个新的对象
  let obj = { x: { y: 10 } };
  let copy1 = { ...obj };
  let copy2 = { ...obj };
  obj.x.y = "leo";
  console.log(copy1, copy2); // {x: {y: "leo"}} {x: {y: "leo"}}
  console.log(copy1.x === copy2.x); // true,x为同一个引用
  rest 例子
  let text = {
  a: 1,
  b: 2,
  c: 3
  }
  let { a, ...rest } = text
  console.log(a, rest); // 1 {b: 2, c: 3}
  当对象 key-value 不确定的时候,把必选的 key 赋值给变量,用一个变量接收其他可选的 key 数据,这在之前是做不到的。注意,rest 属性必须始终出现在对象的末尾,否则将抛出错误。
  9、for await of
  异步迭代器(for-await-of):循环等待每个Promise对象变为resolved状态才进入下一步。
  for...of 是同步运行
  function TimeOut(time){
  return new Promise(function(resolve, reject) {
  setTimeout(function() {
  resolve(time);
  }, time);
  })
  }
  async function test() {
  let arr = [TimeOut(2000), TimeOut(1000), TimeOut(3000)]; // 异步迭代器
  for (let item of arr) {
  console.log(item.then(console.log));
  }
  }
  test();
  // 1000
  // 2000
  // 3000
  for of 方法不能遍历异步迭代器,得到的结果并不是我们所期待的,此时可以使用for await of
  function TimeOut(time) {
  return new Promise(function(resolve, reject) {
  setTimeout(function() {
  resolve(time);
  }, time);
  })
  }
  async function test() {
  let arr = [TimeOut(2000), TimeOut(1000), TimeOut(3000)];
  for await (let item of arr) { // 按arr中顺序执行且返回
  console.log(item);
  }
  }
  test();
  // 2000
  // 1000
  // 3000
  使用for await of,则等待每个Promise对象变为resolved状态才进入下一步,因此打印的结果为 2000,1000,3000。
  10、Promise.prototype.finally()
  Promise执行时,无论结果是fulfilled或者是rejected,在执行then()或catch()后,都会执行finally()指定的回调函数,可以避免同样的语句需要在then()和catch()中各写一次的情况
  new Promise((resolve, reject) => {
  setTimeout(() => {
  resolve("success");
  }, 1000);
  }).then(res => {
  console.log(res);
  }).catch(err => {
  console.log(err);
  }).finally(() => { // 无论Promise结果是then(),即resolve;还是catch(),即reject,最后都会执行finally()
  console.log("finally");
  })
  如每次请求发送完毕,就需要关闭loading提示框,不管请求成功或是失败,这个loading都需要关闭掉,这时把关闭loading的代码写在finally里再合适不过了。
  11、Object.fromEntries()
  Object.fromEntries() 把键值对列表转换为一个对象,此方法和Object.entries() 相对的(逆操作)
  let arr = [ ["a", 1], ["b", 2] ];
  let obj = Object.fromEntries(arr);
  console.log(obj); // {a: 1, b: 2}
  Map 转 Object
  let mapObj = new Map();
  mapObj.set("name", "leo");
  mapObj.set("age", 18);
  console.log(map); // {"name" => "leo", "age" => 18}
  let newObj = Object.fromEntries(mapObj);
  console.log(newObj); // {name: "leo", age: 18}
  12、Array.prototype.flat()
  语法
  let newArr = arr.flat([depth]); // depth可选,指提取嵌套数组的结构深度,默认值为 1。
  flat()会按照一个可指定的深度递归遍历数组,并将所有元素与遍历到的子数组中的元素合并为一个新数组返回(数组扁平化)
  let arr1 = [0, 1, 2, [3, 4]];
  console.log(arr1.flat()); // [0, 1, 2, 3, 4]
  let arr2 = [0, 1, 2, [[[3, 4]]]];
  console.log(arr2.flat(2)); // [0, 1, 2, [3, 4]]
  console.log(arr2.flat(3)); // [0, 1, 2, 3, 4]
  //使用 Infinity,可展开任意深度的嵌套数组
  let arr3 = [1, 2, [3, 4, [5, 6, [7, 8, [9, 10]]]]];
  arr3.flat(Infinity); // [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
  // flat()方法会移除数组中的空项
  let arr5 = [1, 2, , , 4, 5];
  arr5.flat(); // [1, 2, 4, 5]
  13、Array.prototype.flatMap()
  flatMap() 首先使用映射函数映射每个元素,然后将结果压缩成一个新数组。顾名思义,它包含两部分功能一个是 map,一个是 flat(深度为1)
  语法
  let newArr = arr.flatMap(function callback(currentValue[, index[, array]]) {
  // 返回新数组的元素
  }[, thisArg]);
  // currentValue,当前正在数组中处理的元素
  // index可选,数组中正在处理的当前元素的索引
  // array可选,被调用的 map 数组
  // thisArg,执行callback函数时 使用的this值
  举例
  let numbers = [1, 2, 3];
  numbers.map(x => [x * 2]); // [[2], [4], [6]]
  numbers.flatMap(x => [x * 2]); // [2, 4, 6]
  flatMap()与 map()和深度depth为1的 flat()几乎相同
  let arr = ["leo", "", "早上好"]
  arr.map(s => s.split("")); //[["l", "e", "o"],[""],["早", "上", "好"]]
  arr.flatMap(s => s.split("")); // ["l", "e", "o", "", "早", "上", "好"]
  14、String.prototype.trimStart()
  trimStart()从字符串的开头删除空格,trimLeft()是它的别名
  let str = " leo";
  console.log(str.length); // 6
  str = str.trimStart(); // 或str.trimLeft()
  console.log(str.length); // 3
  15、String.prototype.trimEnd()
  trimEnd()从一个字符串的末尾删除空格,trimRight()是它的别名
  let str = "leo ";
  console.log(str.length); // 6
  str = str.trimEnd(); // 或str.trimRight()
  console.log(str.length); // 3
  16、空值合并运算符 ??
  空值合并操作符( ?? )是一个逻辑操作符,当左侧的操作数为 null或者undefined时,返回其右侧操作数,否则返回左侧操作数
  let name = undefined ?? "leo"
  let age = null ?? 18
  console.log(name); // "leo"
  console.log(age); // 18
  与逻辑或操作符(||)不同,|| 会在左侧操作数为假值(例如 ""、0、NaN、false、undefined、null)时返回右侧操作数
  let name1 = "" ?? "leo";
  let name2 = "" || "lion";
  console.log(name1); // ""
  console.log(name2); // "lion"
  let age1 = 0 ?? 18;
  let age2 = 0 || 18;
  console.log(age1); // 0
  console.log(age2); // 18
  17、可选链 ?.
  可选链操作符 ( ?. ) 允许读取位于连接对象链深处的属性的值,而不必明确验证链中的每个引用是否有效。?. 操作符的功能类似于 . 链式操作符,不同之处在于,在引用为 null 或者 undefined 的情况下不会引起错误,该表达式短路返回值是 undefined。与函数调用一起使用时,如果给定的函数不存在,则返回 undefined。
  当尝试访问可能不存在的对象属性时,可选链操作符将会使表达式更短、更简明
  举例
  let obj = {
  message: {
  name: "leo",
  sayHi() {
  return "hi";
  }
  }
  }
  在之前的语法中,想获取到深层属性或方法,不得不做前置校验,否则很容易命中 Uncaught TypeError: Cannot read property... 这种错误,影响整个程序的运行
  let name = obj && obj.message && obj.message.name;
  console.log(name); // "leo"
  使用可选链操作符 ( ?. )
  let name = obj?.message?.name;
  console.log(name); // "leo"
  可选链中的 ? 表示如果问号左边表达式有值, 就会继续查询问号后面的字段。
  注意:可选链不能用于赋值
  let obj = {};
  obj?.message?.name = "leo"; // 报错
  18、String.prototype.matchAll()
  matchAll()返回一个包含所有匹配正则表达式的结果及分组捕获组的迭代器
  let regexp = /t(e)(st(d?))/g;
  let str = "test1test2";
  let arr = [...str.matchAll(regexp)]; // 返回所有匹配上的
  console.log(array[0]); // ["test1", "e", "st1", "1"]
  console.log(array[1]); // ["test2", "e", "st2", "2"]
  19、Promise.allSettled()
  已知Promise.all() 具有并发执行异步任务的能力。但它的最大问题就是如果其中某个任务出现异常(reject),所有任务都会挂掉,且直接进入reject 状态。
  如页面上有三个请求,分别请求不同的数据,如果使用Promise.all(),一个接口服务异常,整个都是失败的,都无法渲染出数据。
  我们想要在并发任务中,无论一个任务正常或者异常,都会返回对应的的状态,则可以使用Promise.allSettled()。
  let promise1 = () => {
  return new Promise((resolve, reject) => {
  setTimeout(() => {
  resolve("promise1");
  }, 3000);
  });
  };
  let promise2 = () => {
  return new Promise((resolve, reject) => {
  setTimeout(() => {
  resolve("promise2");
  }, 1000);
  });
  };
  let promise3 = () => {
  return new Promise((resolve, reject) => {
  setTimeout(() => {
  reject("error promise3");
  }, 2000);
  });
  };
  // 使用Promise.all,则会走到catch里面,因为promise3是reject
  Promise.all([promise1(), promise2(), promise3()])
  .then((res) => {
  console.log(res);
  })
  .catch((error) => {
  console.log("error", error); // error promise3
  });
  // 使用Promise.allSettled,不管有没有错误,三个状态都会返回,不会走到catch
  Promise.allSettled([promise1(), promise2(), promise3()])
  .then((res) => {
  console.log(res);
  // [
  // {status: "fulfilled", value: "promise1"},
  // {status: "fulfilled", value: "promise2"},
  // {status: "rejected", reason: "error promise3"}
  // ]
  })
  .catch((error) => {
  console.log("error", error);
  });
  20、String.prototype.replaceAll()
  replaceAll()返回一个新字符串,新字符串中所有满足 pattern 的部分都会被替换。pattern可以是一个字符串或一个正则表达式
  let str = "aabbcc".replaceAll("b", "*");
  console.log(str); // "aa**cc"
  使用正则表达式搜索值时,它必须是全局的
  "aabbcc".replaceAll(/b/, "*"); // 报错
  修改如下
  "aabbcc".replaceAll(/b/g, "*"); // "aa**cc"

瀚巍微电子完成PreA轮融资,发布最新款超低功耗UWB芯片澎湃财讯低功耗UWB(超宽带)芯片设计公司瀚巍微电子(MKSemi)日前宣布完成PreA轮融资,融资总额为8000多万人民币。本轮融资由光速中国和高榕资本联合领投启明创投和常春藤资诺基亚你以为它死了,其实它已重回世界第二商场如战场,可怕的不是断臂求生,而是因为没有断臂求生的魄力最后搞得满盘皆输。毕竟,只有活下去才有翻盘的机会。01hr从天之骄子到陨落6月11日,沉寂已久的诺基亚手机有了新动态诺基亚半球摄像头和枪式摄像头哪个好用?摄像头在我们生活中遍布的领域越来越多,不可否认,摄像头的发明给我们打开了新的世界。但摄像头的种类有很多,其中半球摄像头和枪式摄像头都在人们的考虑范围内,但不知道这两个该怎么选。接下华为Mate50曝光,四大升级点,再一次证明了自己华为P50Pro和华为P50Pocket这两款华为高端旗舰全球版正式在海外市场推出,售价依旧比国行版贵了不少。既然华为连海外市场都没有放弃,还成功新增一款P50Pocket,那想必都2022了魅蓝10屏幕分辨率720P。。居然还有4G内存版本都2022了魅蓝10屏幕分辨率720P。。居然还有4G内存版本。这魅族根本没有想要大卖,还有人要吗。魅蓝10发布价格464GB版本699元4128GB版本799元6128GB版本8安卓换苹果13体验优点1续航勉强够用,正常微信头条可以亮屏6小时,原装快充充满电一个半小时左右2声音和震感体验非常满意33D结构光屏幕解锁和付款非常好用,不用担心夜晚解锁被屏幕亮度刺到4直屏手机里目画面更清晰屏幕更大?多家巨头CES展推电视新品西班牙世界报网站近日报道称,尽管疫情仍未消散,导致今年的CES参展商和公众人数减少,活动也减少,但其魅力不减。2022年,重大的技术进步不仅会转化为更好的电视画面质量,还会转化为更智能马桶究竟值不值得入手?我体验了三个月,谈谈客观的感受近期装修房子的小伙伴想必都有看过很多装修建议,让大家在装修卫生间的时候,别忘了在马桶旁边留个插座,方便后期使用智能马桶。事实上,伴随着科技的进步以及人们生活水平的改善,很多智能家居vivoX30Pro一加10Pro参数报价对比vivoX30Pro手机机型vivoX30Pro一加10Pro最新价格4298元4699元屏幕尺寸6。44英寸6。7英寸屏幕类型SuperAMOLED柔性AMOLED分辨率2400最低2999元,最高10999元,骁龙8Gen1手机怎么选?国内不少手机厂商已经推出了基于骁龙8Gen1平台的智能手机,其中价格最低的是motoedgeX30,该机的起售价仅为2999元,价格最高的则是荣耀MagicV,该机的顶配版价格达到净水器究竟该如何选购最近在抖音上看到了很多视频,说的几乎都是安装净水器就是交智商税等等。其实还是应该辨证地来看待选购净水器的问题,具体问题具体分析第一,我们首先要清晰地了解我们对水质到底有什么样的要求
焕新纪,创未来!AtomSTEM品牌升级为原子同学随着人工智能的快速发展,世界各国越来越重视对科技创新型人才的培养。近年来,教育部颁布的一系列政策明确指向应逐步开展全民智能教育,推广并设置人工智能相关课程。编程机器人课程教育的重要轩逸发生事故后安全气囊未弹出,4S店没撞对位置,下次注意当下,随着汽车行业的加速发展,汽车安全备受大家关注。因此,汽车厂商在打造汽车产品的过程中,车辆上的安全配置也越来越先进以及全面。作为保命的安全配置之一,安全气囊的出场频率虽然远远比不算评测的一加9PRO影像体验,手机旅拍短片视频加载中评测是门手艺,吐槽需要勇气,大家好,这里是超级测。我一个喜欢抓拍的黄昏收集者,短片中的所有画面都是我用一加9PRO手持拍摄的,没有经过任何调色后期。今天我想借此机会跟各位旗捷支招打印文件不用愁,手机全搞定在互联网技术高度发达的今天,移动技术也在逐渐改变我们的生活。随着智能手机的普及,越来越多产品都离不开手机软件的支持。打印设备作为日常办公中必不可少的设备之一,也逐渐向用户推出手机打旗捷支招如何识别惠普打印机的生产日期长时间以来,惠普打印机通过一系列悄无声息的后台操作对通用耗材进行打印机升级。例如WiFi推送,电脑驱动更新等。针对此类情况,旗捷也给大家提供如何关闭打印机固件升级的4种方式,可以通抓住金九银十的尾巴,十月最后一周上市新车都有哪些看点来到了10月最后一周,虽然上市新车不多,但是每一款都可谓具有潜力的爆款。今年车市的金九银十预冷下,相信不少车企都希望在广州车展上发布自己的重磅车型,冲击第四季度销量。但在车展前夕上编程教育不能停,选对平台是关键据中国网未来网报道,Scratch平台开放的海外社区论坛上有部分国外用户上传大量辱华造谣中国的内容,其中还充斥着一些宣传邪教借中美贸易摩擦抹黑中方的言论等。青少年学习平台应该严格规旗捷支招如何关闭打印机固件自动更新?分分钟搞定一直以来,惠普通过不同的方式针对通用耗材进行打印机升级,其中,尤其是通过固件升级的方式,随时随地影响着使用通用耗材的用户。今年5月份以来,惠普已经连续多次进行了打印机固件升级,通过试驾新款雅阁配置加量不加价,凯美瑞天籁只能争第二?在几个月前,打开广汽本田雅阁的车型页面,2018款这几个字分外扎眼。随后看到中期改款雅阁的申报图后,心中更是没有一丝波澜,心道就这?但当看到2021款雅阁实车之后,再次撩起了在20如何查看兄弟彩色硒鼓产品耗材编码随着数字化办公的兴起,打印机在人们的工作与生活中扮演的角色越来越重要,目前市面上的主流办公打印机都属于激光打印,而硒鼓是激光打印里最重要的一个部件,打印质量的好坏很大程度都由硒鼓来科创教育品牌阿童木创想家正式升级为原子同学AtomSTEM编程与机器人课程教育的重要性不言而喻,拥有专业科技特长的孩子将更具备升学竞争力。在实际普及率仍旧不高的国内,少儿编程机器人领域的教育市场仍旧是一片蓝海。在过去多年发展中,原子同学A