学会了ES6,就不会写出那样的代码
用let不用var
ES6之前我们用var声明一个变量,但是它有很多弊病:
- 因为没有块级作用域,很容易声明全局变量
- 变量提升
- 可以重复声明 还记得这道面试题吗?
var a = [];
for (var i = 0; i < 10; i++) {
a[i] = function () {
console.log(i);
};
}
a[6](); // 10
a[7](); // 10
a[8](); // 10
a[9](); // 10
所以,你现在还有什么理由不用let?
有时候const比let更好
const和let的唯一区别就是,const不可以被更改,所以当声明变量的时候,尤其是在声明容易被更改的全局变量的时候,尽量使用const。
- 更好的代码语义化,一眼看到就是常量。
- 另一个原因是因为JavaScript 编译器对const的优化要比let好,多使用const,有利于提高程序的运行效率。
- 所有的函数都应该设置为常量。
动态字符串
不要使用“双引号”,一律用单引号或反引号
// low
const a = "foobar";
const b = 'foo' + a + 'bar';
// best
const a = 'foobar';
const b = `foo${a}bar`;
const c = 'foobar';
解构赋值的骚操作
变量赋值
在用到数组成员对变量赋值时,尽量使用解构赋值。
const arr = [1, 2, 3, 4];
// low
const first = arr[0];
const second = arr[1];
// good
const [first, second] = arr;
函数传对象
函数的参数如果是对象的成员,优先使用解构赋值。
// low
function getFullName(user) {
const firstName = user.firstName;
const lastName = user.lastName;
}
// good
function getFullName({ firstName, lastName }) {
}
如果函数返回多个值,优先使用对象的解构赋值,而不是数组的解构赋值。这样便于以后添加返回值,以及更改返回值的顺序。
// low
function processInput(input) {
return [left, right, top, bottom];
}
// good
function processInput(input) {
return { left, right, top, bottom };
}
const { left, right } = processInput(input);
关于对象的细节
逗号
单行定义的对象结尾不要逗号:
// low
const a = { k1: v1, k2: v2, };
// good
const a = { k1: v1, k2: v2 };
多行定义的对象要保留逗号:
// low
const b = {
k1: v1,
k2: v2
};
// good
const b = {
k1: v1,
k2: v2,
};
一次性初始化完全
不要声明之后又给对象添加新属性:
// low
const a = {};
a.x = 3;
// good
const a = { x: null };
a.x = 3;
如果一定非要加请使用Object.assign:
const a = {};
Object.assign(a, { x: 3 });
如果对象的属性名是动态的,可以在创造对象的时候,使用属性表达式定义:
// low
const obj = {
id: 5,
name: 'San Francisco',
};
obj[getKey('enabled')] = true;
// good
const obj = {
id: 5,
name: 'San Francisco',
[getKey('enabled')]: true,
};
再简洁一点
在定义对象时,能简洁表达尽量简洁表达:
var ref = 'some value';
// low
const atom = {
ref: ref,
value: 1,
addValue: function (value) {
return atom.value + value;
},
};
// good
const atom = {
ref,
value: 1,
addValue(value) {
return atom.value + value;
},
};
数组
...
使用扩展运算符(...)拷贝数组:
// 还在用for i 你就太low了
const len = items.length;
const itemsCopy = [];
let i;
for (i = 0; i < len; i++) {
itemsCopy[i] = items[i];
}
// cool !
const itemsCopy = [...items];
不要跟我提类数组
用 Array.from 方法,将类似数组的对象转为数组:
const foo = document.querySelectorAll('.foo');
const nodes = Array.from(foo);
函数
箭头函数=>
立即执行函数可以写成箭头函数的形式:
(() => {
console.log('Welcome to the Internet.');
})();
尽量写箭头函数使你的代码看起来简洁优雅:
// low
[1, 2, 3].map(function (x) {
return x * x;
});
// cool !
[1, 2, 3].map(x => x * x);
不要把布尔值直接传入函数
// low
function divide(a, b, option = false ) {
}
// good
function divide(a, b, { option = false } = {}) {
}
别再用arguments(类数组)了!
使用 rest 运算符(...)代替,rest 运算符可以提供一个真正的数组。
// low
function concatenateAll() {
const args = Array.prototype.slice.call(arguments);
return args.join('');
}
// good
function concatenateAll(...args) {
return args.join('');
}
传参时试试设置默认值?
// low
function handleThings(opts) {
opts = opts || {};
}
// good
function handleThings(opts = {}) {
// ...
}
Object?Map!
简单的键值对优先Map
如果只是简单的key: value结构,建议优先使用Map,因为Map提供方便的遍历机制。
let map = new Map(arr);
// 遍历key值
for (let key of map.keys()) {
console.log(key);
}
// 遍历value值
for (let value of map.values()) {
console.log(value);
}
// 遍历key和value值
for (let item of map.entries()) {
console.log(item[0], item[1]);
}
更加简洁直观class语法
// low
function Queue(contents = []) {
this._queue = [...contents];
}
Queue.prototype.pop = function() {
const value = this._queue[0];
this._queue.splice(0, 1);
return value;
}
// good
class Queue {
constructor(contents = []) {
this._queue = [...contents];
}
pop() {
const value = this._queue[0];
this._queue.splice(0, 1);
return value;
}
}
模块化
引入模块
使用import取代require,因为Module是Javascript模块的标准写法。
// bad
const moduleA = require('moduleA');
const func1 = moduleA.func1;
const func2 = moduleA.func2;
// good
import { func1, func2 } from 'moduleA';
输出模块
使用export输出变量,拒绝module.exports:
import React from 'react';
class Breadcrumbs extends React.Component {
render() {
return <nav />;
}
};
export default Breadcrumbs;
- 输出单个值,使用
export default - 输出多个值,使用
export export default与普通的export不要同时使用
编码规范
- 模块输出一个函数,首字母应该小写:
function getData() {
}
export default getData;
- 模块输出一个对象,首字母应该大写
const Person = {
someCode: {
}
};
export default Person ;
学会了ES6,就不会写出那样的代码的更多相关文章
- 如何写出无法维护的代码(JAVA版)
程序命名(针对那些不能混淆的代码) 容易输入的名字.比如:Fred,asdf 单字母的变量名.比如:a,b,c, x,y,z,或者干脆上中文比如(阿隆索肯德基) 有创意地拼写错误.比如:SetPint ...
- 写出优质Java代码的4个技巧
我们平时的编程任务不外乎就是将相同的技术套件应用到不同的项目中去,对于大多数情况来说,这些技术都是可以满足目标的.然而,有的项目可能需要用到一些特别的技术,因此工程师们得深入研究,去寻找那些最简单但最 ...
- 写出优质Java代码的4个技巧(转)
http://geek.csdn.net/news/detail/238243 原文:4 More Techniques for Writing Better Java 作者:Justin Alban ...
- 只用这 6 个字符,就可以写出任意 JavaScript 代码!
你可能在网上见过有人用 几个不同的字符写的各种稀奇古怪的 JavaScript 代码,虽然看起来奇怪,但是能正常运行!比如这个: (!(~+[])+{})[--[~+""][+[] ...
- Python写出LSTM-RNN的代码
0. 前言 本文翻译自博客: iamtrask.github.io ,这次翻译已经获得trask本人的同意与支持,在此特别感谢trask.本文属于作者一边学习一边翻译的作品,所以在用词.理论方面难免会 ...
- 如何在word中写出赏心悦目的代码
短学期的VHDL终于结束了,虽然代码并不是很难,但是框框条条的规矩很多,也算折腾了一会,最后要写一个技术手册,结题报告类似物.考虑到word毕竟套主题比较方便,所以也就没有用LaTeX写,但是很快就发 ...
- 教你在不使用框架的情况下也能写出现代化 PHP 代码
我为你们准备了一个富有挑战性的事情.接下来你们将以 无 框架的方式开启一个项目之旅. 首先声明, 这篇并非又臭又长的反框架裹脚布文章.也不是推销 非原创 思想 .毕竟, 我们还将在接下来的开发之旅中使 ...
- css书写规范以及如何写出赏心悦目的代码
css书写规范: 1. 编码统一为utf-8;2. 协作开发及分工: i根据各个模块, 同时根据页面相似程序, 事先写好大体框架文件,同时根据页面相似程序,事先写好大体框架文件.共用css文件base ...
- java写出进程条代码
package com.ds; import java.awt.Color; import java.awt.Toolkit; import javax.swing.ImageIcon; import ...
随机推荐
- 开源一款强大的文件服务组件(QJ_FileCenter)(系列三 访问接口与项目集成)
系列文章 1. 开源一款强大的文件服务组件(QJ_FileCenter)(系列一) 2. 开源一款强大的文件服务组件(QJ_FileCenter)(系列二 安装说明) 3. 开源一款强大的文件服务组件 ...
- CentOS7.x下安装VNC
1.检查是否安装VNC rpm -q tigervnc tigervnc-server 2.安装X-Window yum check-update yum groupinstall "X W ...
- Java Web 学习与总结(三)会话跟踪
何为会话跟踪?举个简单的例子,比如登陆到某购物网站后,在一定时间内无论你在这个网站中切换到任意的网页,只要不执行退出操作,一直保持着你账号的登录状态. 那么在Java Web中我们应当如何去实现这一操 ...
- canvas绘制五角星详细过程
canvas绘制 <canvas id="straight"></canvas> <script> var canvas = document. ...
- java_对象序列化
对象序列化(serializable) 序列化读:ObjectInputStream ois=new ObjectInputStream(new FileInputStream("./gg ...
- 图的最短路径---弗洛伊德(Floyd)算法浅析
算法介绍 和Dijkstra算法一样,Floyd算法也是为了解决寻找给定的加权图中顶点间最短路径的算法.不同的是,Floyd可以用来解决"多源最短路径"的问题. 算法思路 算法需要 ...
- sqlplus登录远程数据库与数据导出
一.登录 1.cmd中输入sqlplus /nolog 2.链接数据库,root是用户名,root123是密码,ORCL是数据库名.conn root/root123@192.168.1.27:152 ...
- canvas+js绘制折线图
效果: 源码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="U ...
- ltp-ddt eth过程中遇到的问题
eth_iperf_tcp ETH_S_PERF_IPERF_TCP_INTPACING_8K_1448B source 'common.sh'; iface=`get_eth_iface_name. ...
- ui7
2016.9讲义 一.课程的主要内容和目的 二.课程所用工具软件——Photoshop CS6 1. Photoshop 的发展史 1990.2,ps1.0问世,1991.2,PS2.0发行,此后,进 ...