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

23个超实用JS技巧

  23 个超实用 JS 技巧
  带有多个条件的 if 语句
  把多个值放在一个数组中,然后调用数组的 includes 方法。
  // bad
  if (x === "abc" || x === "def" || x === "ghi" || x === "jkl") {
  //logic
  }
  // better
  if (["abc", "def", "ghi", "jkl"].includes(x)) {
  //logic
  }
  使用条件表达式简化 if true...else
  // bad
  let test: boolean;
  if (x > 100) {
  test = true;
  } else {
  test = false;
  }
  // better
  let test = x > 10 ? true : false;
  //或者这样
  let test = x > 10;
  console.log(test);
  假值(undefined、null、0、false、NaN、空字符串)检查
  当我们创建了新变量,有时候想要检查引用的变量是不是null 或 undefined或空字符串 等假值。JavaScript 确实有一个很好的快捷方式来实现这种检查-逻辑或操作符(||)
  ||会在左侧操作数为假值时返回右侧操作数
  只有当左侧为:空字符串: ""或``NaN0nullundefinedfalse
  逻辑或操作符(||) 会返回有右侧的值
  // bad
  if (test1 !== null || test1 !== undefined || test1 !== "") {
  let test2 = test1;
  }
  // better
  let test2 = test1 || "";
  // bad
  if (test1 === true) or if (test1 !== "") or if (test1 !== null)
  // better
  if (test1){
  // do some
  }else{
  // do other
  }
  注意:如果 test1 有值,将执行 if 之后的逻辑,这个操作符主要用于 null,undefinded,空字符串 检查。使用空值合并操作符-??
  只有当左侧为nullundefined
  空值合并操作符(??) 会返回右侧的值
  const baz = 0 ?? 42;
  console.log(baz);
  // expected output: 0
  注意:与逻辑或操作符(||)不同,||会在左侧操作数为假值时返回右侧操作数
  只有当左侧为:空字符串: ""或``NaN0nullundefined
  逻辑或操作符(||) 会返回有右侧的值
  var a = "" || 1;
  // 输出 1
  console.log(a);
  null 检查和默认赋值
  let test1 = null;
  let test2 = test1 ?? "";
  console.log("null check", test2); // 输出空字符串 ""
  undefined 检查和默认赋值
  const test = undefined ?? "default";
  console.log(test);
  // expected output: "default"
  比较后返回
  // bad
  let test;
  function checkReturn() {
  if (!(test === undefined)) {
  return test;
  } else {
  return callMe("test");
  }
  }
  // better
  function checkReturn() {
  return test ?? callMe("test");
  }
  使用可选链操作符-?.
  ?. 也叫链判断运算符。它允许开发人员读取深度嵌套在对象链中的属性值,而不必验证每个引用。当引用为空时,表达式停止计算并返回 undefined
  const travelPlans = {
  destination: "DC",
  monday: {
  location: "National Mall",
  budget: 200,
  },
  };
  // bad
  const res =
  travelPlans &&
  travelPlans.tuesday &&
  travelPlans.tuesday.location &&
  travelPlans.tuesday.location.href;
  // better
  // 输出 undefined
  const res1 = travelPlans?.tuesday?.location?.href;
  用于多个条件判断的 && 操作符
  如果只在变量为 true 时才调用函数,可以使用 && 操作符。
  // bad
  if (test1) {
  callMethod();
  }
  // better
  test1 && callMethod();
  当你在 React 中想要有条件地渲染某个组件时,这个与 (&&)短路写法比较有用。例如:
  {this.state.isLoading && }
  switch 简化
  我们可以将条件保存在键值对象中,并根据条件来调用它们。
  // bad
  switch (data) {
  case 1:
  test1();
  break;
  case 2:
  test2();
  break;
  case 3:
  test();
  break;
  // And so on...
  }
  // better
  var data = {
  1: test1,
  2: test2,
  3: test,
  };
  // 如果type 在 data中存在, 则执行对应的函数
  data[type] && data[type]();
  默认参数值
  // bad
  function add(test1, test2) {
  if (test1 === undefined) test1 = 1;
  if (test2 === undefined) test2 = 2;
  return test1 + test2;
  }
  // better
  add = (test1 = 1, test2 = 2) => test1 + test2;
  add(); //output: 3
  条件查找简化
  如果我们要基于不同的类型调用不同的方法,可以使用多个 else if 语句或 switch,但有没有比这更好的简化技巧呢?其实是前面的 switch 简化方式一样!
  // bad
  if (type === "test1") {
  test1();
  } else if (type === "test2") {
  test2();
  } else if (type === "test3") {
  test3();
  } else if (type === "test4") {
  test4();
  } else {
  throw new Error("Invalid value " + type);
  }
  // better
  var types = {
  test1,
  test2,
  test3,
  test4,
  };
  types[type] && types[type]();
  对象属性赋值
  let test1 = "a";
  let test2 = "b";
  // bad
  let obj = { test1: test1, test2: test2 };
  // better
  let obj = { test1, test2 };
  解构赋值
  // bad
  const test1 = this.data.test1;
  const test2 = this.data.test2;
  const test2 = this.data.test3;
  // better
  const { test1, test2, test3 } = this.data;
  模板字符串
  如果你厌倦了使用 + 将多个变量连接成一个字符串,那么这个简化技巧将让你不再头痛。
  // bad
  const welcome = "Hi " + test1 + " " + test2 + ".";
  // better
  const welcome = `Hi ${test1} ${test2}`;
  跨行字符串
  // bad
  const data =
  "abc abc abc abc abc abc 	" + "test test,test test test test 	";
  // better
  const data = `abc abc abc abc abc abc
  test test,test test test test`;
  indexOf 的按位操作简化
  在查找数组的某个值时,我们可以使用 indexOf() 方法。但有一种更好的方法,让我们来看一下这个例子。
  // bad
  if (arr.indexOf(item) > -1) {
  // item found
  }
  if (arr.indexOf(item) === -1) {
  // item not found
  }
  // better
  if (~arr.indexOf(item)) {
  // item found
  }
  if (!~arr.indexOf(item)) {
  // item not found
  }
  按位 (~) 运算符将返回 true(-1 除外),反向操作只需要!~。另外,也可以使用 includes() 函数。
  if (arr.includes(item)) {
  // true if the item found
  }
  字符串转成数字
  有一些内置的方法,例如 parseInt 和 parseFloat 可以用来将字符串转为数字。我们还可以简单地在字符串前提供一个一元运算符 (+) 来实现这一点。
  // bad
  let total = parseInt("453");
  let average = parseFloat("42.6");
  // better
  let total = +"453";
  let average = +"42.6";
  顺序执行 promise
  如果你有一堆异步或普通函数都返回 promise,要求你一个接一个地执行,怎么办?
  async function getData() {
  const promises = [fetch("url1"), fetch("url2"), fetch("url3"), fetch("url4")];
  for (const item of promises) {
  // 打印出promise
  console.log(item);
  }
  // better
  for await (const item of promises) {
  // 打印出请求的结果
  console.log(item);
  }
  }
  等待所有 promise 完成
  Promise.allSettled()方法接受一组 Promise 实例作为参数,包装成一个新的 Promise 实例。只有等到所有这些参数实例都返回结果,不管是 fulfilled 还是 rejected,包装实例才会结束
  有时候,我们不关心异步请求的结果,只关心所有的请求有没有结束。这时,Promise.allSettled()方法就很有用
  const promises = [fetch("index.html"), fetch("https://does-not-exist/")];
  const results = await Promise.allSettled(promises);
  // 过滤出成功的请求
  const successfulPromises = results.filter((p) => p.status === "fulfilled");
  // 过滤出失败的请求,并输出原因
  const errors = results
  .filter((p) => p.status === "rejected")
  .map((p) => p.reason);
  交换数组元素的位置
  // bad
  const swapWay = (arr, i, j) => {
  const newArr = [...arr];
  let temp = newArr[i];
  newArr[i] = list[j];
  newArr[j] = temp;
  return newArr;
  };
  ES6 开始,从数组中的不同位置交换值变得容易多了
  // better
  const swapWay = (arr, i, j) => {
  const newArr = [...arr];
  const [newArr[j],newArr[i]] = [newArr[i],newArr[j]];
  return newArr;
  };
  使用变量作为对象键
  当你有一个字符串变量,并想将其用作对象中的键以设置一个值时可以用它
  let property = "a";
  const obj = {
  b: "b",
  };
  property = "name";
  obj[property] = "这是A";
  // {b: "b", name: "这是A"}
  console.log(obj);
  带有范围的随机数生成器
  有时你需要生成随机数,但希望这些数字在一定范围内,那就可以用这个工具。
  function randomNumber(max = 1, min = 0) {
  if (min >= max) {
  return max;
  }
  return Math.floor(Math.random() * (max - min) + min);
  }
  生成随机颜色
  function getRandomColor() {
  const colorAngle = Math.floor(Math.random() * 360);
  return `hsla(${colorAngle},100%,50%,1)`;
  }
  获取列表最后一项
  其他语言里这个功能被做成了可以在数组上调用的方法或函数,但在 JavaScript 里面,你得自己做点工作。
  let array = [0, 1, 2, 3, 4, 5, 6, 7];
  console.log(array.slice(-1)) >>> [7];
  console.log(array.slice(-2)) >>> [6, 7];
  console.log(array.slice(-3)) >>> [5, 6, 7];
  function lastItem(list) {
  if (Array.isArray(list)) {
  return list.slice(-1)[0];
  }
  if (list instanceof Set) {
  return Array.from(list).slice(-1)[0];
  }
  if (list instanceof Map) {
  return Array.from(list.values()).slice(-1)[0];
  }
  }
  图片懒加载
  在懒加载的实现中,有两个关键的数值:一个是当前可视区域的高度,另一个是元素距离可视区域顶部的高度。
  当前可视区域的高度, 在和现代浏览器及 IE9 以上的浏览器中,可以用 window.innerHeight 属性获取。在低版本 IE 的标准模式中,可以用 document.documentElement.clientHeight 获取,这里我们兼容两种情况:
  const viewHeight = window.innerHeight || document.documentElement.clientHeight;
  而元素距离可视区域顶部的高度,我们这里选用 getBoundingClientRect() 方法来获取返回元素的大小及其相对于视口的位置。对此 MDN 给出了非常清晰的解释:
  该方法的返回值是一个 DOMRect 对象,这个对象是由该元素的 getClientRects() 方法返回的一组矩形的集合, 即:是与该元素相关的 CSS 边框集合 。
  DOMRect 对象包含了一组用于描述边框的只读属性——left、top、right 和 bottom,单位为像素。除了 width 和 height 外的属性都是相对于视口的左上角位置而言的。
  Lazy-Load
  // 注意我们并没有为它引入真实的src
  图片预加载
  class PreLoadImage {
  constructor(imgNode) {
  // 获取真实的DOM节点
  this.imgNode = imgNode;
  }
  // 操作img节点的src属性
  setSrc(imgUrl) {
  this.imgNode.src = imgUrl;
  }
  }
  class ProxyImage {
  // 占位图的url地址
  static LOADING_URL = "xxxxxx";
  constructor(targetImage) {
  // 目标Image,即PreLoadImage实例
  this.targetImage = targetImage;
  }
  // 该方法主要操作虚拟Image,完成加载
  setSrc(targetUrl) {
  // 真实img节点初始化时展示的是一个占位图
  this.targetImage.setSrc(ProxyImage.LOADING_URL);
  // 创建一个帮我们加载图片的虚拟Image实例
  const virtualImage = new Image();
  // 监听目标图片加载的情况,完成时再将DOM上的真实img节点的src属性设置为目标图片的url
  virtualImage.onload = () => {
  this.targetImage.setSrc(targetUrl);
  };
  // 设置src属性,虚拟Image实例开始加载图片
  virtualImage.src = targetUrl;
  }
  }
  ProxyImage 帮我们调度了预加载相关的工作,我们可以通过 ProxyImage 这个代理,实现对真实 img 节点的间接访问,并得到我们想要的效果。
  https://www.ixiera.com

50个发圈必备语录1。那些将要去的地方,都是从未谋面的故乡。2。别说岁月漫长,长不过沿途的山脉,长不过彻窗外的阳光,长不过光线突然暗下来的隧道,更长不过下一个远方。3。背包相机目的地,下一站不告诉你多地推门票优惠现在守住基本盘,铸成将来好的口碑丨快评新冠疫情发生以来,已经有不少省份景区推出了类似的优惠政策。图为在青岛小鱼山公园俯瞰的景色。(小尘4x图)2022年五一小长假已经结束。据文化和旅游部发布的数据,5天假期,全国国内旅25天6000公里自驾皖闽赣,两对60多岁老夫妇的春游行摄日记(上)阳春三月,北方还是万木萧瑟,咋暖还寒,而南方已经开始莺飞草长,满目花海了。在这充满希望的季节里,笔者夫妇与另一对同样喜欢摄影的好友夫妇相约,要出去走走,看看春天里的南国花海青山碧水国内一生必去的5个景区,去过3个算及格,4个算优秀古人语读万卷书,不如行万里路。最美的风景总是在路上,我们国家是一个地大物博的古老文明古国,处处都是美景,从东北地区的雪山风光到海南三亚的热带浪漫海滩风情,从内内蒙古一望无际的大草原想去大草原,有推荐的地方吗?谢邀!又到了草长莺飞的季节,很多人对去欣赏天高云阔的草原风光大概又蠢蠢欲动了。哪里的草原最好玩最有意思呢?说起我国最著名的草原,有四处,分别是内蒙古呼伦贝尔大草原草原新疆伊犁那拉提我国西部最重要的国防公路G219,全长10065公里这是一条中国最长的公路从起点到终点从我国大西北到西南边境口岸从海拔5347到海拔14从喀纳斯延边境到东兴从内陆到海洋这就是新G21910065km超长的219国道G219喀纳斯东兴苏州五个不要门票的景区比收费的景区还好玩一平江路说起来平江路应该是我带了很多朋友游玩完苏州之后,评价很高的一条古街。从时间上讲,平江路应该是苏州历史最悠久的古街。这个一个时候放慢脚步去逛的街,要说有什么好玩的也没什么好玩我国首个被撤销的省,只存在了3年,网友很想去旅游看看我们国家如今有34个省市自治区,发展的也是比较迅速的,但是在建国初年,我们国家的省市自治区的划分不是这样的。那时间我们国家有众多的直辖市,省份上来说也有几个如今已经被取消的省份。而带你走进帕劳深不见底的海世界帕劳世界级的浮潜景点大断层(bigdropoff),被列为世界七大海洋奇迹之一。帕劳海水共有7种不同的颜色,是著名的潜水圣地,以海底景观闻名于世。帕劳作为一个原始小岛国,然其陆地面侃侃旅行世界之我的东北往事作者简介李游侠侃侃旅行世界之关于旅行的一切,15年旅行经历,深度走完中国346座地级市(含港澳台)及1000多个县市,通过真实行走经历,专注旅行文化的写作探讨与传播。瓜瓜说大伯,你初夏,个旧大屯予你一场浪漫相遇,一段慢时光赏过了梨花樱花茶花五月的个旧,依旧妩媚如今大屯街道的蓝花楹进入花期绽放于枝头道路两旁蓝紫色的花影已悄然蔓延而这场花海带来的浪漫远远不止于此星星点点的花朵点缀在绿荫之中既有含苞待放的
罗嘉良老婆晒照,对镜洗头不在意素颜皮肤嫩,老公不在家独享生活近日,罗嘉良老婆苏岩在社交平台晒出一段日常视频,素颜出镜超接地气。苏岩身穿亚麻睡衣,身形纤瘦高挑,看上去十分显嫩。她的皮肤很白嫩,脸上几乎没有皱纹,颜值还是非常在线,完全看不出已经高圆圆维权胜诉!肖像被婚礼公司侵权放网上,最后还获2万赔偿金10月19日,有媒体报道称高圆圆维权婚礼肖像权二审胜诉,还获得2万元赔偿金,她维权成功的事,引起了网友们的关注。从法院的判决书可以得知,杭州某公司在未经高圆圆许可的情况下,擅自使用演员黄志忠发文谈角色,致敬缅怀袁隆平,称能饰演袁老无比光荣10月19日,演员黄志忠在社交平台发长文谈新角色,言辞真切让人动容。文章中,黄志忠表示自己在拿到功勋之袁隆平篇的剧本,知道将要饰演袁隆平老先生的时候压力非常大。他此前对于袁老的印象50岁李亚鹏带女友送家人,女生主动拿包表现殷勤,和李嫣好似姐妹10月20日,李亚鹏一家送李嫣去机场的近照在网上曝光。当天李亚鹏带着妈妈和女友一起去送李嫣。到达机场后,驾驶座的李亚鹏率先下车。他打扮朴素低调,简单的绿色T恤搭配牛仔裤,没有戴帽子周星驰干女儿徐娇晒近照,穿宽松卫衣玩下衣失踪,开网店吸金无数10月20日,童星出身的徐娇在社交平台上晒出一组楼梯大片,她当天穿着新衣服大秀美腿,好身材十分吸睛。24岁的她五官精致甜美,纯天然的大眼睛尖下巴清纯可爱,依然能看出小时候的模样,只翁虹干女儿宣布闪婚!晒婚纱照前男友送祝福,曾恋上大19岁已婚男10月20日,翁虹的干女儿戴梦梦在社交平台晒出婚纱照宣布闪婚。戴梦梦身穿白色蕾丝鱼尾婚纱,身材窈窕纤瘦,脸上的笑容十分甜美。她与老公亲密相拥,在一片麦田之中拍摄了婚纱照。男方高大帅甜蜜!41岁杜淳自曝将为王灿补办婚礼,透露婚纱由7万颗水晶制成10月20日,杜淳和妻子王灿在参加活动时接受采访的视频在网上曝光,杜淳透露即将和王灿补办婚礼,让许多网友都十分期待。当天他们夫妻俩穿着情侣装,杜淳身穿黑色皮革外套霸气侧漏,41岁皮张丹峰与洪欣轮流带娃?与女儿在街上跳舞,7岁女儿神似他10月20日,张丹峰在社交平台上社交媒体上发布了一条和女儿一起跳舞的视频,父女俩私下关系很亲密,感情也非常好。张丹峰当天穿着紫色的卫衣,搭配黑色帽子,打扮得很显年轻。7岁的女儿张晞42岁秦岚生图曝光,穿超短裤秀超长美腿,好身材却被拍成五五分?10月19日,女星秦岚现身了秋交会,并上台进行了新剧宣传。秦岚在秋交会上的生图曝光,她穿着一套大地色的西装十分时髦,超短裤的设计秀出了超长美腿,玩起了下衣失踪,显得又细又直的大长腿天王嫂方媛晒近况,素颜出镜露女儿侧脸,孩子长相超像郭富城近日,郭富城的妻子方媛在社交平台更新动态。她怀中抱着女儿拍视频,还亲昵地亲吻女儿头顶,气氛十分温馨。天王嫂方媛素颜出镜,穿着普通的家居服十分接地气,身后的装修也比较普通,贴着各种卡军嫂张馨予好硬气!机场不让男生插队被骂脑子有病,当场直接反驳10月20日,女星张馨予在社交平台更新动态,发文讲述了自己的经历。张馨予透露自己在机场柜台购物时,结账结到一半,却被一位男生插队要求先结,理由是急着赶飞机。张馨予也同样要赶飞机,所