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

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

纳于大麓徐霞客的人生境界一hr一个零零后的孩子说我现在游过的地方,比徐霞客到过的地方还多,国内各省都游遍了,日本欧美也都去过了,如果徐霞客在世,应该佩服我了吧!读万卷书,行万里路历来是中国治学修身所奉行的酒店前台上夜班工资低,为何很多人抢着做?离职前台说出原因随着社会经济快速发展,人们的生活水平也逐渐富裕起来,去旅游已经成为很普遍的现象。不管是哪里旅游,我们都需要找一个落脚点,只有休息好了第二天才足够好的精神去游玩,目前,国内的旅游方式2022年元旦假期放假高速公路免费吗2022第一个假期元旦节假日安排1月1日(周六)至3日(周一)放假共三天假期。庆幸的是这次休假不用另外安排加班了。这三天也是寒潮回转的天气可以出门旅游。假期需要注意的是高速公路不免针对元旦春节期间出游,文旅部提醒注意这两点12月29日,国务院联防联控机制召开新闻发布会,介绍科学精准做好元旦春节期间疫情防控有关情况。会上,文化和旅游部市场管理司副司长余昌国说,在此提醒广大游客两节出游一是要合理规划行程许昌有几家温泉?鄢陵花都温泉占地面积1036亩,总投资1。7亿元人民币。由许昌永达集团公司投资兴建。花都温泉是集温泉泡汤酒店餐饮商务休闲会议度假保健养生SPA水疗康体娱乐为一体的温泉文化主题酒店。波多黎各之旅(七)圣胡安老城,一个充满西班牙异域风情的古镇接上篇(点击链接波多黎各之旅(六)埃斯坎布隆沙滩,欣赏圣胡安优美的海岸线),从埃斯坎布隆沙滩(3月14日)回到酒店,简单吃了午饭,稍做休息,球妈开车,带球球球姥姥和球姥爷去游逛圣胡期待!中山公园的新景点玉兰芬香即将亮相经过微更新改造,中山公园新近打造的玉兰芬香景点即将完工亮相。原本1482平方米封闭的树坛变身赏心悦目的绿地开放空间,贯通的小路铺满了大小不一的树桩,还有精心设计的长条树凳都让往来游湖南又一小众景点走红,距离广州1。5小时高铁,像走进宫崎骏动画芒果旅行日记湖南郴州有片连绵起伏的大草原,绵延百里风景秀丽,牛羊马儿悠闲吃草,宛如一幅画卷。草原中镶嵌着一汪碧绿的湖泊,是第四纪冰川期遗留的死火山口,距今300万年,空中俯瞰像地球2021年错过的徒步计划,2022年心向往之分享新生活喜欢徒步,喜欢在户外呼吸着新鲜的空气,让一周的郁闷焦虑与劳累随风而逝。仰望蔚蓝的天空,身体也变得飘渺起来。一次次地行走在山林之中,在山林中心灵得到治愈。所以到山林中去徒步房山9大冰雪游乐场等你来体验!随着2022年北京冬奥会脚步的日益临近全国各地冰雪运动的氛围也越来越浓厚带动三亿人参与冰雪运动早已不再是口号而正走向现实在京郊房山都有哪些地方可以参与冰雪运动呢?力哥整理了一部分房北京X7极限冰雪之旅缘起长白山感受别样冰雪文化这是一个由朋友圈引发的自驾旅行,近些年北京的雪越来越少,仿佛大家对冬雪的向往也愈发的迷恋。中国最美的冬无外乎新疆内蒙古和东北。新疆的冬深邃且静谧,内蒙古的冬广袤又纯净,而长白山的冬
吉顿酒庄波伊利萨维尼一级园的自然之美吉顿酒庄(DomaineJeanGuiton)坐落在勃艮第伯恩(Beaune)产区的南部,是一座父子传承的家庭式酒庄。酒庄创始人吉恩吉顿(JeanGuiton)曾经在不同的酒庄工作河西之梦养在莫高背后的深闺西千佛洞西千佛洞的老榆树出敦煌西南行至阳关途中,道左不远有党河。河北岸为荒滩戈壁,寸草不生河南岸为金色沙山,蛇曲绵延。如果说榆林河深切出了榆林河峡谷,于是古人在其两侧峭壁上开凿了榆出去一趟,采了5种野菜过了清明滹沱河周边的土地成了素野味饕餮们喜欢光临的地方那里的野味几天时间就遍布田间地头堤坝林间,被肥沃的黄土地孕育的油光水灵,鲜美茂盛。当然,这些野味不是野生动物,现在野生动物都受西藏自驾游第1天行程甘肃庆阳成都950公里海拔1350m500m行车时间导航10小时,实际18小时朝着梦想出发6月13日这是我人生中第一次进藏,怀揣着激动与兴奋和我老婆两个人,开启了国道318川藏Z世代的2021丨打卡千万遍,只愿为快乐买单新华社北京1月3日电(记者张漫子)提起2021年的出游关键词,主题乐园稳占一席之地。高频打卡发布攻略购买衍生品,处处都有Z世代的身影。沉浸式的互动体验信念感在线的专业服务精美的主题假期新玩法!这些地方值得一逛转眼元旦小长假即将结束这个假期你去哪玩了?不想出门的小伙伴们小布为你介绍一个新玩法逛线上的数字博物馆足不出户感受独特的历史艺术文化之美以下这8个数字博物馆每一个逛起来都十分过瘾赶快新年徒步,意外收获,泰山云海仙境新年伊始,天地晴旷,欣然远足。驱车百里,至泰山北麓药乡林地。松山绵延不绝,余年陈雪尚存,风清气冽,周身为之一振。药乡距岱顶仅十六里余,卧龙池泉水亘年。泰山多草药,何首乌紫草四叶参黄冬日天坛湖引来珍贵黑天鹅冬日的天坛湖,已改往昔的绿树青草环绕,人来人往的热闹场景。现只有满目枯草黄叶在寒风中瑟瑟发抖,人迹稀少倍显荒凉,绕湖慢走越走越心凉。忽然,远处竟然有了让人意想不到的惊喜,拐角的湖泊以前理发也就38元,到了春节前居然涨到68元,这样涨价合理吗?这又是一个老调重弹的话题,每到春节前这段时间,理发价格就会随之上涨,过了春节后价格又恢复正常。在这个市场经济的大环境中,物价的涨跌也是随着大环境的变化而变化的,尤其是服务行业,比如北京冬季必玩,2022年北京大室外溜冰场2022年新年伊始,除了意味着新开始新希望,更意味着冬日限定的快乐要来啦无论是古装剧安陵容冰嬉表演的皇家冰场,还是老炮儿冯小刚同款老北京儿经典冰场,都将陆续开放啦圆明园冰雪场海淀区北京文旅全球上线兔爷新年贺卡,京味相伴2022更暖心!北京文旅全球上线兔爷新年贺卡,京味相伴2022更暖心,2022元旦春节即将到来,北京市文化和旅游局首次推出兔爷送祝福新年电子贺卡,此次活动将同步在FacebookYoutube领英