记录--你的代码不堪一击!太烂了!

这篇具有很好参考价值的文章主要介绍了记录--你的代码不堪一击!太烂了!。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助

记录--你的代码不堪一击!太烂了!

前言

小王,你的页面白屏了,赶快修复一下。小王排查后发现是服务端传回来的数据格式不对导致,无数据时传回来不是 [] 而是 null, 从而导致 forEach 方法报错导致白屏,于是告诉测试,这是服务端的错误导致,要让服务端来修改,结果测试来了一句:“服务端返回数据格式错误也不能白屏!!” “好吧,千错万错都是前端的错。” 小王抱怨着把白屏修复了。

刚过不久,老李喊道:“小王,你的组件又渲染不出来了。” 小王不耐烦地过来去看了一下,“你这个属性data 格式不对,要数组,你传个对象干嘛呢。”老李反驳: “ 就算 data 格式传错,也不应该整个组件渲染不出来,至少展示暂无数据吧!” “行,你说什么就是什么吧。” 小王又抱怨着把问题修复了。

类似场景,小王时不时都要经历一次,久而久之,大家都觉得小王的技术太菜了。小王听到后,倍感委屈:“这都是别人的错误,反倒成为我的错了!”

等到小王离职后,我去看了一下他的代码,的确够烂的,不堪一击!太烂了!下面来吐槽一下。

一、变量解构一解就报错

优化前

const App = (props) => {
  const { data } = props;
  const { name, age } = data
}

如果你觉得以上代码没问题,我只能说你对你变量的解构赋值掌握的不扎实。

解构赋值的规则是,只要等号右边的值不是对象或数组,就先将其转为对象。由于 undefinednull 无法转为对象,所以对它们进行解构赋值时都会报错。

所以当 dataundefinednull 时候,上述代码就会报错。

优化后

const App = (props) => {
  const { data } = props || {};
  const { name, age } = data || {};
}

二、不靠谱的默认值

估计有些同学,看到上小节的代码,感觉还可以再优化一下。

再优化一下:

const App = (props = {}) => {
  const { data = {} } = props;
  const { name, age } = data ;
}

我看了摇摇头,只能说你对ES6默认值的掌握不扎实。

ES6 内部使用严格相等运算符(===)判断一个变量是否有值。所以,如果一个对象的属性值不严格等于 undefined ,默认值是不会生效的。

所以当 props.datanull,那么 const { name, age } = null 就会报错!

三、数组的方法只能用真数组调用

优化前:

const App = (props) => {
  const { data } = props || {};
  const nameList = (data || []).map(item => item.name);
}

那么问题来了,当 data123 , data || [] 的结果是 123123 作为一个 number 是没有 map 方法的,就会报错。

数组的方法只能用真数组调用,哪怕是类数组也不行。如何判断 data 是真数组,Array.isArray 是最靠谱的。

优化后:

const App = (props) => {
  const { data } = props || {};
  let nameList = [];
  if (Array.isArray(data)) {
    nameList = data.map(item => item.name);
  }
}

四、数组中每项不一定都是对象

优化前:

const App = (props) => {
  const { data } = props || {};
  let infoList = [];
  if (Array.isArray(data)) {
    infoList = data.map(item => `我的名字是${item.name},今年${item.age}岁了`);
  }
}

一旦 data 数组中某项值是 undefined 或 null,那么 item.name 必定报错,可能又白屏了。

优化后:

const App = (props) => {
  const { data } = props || {};
  let infoList = [];
  if (Array.isArray(data)) {
    infoList = data.map(item => `我的名字是${item?.name},今年${item?.age}岁了`);
  }
}

? 可选链操作符,虽然好用,但也不能滥用。item?.name 会被编译成 item === null || item === void 0 ? void 0 : item.name,滥用会导致编辑后的代码大小增大。

二次优化后:

const App = (props) => {
  const { data } = props || {};
  let infoList = [];
  if (Array.isArray(data)) {
    infoList = data.map(item => {
      const { name, age } = item || {};
      return `我的名字是${name},今年${age}岁了`;
    });
  }
}

五、对象的方法谁能调用

优化前:

const App = (props) => {
  const { data } = props || {};
  const nameList = Object.keys(data || {});
}

只要变量能被转成对象,就可以使用对象的方法,但是 undefined 和 null 无法转换成对象。对其使用对象方法时就会报错。

优化后:

const _toString = Object.prototype.toString;
const isPlainObject = (obj) => {
  return _toString.call(obj) === '[object Object]';
}
const App = (props) => {
  const { data } = props || {};
  const nameList = [];
  if (isPlainObject(data)) {
    nameList = Object.keys(data);
  }
}

六、async/await 错误捕获

优化前:

import React, { useState } from 'react';

const App = () => {
  const [loading, setLoading] = useState(false);
  const getData = async () => {
    setLoading(true);
    const res = await queryData();
    setLoading(false);
  }
}

如果 queryData() 执行报错,那是不是页面一直在转圈圈。

优化后:

import React, { useState } from 'react';

const App = () => {
  const [loading, setLoading] = useState(false);
  const getData = async () => {
    setLoading(true);
    try {
      const res = await queryData();
      setLoading(false);
    } catch (error) {
      setLoading(false);
    }
  }
}

如果使用 trycatch 来捕获 await 的错误感觉不太优雅,可以使用 await-to-js 来优雅地捕获。

二次优化后:

import React, { useState } from 'react';
import to from 'await-to-js';

const App = () => {
  const [loading, setLoading] = useState(false);
  const getData = async () => {
    setLoading(true);
    const [err, res] = await to(queryData());
    setLoading(false);
  }
}

七、不是什么都能用来JSON.parse

优化前:

const App = (props) => {
  const { data } = props || {};
  const dataObj = JSON.parse(data);
}

JSON.parse() 方法将一个有效的 JSON 字符串转换为 JavaScript 对象。这里没必要去判断一个字符串是否为有效的 JSON 字符串。只要利用 trycatch 来捕获错误即可。

优化后:

const App = (props) => {
  const { data } = props || {};
  let dataObj = {};
  try {
    dataObj = JSON.parse(data);
  } catch (error) {
    console.error('data不是一个有效的JSON字符串')
  }
}

八、被修改的引用类型数据

优化前:

const App = (props) => {
  const { data } = props || {};
  if (Array.isArray(data)) {
    data.forEach(item => {
      if (item) item.age = 12;
    })
  }
}

如果谁用 App 这个函数后,他会搞不懂为啥 dataage 的值为啥一直为 12,在他的代码中找不到任何修改 dataage 值的地方。只因为 data 是引用类型数据。在公共函数中为了防止处理引用类型数据时不小心修改了数据,建议先使用 lodash.clonedeep 克隆一下。

优化后:

import cloneDeep from 'lodash.clonedeep';

const App = (props) => {
  const { data } = props || {};
  const dataCopy = cloneDeep(data);
  if (Array.isArray(dataCopy)) {
    dataCopy.forEach(item => {
      if (item) item.age = 12;
    })
  }
}

九、并发异步执行赋值操作

优化前:

const App = (props) => {
  const { data } = props || {};
  let urlList = [];
  if (Array.isArray(data)) {
    data.forEach(item => {
      const { id = '' } = item || {};
      getUrl(id).then(res => {
        if (res) urlList.push(res);
      });
    });
    console.log(urlList);
  }
}

上述代码中 console.log(urlList) 是无法打印出 urlList 的最终结果。因为 getUrl 是异步函数,执行完才给 urlList 添加一个值,而 data.forEach 循环是同步执行的,当 data.forEach 执行完成后,getUrl 可能还没执行完成,从而会导致 console.log(urlList) 打印出来的 urlList 不是最终结果。

所以我们要使用队列形式让异步函数并发执行,再用 Promise.all 监听所有异步函数执行完毕后,再打印 urlList 的值。

优化后:

const App = async (props) => {
  const { data } = props || {};
  let urlList = [];
  if (Array.isArray(data)) {
    const jobs = data.map(async item => {
      const { id = '' } = item || {};
      const res = await getUrl(id);
      if (res) urlList.push(res);
      return res;
    });
    await Promise.all(jobs);
    console.log(urlList);
  }
}

十、过度防御

优化前:

const App = (props) => {
  const { data } = props || {};
  let infoList = [];
  if (Array.isArray(data)) {
    infoList = data.map(item => {
      const { name, age } = item || {};
      return `我的名字是${name},今年${age}岁了`;
    });
  }
  const info = infoList?.join(',');
}

infoList 后面为什么要跟 ?,数组的 map 方法返回的一定是个数组。

优化后:

const App = (props) => {
  const { data } = props || {};
  let infoList = [];
  if (Array.isArray(data)) {
    infoList = data.map(item => {
      const { name, age } = item || {};
      return `我的名字是${name},今年${age}岁了`;
    });
  }
  const info = infoList.join(',');
}

本文转载于:

https://juejin.cn/post/7259007674520158268

如果对您有所帮助,欢迎您点个关注,我会定时更新技术文档,大家一起讨论学习,一起进步。

 记录--你的代码不堪一击!太烂了!文章来源地址https://www.toymoban.com/news/detail-599761.html

到了这里,关于记录--你的代码不堪一击!太烂了!的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 记录--你的网站如何接入QQ,微信登录

    主要实现步骤 对接第三方平台,获取第三方平台的用户信息。 利用该用户信息,完成本应用的注册。 qq互联 登录后,点击头像,进行开发者信息填写,等待审核。 邮箱验证后,等待审核。 审核通过后,然后就可以创建应用了。 然后填写一些网站信息,等待审核。审核通过

    2024年02月19日
    浏览(28)
  • 网络安全之你的浏览器记录真的安全吗?

      密码是每个人最私密的东西,轻易是不会展示给他人的,那么我如何能知道你电脑上浏览器里保存的密码呢?浏览器是大家在网上冲浪最常用的软件,在登录一些网站填写账号密码后,浏览器为了方便大家使用,会提示是否保存密码,如果选择了是,那么密码就保存在浏览

    2024年01月22日
    浏览(37)
  • chatgpt赋能python:Python屏幕截图:完美的方法记录你的屏幕

    Python作为一种高级编程语言,被广泛用于开发各种应用程序和游戏,其中之一就是屏幕截图。 在本文中,我们将介绍使用Python进行屏幕截图的方法和技巧。 屏幕截图是指将电子屏幕上的图像、文字、视频等内容保存下来的过程。它可以记录您正在计算机中看到的所有内容,

    2024年02月08日
    浏览(39)
  • 使用Lazy.nvim插件管理器,让你的Nvim懒惰起来(从Packer迁移到Lazy记录)

    Lazy.nvim作为Neovim新的插件管理器,因其速度和懒加载的特性收到很大的欢迎。Lazy的其他特性网上已有文章说明,此处已不再赘述。 关于从Packer迁移到Lazy在Lazy的READMD.md中已有教程,这甚至是经过Packer作者亲自校对的。不过在我迁移的过程中,有些插件的配置改完之后不会生效

    2024年02月03日
    浏览(32)
  • 好的代码风格,如同书法,让你的代码更加漂亮

    很多初学者的代码其实都不够“漂亮”,那是因为没有养成好的编码习惯。本篇博客以C语言为例,总结一些好习惯。其实,很多习惯都是肌肉记忆,举个例子:请你写一个程序,输入2个整数并输出它们的和。有些朋友可能写出来是这个样子。 我写这段代码,是在模仿有些朋

    2024年02月01日
    浏览(38)
  • 用这些C#代码混淆器保护你的代码安全

    最近有群友问,怎么保护发布的C#代码不被别人反编译,这就需要C#代码混淆组件。C#是一种强大的编程语言,可以用于开发各种类型的应用程序,包括桌面应用程序、Web应用程序和移动应用程序等。但是,由于C#程序易于反编译,使得代码的安全性和保护性受到了威胁。为了

    2024年02月05日
    浏览(34)
  • 一文解读!如何选择适合你的零代码、低代码开发平台

           首先,我们来探讨一下什么是 低/零代码 。低代码和零代码的概念最早出现在2014年,由Forrester提出。它们的核心要点包括:        1. 快速交付业务应用:低代码和零代码平台能够实现业务应用的快速交付,这种速度甚至可以是颠覆性的。        2. 降低业务应用开

    2024年02月14日
    浏览(34)
  • 记录一次浏览器HTTPS“你的连接不是私密连接”错误NET::ERR_CERT_REVOKED

    你的连接不是私密连接 NET::ERR_CERT_REVOKED CERT就是正式,意思就是证书错误 看到错误后,我们知道是https SLA认证的证书错误,所以我们先查看证书。 在浏览器的地址栏,左边点击红色的“不安全” 然后点击第一行的“连接”选项,看到右上角有证书按钮,点击这个按钮。 将会

    2024年02月07日
    浏览(40)
  • 算法——让你的代码更具有可读性

    今天其实算一个小专栏(内容参考《代码大全2》)明天开始更新具体的算法,这些算法我都会从力扣上找,语言的话暂时是c和c++还有c#的写法(不要过于专注于编程语言,语言只是工具,关键在于学习思维) 我们创建子程序的目的,就是让主函数尽量简洁,复杂的部分放到

    2024年01月20日
    浏览(50)
  • Pandas:如何让你的代码性能飙升

    在数据分析相关的工作中, Pandas 无疑是一个强大的工具,它的易用性和灵活性广受青睐。 然而,随着数据量的不断增长和计算需求的日益复杂, Pandas 代码的性能问题也逐渐浮出水面。 如何让 Pandas 代码运行得更快、更高效,成为了每一个人使用者都需要面对的挑战。 今天

    2024年03月18日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包