es6编程风格

目录

1、变量let和常量const

2、静态字符串与动态字符串

3、解构赋值(数组,对象)

4、对象

5、数组

6、函数

7、Map结构

8、class类

9、模块

10、ESLint的使用


1、变量let和常量const

ES6 提出了两个新的声明变量的命令:letconst。其中,let完全可以取代var,因为两者语义相同,而且let没有副作用。

var命令存在变量提升效用,let命令没有这个问题

if (true) {console.log(x); // ReferenceErrorlet x = 'hello';
}

 在letconst之间,建议优先使用const,尤其是在全局环境,不应该设置变量,只应设置常量。

const优于let有几个原因:

(1)const可以提醒阅读程序的人,这个变量不应该改变;

(2)const比较符合函数式编程思想,运算不改变值,只是新建值,而且这样也有利于将来的分布式运算;

(3) JavaScript 编译器会对const进行优化。

所以多使用const,有利于提高程序的运行效率,也就是说letconst的本质区别,其实是编译器内部的处理不同。

const声明常量还有两个好处,一是阅读代码的人立刻会意识到不应该修改这个值,二是防止了无意间修改变量值所导致的错误。

2、静态字符串与动态字符串

(1)静态字符串一律使用单引号或反引号,不建议使用双引号。

(2)动态字符串使用反引号。

// 不推荐
const a = "isabar";  // 不建议双引号
const b = 'is' + a + 'bar';  //不建议字段拼接// 没毛病
const c = `isabar`;  // 推荐
const a = 'isabar';   //单引号
const b = `is${a}bar`;  //反引号字段拼接

3、解构赋值(数组,对象)

(1)使用数组成员对变量赋值时,优先使用解构赋值,结构清晰

const arr = [1, 2, 3, 4];// 不推荐
const foo = arr[0];
const boo = arr[1];// 推荐
const [foo, boo] = arr;  // [1,2]

(2)函数的参数如果是对象的成员,优先使用解构赋值。

// 不推荐
function getFullName(user) {const first = user.first;const last = user.last;
}// 推荐
function getFullName(obj) {const { first, last } = obj;  //直接对象解构赋值
}// 更好
function getFullName({ first, last }) {
}

(3)如果函数返回多个值,优先使用对象的解构赋值,而不是数组的解构赋值。

这样便于以后添加返回值,以及更改返回值的顺序。

// 不推荐数组结构
function processInput(input) {return [left, right, top, bottom];
}// 推荐对象解构,可以调整顺序
function processInput(input) {return { left, right, top, bottom };
}const { left, right } = processInput(input);

4、对象

(1)对象定义的习惯

单行定义的对象,最后一个成员不以逗号结尾。

多行定义的对象,最后一个成员以逗号结尾。

// 多行定义对象
// 不推荐
const a = { k1: v1, k2: v2, };
const b = {k1: v1,k2: v2
};// 推荐
const a = { k1: v1, k2: v2 };
const b = {k1: v1,k2: v2,  //最后一个成员逗号
};

(2)对象定义的静态化

对象尽量静态化,一旦定义,就不得随意添加新的属性。

如果添加属性不可避免,要使用Object.assign方法

// 不推荐直接,新加对象属性
const foo = {};
foo.name = 'sum';// 实在要加属性也不是不可以
const foo = {};
Object.assign(foo, { name: 'sum' });// 最好
const foo = { name: null };
foo.name = 'sum';

(3)对象的属性名称-动态名称

// 不推荐
const obj = {id: 1,name: 'San',
};
obj[getKey('age')] = 80;// 推荐
const obj = {id: 1,name: 'San',[getKey('age')]: 80,
};

上面代码中,对象obj的最后一个属性名,需要计算得到。

这时最好采用属性表达式,在新建obj的时候,将该属性与其他属性定义在一起.

另外,对象的属性和方法,尽量采用简洁表达法,这样易于描述和书写。

let ref = 'ismy';// 不推荐
const foo = {ref: ref,value: 1,addValue: function (value) {return foo.value + value;},
};// 推荐
const foo = {ref,value: 1,addValue(value) {return foo.value + value;},
};

5、数组

(1)数组拷贝,使用扩展运算符(...)拷贝数组

// 不推荐
const items = [1,2,3]
const itemsCopy = [];for (let i = 0; i < items.length; i++) {itemsCopy[i] = items[i];
}// 推荐 实现数组拷贝
const itemsCopy = [...items];  // [1,2,3] 

(2)数组使用解构赋值。

// 不推荐
const items = [1,2,3]
const fo = items[0]
const so = items[1]// 推荐 
const [fo,so] = [1,2,3]

(3)使用 Array.from 方法,将类似数组的对象转为数组

const foo = document.querySelectorAll('.foo');
const nodes = Array.from(foo);

6、函数

(1)立即执行函数

立即执行函数写成箭头函数的形式。

// 立即执行函数
(() => {console.log('123');
})();

(2)箭头函数

使用匿名函数当作参数的场合,尽量用箭头函数代替。

因为这样更简洁,并绑定了 this。 

// 不推荐
[1, 2, 3].map(function (item) {return item*2;
});// 推荐
[1, 2, 3].map((item) => {return item*2;
});// 更推荐
[1, 2, 3].map(item => item*2);

(3)箭头函数

箭头函数取代Function.prototype.bind,不应再用 self/_this/that 绑定 this。

// 不推荐
const that = this;
const boundMethod = function(...params) {return method.apply(that, params);
}// 可行
const boundMethod = method.bind(this);// 更推荐
const boundMethod = (...params) => method.apply(this, params);

简单的、单行的、不会复用的函数,建议采用箭头函数。

如果函数体较为复杂,行数较多,还是应该采用传统的函数写法。

所有配置项都应该集中在一个对象,放在最后一个参数,布尔值最好不要直接作为参数,因为代码语义会很差,也不利于将来增加其他配置项。

// 不推荐
function divide(a, b, option = false ) {
}// 推荐
function divide(a, b, { option = false } = {}) {
}

(4) arguments 变量

不要在函数体内使用 arguments 变量,使用 rest 运算符(...)代替。因为 rest 运算符显式表明你想要获取参数,而且 arguments 是一个类似数组的对象,而 rest 运算符可以提供一个真正的数组。

// 不推荐
function all() {const args = Array.prototype.slice.call(arguments);return args.join('');
}// 推荐
function concatenateAll(...args) {return args.join('');
}//使用默认值语法设置函数参数的默认值
// 不推荐
function handleThings(opts) {opts = opts || {};
}// 推荐
function handleThings(opts = {}) {// ...
}

7、Map结构

注意区分 Object 和 Map,只有模拟现实世界的实体对象时,才使用 Object。

如果只是需要key: value的数据结构,使用 Map 结构。因为 Map 有内建的遍历机制。

let arr = [{name:'sum',age:20}]
let map = new Map(arr);for (let key of map.keys()) {console.log(key);
}for (let value of map.values()) {console.log(value);
}for (let item of map.entries()) {console.log(item[0], item[1]);
}

8、class类

总是用 Class,取代需要 prototype 的操作。因为 Class 的写法更简洁,更易于理解

在历史文章中有一篇写了关于class的详细解说

ES6对于Class类的基本语法详解(2024-04-10)-CSDN博客

// 不推荐 构造函数
function Queue(contents = []) {this._queue = [...contents];
}
Queue.prototype.pop = function() {const value = this._queue[0];this._queue.splice(0, 1);return value;
}// 推荐 class
class Queue {constructor(contents = []) {this._queue = [...contents];}pop() {const value = this._queue[0];this._queue.splice(0, 1);return value;}
}

使用extends实现继承,因为这样更简单,不会有破坏instanceof运算的危险。

// 不推荐
const inherits = require('inherits');
function PeekableQueue(contents) {Queue.apply(this, contents);
}
inherits(PeekableQueue, Queue);
PeekableQueue.prototype.peek = function() {return this._queue[0];
}// 推荐
class PeekableQueue extends Queue {peek() {return this._queue[0];}
}

9、模块

ES6 模块语法是 JavaScript 模块的标准写法,坚持使用这种写法,取代 Node.js 的 CommonJS 语法。

首先,使用import取代require()

// CommonJS 的写法
const moduleA = require('moduleA');
const func1 = moduleA.func1;
const func2 = moduleA.func2;// ES6 的写法
import { func1, func2 } from 'moduleA';

 其次,使用export取代module.exports

// commonJS 的写法
var React = require('react');var Breadcrumbs = React.createClass({render() {return <nav />;}
});module.exports = Breadcrumbs;// ES6 的写法
import React from 'react';class Breadcrumbs extends React.Component {render() {return <nav />;}
};export default Breadcrumbs;

如果模块只有一个输出值,就使用export default,如果模块有多个输出值,除非其中某个输出值特别重要,否则建议不要使用export default,即多个输出值如果是平等关系,export default与普通的export就不要同时使用。

如果模块默认输出一个函数,函数名的首字母应该小写,表示这是一个工具方法。

function makeStyleGuide() {
}export default makeStyleGuide;

如果模块默认输出一个对象,对象名的首字母应该大写,表示这是一个配置值对象。

const StyleGuide = {es6: {}
};export default StyleGuide;

10、ESLint的使用

ESLint 是一个语法规则和代码风格的检查工具,可以用来保证写出语法正确、风格统一的代码。

首先,在项目的根目录安装 ESLint。

npm install --save-dev eslint
npm install --save-dev eslint-config-airbnb
npm install --save-dev eslint-plugin-import eslint-plugin-jsx-a11y eslint-plugin-vue/eslint-plugin-react(按照开发技术选择)

 最后,在项目的根目录下新建一个.eslintrc文件,配置 ESLint。

{"extends": "eslint-config-airbnb"
}

现在就可以检查,当前项目的代码是否符合预设的规则。

index.js文件的代码如下。

var unused = 'I have no purpose!';
function greet() {var message = 'Hello, World!';console.log(message);
}
greet();

使用 ESLint 检查这个文件,就会报出错误。

$ npx eslint index.js
index.js1:1  error  Unexpected var, use let or const instead          no-var1:5  error  unused is defined but never used                 no-unused-vars4:5  error  Expected indentation of 2 characters but found 4  indent4:5  error  Unexpected var, use let or const instead          no-var5:5  error  Expected indentation of 2 characters but found 4  indent✖ 5 problems (5 errors, 0 warnings)

上面代码说明,原文件有五个错误,其中两个是不应该使用var命令,而要使用letconst;一个是定义了变量,却没有使用;

另外两个是行首缩进为 4 个空格,而不是规定的 2 个空格。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/1293.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

回归预测 | Matlab实现BO-RF贝叶斯优化随机森林多变量回归预测

回归预测 | Matlab实现BO-RF贝叶斯优化随机森林多变量回归预测 目录 回归预测 | Matlab实现BO-RF贝叶斯优化随机森林多变量回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现BO-RF贝叶斯优化随机森林多变量回归预测&#xff1b; 2.输入7个特征&#xf…

C语言扫雷游戏完整版、标记、取消标记、自动拓展

文章目录 前言一、扫雷完整代码总结 前言 用C语言实现扫雷游戏&#xff0c;标记功能&#xff0c;取消标记功能&#xff0c;自动拓展功能&#xff0c;标记只是雷&#xff0c;并且数量等于雷的数量&#xff0c;自动获胜。 一、扫雷完整代码 // test.c 源文件 #define _CRT_SECU…

Linux Supervisor进程控制系统完全教程

一、简介 Supervisor是一个进程控制系统&#xff0c;它使用户能够监视和控制类unix操作系统进程。它通过提供基于配置或事件启动、停止和重新启动进程的机制&#xff0c;帮助管理应该在系统中连续运行的进程。对于需要控制和监视Linux或其他类unix操作系统上多个进程的状态的开…

如何设置unbuntu时间及同步时间

文章目录 时区时间同步与服务 时间同步的重要性Ubuntu系统中设置时间和同步时间方法一&#xff1a;通过图形界面设置查看当前时间设置时间和时区设置时区&#xff08;假设设置为UTC&#xff09;&#xff1a;设置本地时间&#xff08;例如&#xff0c;设置时间为2024年4月21日 1…

String、StringBuilder、StringBuffer区别;String底层详解,实例化、拼接、比较;String为什么不可变

文章目录 0、前言一、String、StringBuilder、StringBuffer区别二、String简介2.1 String类特点2.2 创建String对象、String实例化2.2.1 实例化方法2.2.2 String str1"abc"和String str2new String("abc")区别 2.3 String的比较2.4 String类的“加法”2.5 …

idea的maven打包只有几kb

在pom.xml文件中添加以下&#xff1a; <plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>2.3.4.RELEASE</version><configuration><!-- 指定该Main Class…

【youcans电力电子仿真 03】Boost变换电路

【youcans电力电子仿真 03】Boost变换电路 Boost变换电路是Buck变换电路的对偶拓扑&#xff0c;也属于非隔离型直流变换器&#xff0c;其输出电压大于输入电压。Boost变换电路具有效率高、输出稳定、控制简单和成本低的优点&#xff0c;广泛应用于电子设备、光伏发电、无线通信…

了解MySQL InnoDB多版本MVCC(Multi-Version Concurrency Control)

了解MySQL InnoDB多版本MVCC&#xff08;Multi-Version Concurrency Control&#xff09; 在数据库管理系统中&#xff0c;多版本并发控制&#xff08;MVCC&#xff09;是一种用于实现高并发和事务隔离的技术。MySQL的InnoDB存储引擎支持MVCC&#xff0c;这使得它可以在提供高…

伪分布Hadoop下安装Hive

一、下载并安装Mysql &#xff08;1&#xff09;下载mysql安装包&#xff08;mysql-8.0.26-1.el7.x86_64.rpm-bundle.tar&#xff09; 下载官网&#xff1a;MySQL :: Download MySQL Community Server (Archived Versions)https://downloads.mysql.com/archives/community/ &…

Linux-用户管理类命令实训

掌握Linux各类命令的使用方法。熟悉Linux操作环境。掌握常用文件目录类命令掌握常用系统信息类命令了解其他常用命令 一、文件与目录管理 &#xff08;1&#xff09;查看根目录下有哪些内容 &#xff08;2&#xff09;进入/tmp目录&#xff0c;以自己的学号建一个目录&#x…

HTML部分常用标签补充

table&#xff08;布局方面不建议使用&#xff0c;而是使用CSS来完成&#xff09;: 标签解释&#xff1a; ~table标签顾名思义&#xff0c;是表格的意思 ~table其中可以使用boder属性来显示表格的线&#xff0c;最好使用CSS来配合HTML的使用 ~table内的内容可以使用colspan来定…

Vue2slot插槽(理解与应用)

1、插槽的概念 插槽&#xff08;Slot)是vue为组件的封装者提供的能力。允许开发者在封装组件时&#xff0c;把不确定的、希望由用户指定的部分定义为插槽。 举个例子&#xff1a;组件好比小霸王游戏机&#xff0c;插槽就是游戏机的插口&#xff0c;看用户插什么卡&#xff0c;就…

【论文精读】Attention is all you need

摘要 主要的序列转换模型是基于复杂的循环或卷积神经网络&#xff0c;其中包括一个编码器和一个解码器。性能最好的模型还通过一种注意力机制将编码器和解码器连接起来。我们提出了一种新的简单的网络架构&#xff0c;Transformer&#xff0c;完全基于注意机制&#xff0c;完全…

vue中 export default 与 export 写法的区别

文章目录 1、export default 用法1.1、定义函数1.2、使用 2、export 用法2.1、定义函数2.1、使用1&#xff09;使用方法1&#xff1a;一次性导入所有函数2&#xff09;使用方法2&#xff1a;按需导入函数&#xff0c;使用 **大括号** 3、总结 1、export default 用法 1.1、定义…

24五一杯资料汇总!!!!

以下内容为23年五一杯内容&#xff0c;24年也将会按时更新资料&#xff01;&#xff01;&#xff01; 问题1&#xff1a;给定建筑物数据&#xff0c;假设该建筑物内温度需要一直保持在18-26度&#xff0c;在温度不适宜的时候要通过电来调节温度&#xff0c;消耗一度电相当于0.…

gazebo中vins-fusion在仿真小车上的部署

软件要求&#xff1a;Ubuntu 20.04 ros的noetic版本&#xff0c;我是在虚拟机vitrualbox上运行的 这几天在学ROS&#xff0c;跟着赵虚左老师过了一遍之后&#xff0c;感觉还是有很多不懂的地方&#xff0c;xtdrone上仿真跟着文档走了一遍&#xff0c;好像没学到什么东西&#…

java解决常见递归问题

最基本的&#xff0c;斐波那契数列&#xff0c;阶乘&#xff08;0&#xff0c;1的阶乘均为1&#xff09; 返回字母“x”第一次出现的位置 使用递归编写一个函数&#xff0c;读取一个字符串&#xff0c;返回字母“x”第一次出现的位置。例如&#xff0c;字符串 "abcdefgh…

力扣练习题(2024/4/21)

贪心算法是一种在每一步选择中都做出最佳选择的算法方法。它以尽量减少当前问题的复杂性为目标&#xff0c;在每一步选择中尽可能取得最佳结果。尽管贪心算法不能保证总是获得最优解&#xff0c;但在许多情况下&#xff0c;它是解决问题的高效方法。 1分发饼干 如果连续数字之…

centos安装服务及设置自启动

centos安装redis及设置自启动 centos安装redis及设置自启动redis安装脚本redis启动脚本chkconfig设置开机自启动systemctl设置开机自启动nginx脚本mysql脚本mongodb脚本rabbitmq脚本java服务脚本删除日志定时任务 centos安装redis及设置自启动 redis安装脚本 进入 /opt/redis…

Python数据挖掘项目开发实战:利用神经网络破解验证码

注意&#xff1a;本文的下载教程&#xff0c;与以下文章的思路有相同点&#xff0c;也有不同点&#xff0c;最终目标只是让读者从多维度去熟练掌握本知识点。 下载教程&#xff1a;Python数据挖掘项目开发实战_用神经网络破解验证码_编程案例解析实例详解课程教程.pdf 使用Pyth…