您当前的位置:首页 > 电脑百科 > 程序开发 > 语言 > javascript

JS 的5个不良编码习惯,现在就改掉吧

时间:2019-10-28 16:46:05  来源:  作者:

阅读JAVAScript代码时,你有没有感觉:

  • 你几乎不明白代码的作用?
  • 代码使用了很多JavaScript技巧?
  • 命名和编码风格相当随机?

这些是编码习惯不良的迹象。

在这篇文章中,我描述了JavaScript中常见的5种不良编码习惯。重要的是,我将就如何摆脱这些习惯提出可行的建议。

1.不要使用隐式类型转换

JavaScript是一种松散类型的语言。如果使用得当,这是一个好处,因为它给你带来了灵活性。

使用不同类型的操作数时,大多数运算符+ - * / ==(但不是===)使用类型的隐式转换。

该声明if (condition) {...},while(condition) {...}含蓄地变换的条件为布尔值。

以下示例依赖于类型的隐式转换。我敢打赌你会感到困惑:

JS 的5个不良编码习惯,现在就改掉吧

 

过度依赖隐式类型转换是一个坏习惯。首先,它使您的代码在边缘情况下不太稳定。其次,您增加了引入难以重现和修复的错误的机会。

让我们实现一个获取对象属性的函数。如果该属性不存在,则该函数返回默认值:

JS 的5个不良编码习惯,现在就改掉吧

 

getProp()读取name属性的值,即'Batman'。

尝试访问isVillian属性怎么样:

console.log(getProp(hero, 'isVillian', true)); // => true

那是一个错误。即使hero属性isVillian是false,函数getProp()返回错误true。

这是因为属性存在的验证依赖于隐式转换为布尔值if (!object[propertyName]) {...}。

这些错误很难发现。要修复该函数,请明确验证值的类型:

JS 的5个不良编码习惯,现在就改掉吧

 

object[propertyName] === undefined验证属性访问者是否评估到的确切内容undefined。这里建议避免直接使用 undefined。因此,上述解决方案可以进一步改进:

JS 的5个不良编码习惯,现在就改掉吧

 

尽可能不要使用隐式类型转换。相反,请确保变量和函数参数始终具有相同的类型,必要时使用显式类型转换。

最佳实践列表:

  • 始终使用严格相等运算符===来执行比较
  • 不要使用松散的相等运算符 ==
  • 加法运算符operand1 + operand2:两个操作数应该是数字或两个字符串
  • 算术运算符- * / % **:两个操作数都应该是数字
  • if (condition) {...},while (condition) {...}等等语句:condition应该是一个布尔值

您可能会说这种方法需要编写更多代码......您说得对!但是通过明确的方法,您可以控制代码的行为。此外,显性提高了可读性。

2.不要使用旧的JavaScript技巧

JavaScript的有趣之处在于,它的创建者没有料到这种语言会如此流行。

基于JavaScript构建的应用程序的复杂性比语言发展的速度还要快。这种情况迫使开发人员使用JavaScript技巧和变通方法,只是为了让事情正常运行。

一个典型的例子是查看数组是否包含某个元素。我从来不喜欢使用 array.indexOf(item)!==-1来检查。

ES6 及以后版本的功能要强大得多,可以使用新的语言特性安全地重构许多技巧。

JS 的5个不良编码习惯,现在就改掉吧

 

ES6 中可以使用 array.includes(item) 来代替 array.indexOf(item)!==-1

3. 不要污染函数作用域

在ES2015之前,你可能会养成了将所有变量声明在函数作用域里面。

来看看一个例子:

JS 的5个不良编码习惯,现在就改掉吧

 

变量 index、item和 length 在函数作用域内。但是这些变量会影响函数作用域,因为它们只在 for()块作用域内才被需要。

通过引入具有块作用域 let和 const,应该尽可能地限制变量的生命周期。

JS 的5个不良编码习惯,现在就改掉吧

 

index和 item 变量被限制为 for()循环块作用域。length 被移动到使用地方的附近。

重构后的代码更容易理解,因为变量不会分散在整个函数作用域内,它们存在于使用地方的附近。

在使用的块作用域定义变量

if 块作用域

JS 的5个不良编码习惯,现在就改掉吧

 

for 块作用域

JS 的5个不良编码习惯,现在就改掉吧

 

4.尽量避免 undefined 和 null

未赋值的变量默认被赋值为 undefined。例如

JS 的5个不良编码习惯,现在就改掉吧

 

count变量已定义,但尚未使用值初始化。JavaScript隐式赋值给它 undefined。

访问不存在的属性 hero.city时,也会返回 undefined。

为什么直接使用 undefined是一个不好习惯?因为与 undefined进行比较时,你正在处理未初始化状态的变量。

变量、对象属性和数组在使用前必须用值初始化

JS 提供了很多避免与 undefined进行比较方式。

判断属性是否存在

JS 的5个不良编码习惯,现在就改掉吧

 

对象的默认属性

JS 的5个不良编码习惯,现在就改掉吧

 

默认函数参数

JS 的5个不良编码习惯,现在就改掉吧

 

null是一个缺失对象的指示符。应该尽量避免从函数返回 null,特别是使用 null作为参数调用函数。

一旦 null出现在调用堆栈中,就必须在每个可能访问 null的函数中检查它的存在,这很容易出错。

JS 的5个不良编码习惯,现在就改掉吧

 

尝试编写不涉及 null的代码。可替代方法是 try/catch机制,默认对象的使用。

5. 不要使用随意的编码风格,执行一个标准

有什么比阅读具有随机编码风格的代码更令人生畏的事情?你永远不知道会发生什么!

如果代码库包含许多开发人员的不同编码风格,该怎么办?,这种就像各色人物涂鸦墙。

JS 的5个不良编码习惯,现在就改掉吧

 

整个团队和应用程序代码库都需要相同的编码风格,它提高了代码的可读性。

一些有用的编码风格的例子:

  • Airbnb JS 风格指南
  • 谷歌 JS 风格指南

老实说,当我在回家前准备提交时,我可能会忘记设计代码的样式。

我自己总说:保持代码不变,以后再更新它,但是“以后”意味着永远不会。

这里建议使用 eslint 来规范编码风格。

  1. 安装eslint
  2. 使用最适合自己的编码风格配置 eslint
  3. 设置一个预提交钩子,在提交之前运行eslint验证。

总结

编写高质量和干净的代码需要纪律,克服不好的编码习惯。

JavaScript是一种宽容的语言,具有很大的灵活性。但是你必须注意你所使用的特性。这里建议是避免使用隐式类型转换, undefined 和 null 。

现在这种语言发展得相当快。找出复杂的代码,并使用最新 JS 特性来重构。

整个代码库的一致编码风格有益于可读性。良好的编程技能总是一个双赢的解决方案。



Tags:JS   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
前言几乎所有.NET序列化程序的实现基础都是反射。下列代码是Newtonsoft.Json的实现:protectedvirtualJsonPropertyCreateProperty(MemberInfomember,MemberSerializationmemb...【详细内容】
2021-12-28  Tags: JS  点击:(2)  评论:(0)  加入收藏
前言JDBC访问Postgresql的jsonb类型字段当然可以使用Postgresql jdbc驱动中提供的PGobject,但是这样在需要兼容多种数据库的系统开发中显得不那么通用,需要特殊处理。本文介绍...【详细内容】
2021-12-23  Tags: JS  点击:(13)  评论:(0)  加入收藏
1. 检测一个对象是不是纯对象,检测数据类型// 检测数据类型的方法封装(function () { var getProto = Object.getPrototypeOf; // 获取实列的原型对象。 var class2type =...【详细内容】
2021-12-08  Tags: JS  点击:(23)  评论:(0)  加入收藏
前言前几天有粉丝在群里问了一个json文件处理的问题。看上去他只需要follower和ddate这两个字段下的对应的值。我们知道json是一种常见的数据传输形式,所以对于爬取数据的数...【详细内容】
2021-12-07  Tags: JS  点击:(40)  评论:(0)  加入收藏
作者:前端进阶者来源:前端进阶学习交流一、前言 我们经常在网页上 ,游戏界面加载时会看到加载进度条的效果,我们往往会以为这些加载进度条的效果,很难实现。今天教大家JS+CSS结合...【详细内容】
2021-11-05  Tags: JS  点击:(45)  评论:(0)  加入收藏
今天我们将尝试下花 1 分钟的时间简单地了解下什么是 JS 代理对象(proxies)?我们可以这样理解,JS 代理就相当于在对象的外层加了一层拦截,在拦截方法里我们可以自定义一些个性化...【详细内容】
2021-10-18  Tags: JS  点击:(51)  评论:(0)  加入收藏
带有多个条件的 if 语句把多个值放在一个数组中,然后调用数组的 includes 方法。// bad if (x === "abc" || x === "def" || x === "ghi" || x === "jkl") { //logic } // be...【详细内容】
2021-09-27  Tags: JS  点击:(58)  评论:(0)  加入收藏
利用JS的CryptoJS 3.x和PHP的openssl_encrypt,openssl_decrypt实现AES对称加密解密,由于需要两种语言对同一字符串的操作,而CryptoJS 的默认加密方式为“aes-256-cbc”,PHP端也...【详细内容】
2021-09-16  Tags: JS  点击:(79)  评论:(0)  加入收藏
作者:JShaman.com:w2sft内容预告:本文将实例讲解以下JS代码混淆加密技术:方法名转义和转码、成员表达式转IIFE、函数标准化、数值混淆、布尔型常量值混淆、二进制表达式转为调用...【详细内容】
2021-09-03  Tags: JS  点击:(82)  评论:(0)  加入收藏
Web 浏览器日益强大,网站和 Web 应用程序的复杂性也在增加。几十年前需要超级计算机的操作现在可以在智能手机上运行,其中之一就是人脸检测。检测和分析人脸的能力非常有用,因...【详细内容】
2021-08-20  Tags: JS  点击:(105)  评论:(0)  加入收藏
▌简易百科推荐
1、通过条件判断给变量赋值布尔值的正确姿势// badif (a === 'a') { b = true} else { b = false}// goodb = a === 'a'2、在if中判断数组长度不为零...【详细内容】
2021-12-24  Mason程    Tags:JavaScript   点击:(6)  评论:(0)  加入收藏
给新手朋友分享我收藏的前端必备javascript已经写好的封装好的方法函数,直接可用。方法函数总计:41个;以下给大家介绍有35个,需要整体文档的朋友私信我,1、输入一个值,将其返回数...【详细内容】
2021-12-15  未来讲IT    Tags:JavaScript   点击:(20)  评论:(0)  加入收藏
1. 检测一个对象是不是纯对象,检测数据类型// 检测数据类型的方法封装(function () { var getProto = Object.getPrototypeOf; // 获取实列的原型对象。 var class2type =...【详细内容】
2021-12-08  前端明明    Tags:js   点击:(23)  评论:(0)  加入收藏
作者:一川来源:前端万有引力 1 写在前面Javascript中的apply、call、bind方法是前端代码开发中相当重要的概念,并且与this的指向密切相关。本篇文章我们将深入探讨这个关键词的...【详细内容】
2021-12-06  Nodejs开发    Tags:Javascript   点击:(19)  评论:(0)  加入收藏
概述DOM全称Document Object Model,即文档对象模型。是HTML和XML文档的编程接口,DOM将文档(HTML或XML)描绘成一个多节点构成的结构。使用JavaScript可以改变文档的结构、样式和...【详细内容】
2021-11-16  海人为记    Tags:DOM模型   点击:(35)  评论:(0)  加入收藏
入口函数 /*js加载完成事件*/ window.onload=function(){ console.log("页面和资源完全加载完毕"); } /*jQuery的ready函数*/ $(document).ready(function(){ co...【详细内容】
2021-11-12  codercyh的开发日记    Tags:jQuery   点击:(36)  评论:(0)  加入收藏
一、判断是否IE浏览器(支持判断IE11与edge)function IEVersion() {var userAgent = navigator.userAgent; //取得浏览器的userAgent字符串var isIE = userAgent.indexOf("comp...【详细内容】
2021-11-02  V面包V    Tags:Javascript   点击:(40)  评论:(0)  加入收藏
Null、Undefined、空检查普通写法: if (username1 !== null || username1 !== undefined || username1 !== '') { let username = username1; }优化后...【详细内容】
2021-10-28  前端掘金    Tags:JavaScript   点击:(51)  评论:(0)  加入收藏
今天我们将尝试下花 1 分钟的时间简单地了解下什么是 JS 代理对象(proxies)?我们可以这样理解,JS 代理就相当于在对象的外层加了一层拦截,在拦截方法里我们可以自定义一些个性化...【详细内容】
2021-10-18  前端达人    Tags:JS   点击:(51)  评论:(0)  加入收藏
带有多个条件的 if 语句把多个值放在一个数组中,然后调用数组的 includes 方法。// bad if (x === "abc" || x === "def" || x === "ghi" || x === "jkl") { //logic } // be...【详细内容】
2021-09-27  羲和时代    Tags:JS   点击:(58)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条