用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,就不会写出那样的代码的更多相关文章

  1. 如何写出无法维护的代码(JAVA版)

    程序命名(针对那些不能混淆的代码) 容易输入的名字.比如:Fred,asdf 单字母的变量名.比如:a,b,c, x,y,z,或者干脆上中文比如(阿隆索肯德基) 有创意地拼写错误.比如:SetPint ...

  2. 写出优质Java代码的4个技巧

    我们平时的编程任务不外乎就是将相同的技术套件应用到不同的项目中去,对于大多数情况来说,这些技术都是可以满足目标的.然而,有的项目可能需要用到一些特别的技术,因此工程师们得深入研究,去寻找那些最简单但最 ...

  3. 写出优质Java代码的4个技巧(转)

    http://geek.csdn.net/news/detail/238243 原文:4 More Techniques for Writing Better Java 作者:Justin Alban ...

  4. 只用这 6 个字符,就可以写出任意 JavaScript 代码!

    你可能在网上见过有人用 几个不同的字符写的各种稀奇古怪的 JavaScript 代码,虽然看起来奇怪,但是能正常运行!比如这个: (!(~+[])+{})[--[~+""][+[] ...

  5. Python写出LSTM-RNN的代码

    0. 前言 本文翻译自博客: iamtrask.github.io ,这次翻译已经获得trask本人的同意与支持,在此特别感谢trask.本文属于作者一边学习一边翻译的作品,所以在用词.理论方面难免会 ...

  6. 如何在word中写出赏心悦目的代码

    短学期的VHDL终于结束了,虽然代码并不是很难,但是框框条条的规矩很多,也算折腾了一会,最后要写一个技术手册,结题报告类似物.考虑到word毕竟套主题比较方便,所以也就没有用LaTeX写,但是很快就发 ...

  7. 教你在不使用框架的情况下也能写出现代化 PHP 代码

    我为你们准备了一个富有挑战性的事情.接下来你们将以 无 框架的方式开启一个项目之旅. 首先声明, 这篇并非又臭又长的反框架裹脚布文章.也不是推销 非原创 思想 .毕竟, 我们还将在接下来的开发之旅中使 ...

  8. css书写规范以及如何写出赏心悦目的代码

    css书写规范: 1. 编码统一为utf-8;2. 协作开发及分工: i根据各个模块, 同时根据页面相似程序, 事先写好大体框架文件,同时根据页面相似程序,事先写好大体框架文件.共用css文件base ...

  9. java写出进程条代码

    package com.ds; import java.awt.Color; import java.awt.Toolkit; import javax.swing.ImageIcon; import ...

随机推荐

  1. SQL Server中将多行数据拼接为一行数据并且有特殊字符

    有表结构如下: 这时,要求显示所有学生的爱好的结果集,代码如下: ) as hobby FROM ( SELECT name, (SELECT hobby+',' FROM student WHERE ...

  2. Android 内存管理研究

    1. 内存管理基础知识 http://www.cnblogs.com/xingfuzzhd/p/3485924.html 1. mImageView.setImageResource(R.drawab ...

  3. Ecliplse转IDEA的学习思路

    很多用户都是先学习了 Eclipse.MyEclipse 再转到 IntelliJ IDEA 的,这里需要先说明的是,在学习 IntelliJ IDEA 过程中,你暂且要放下 Eclipse 下的开发 ...

  4. Javascript实例 -- 计时器, 搜索框,selected联动

    计时器: <body> <input type="text" id="i1"> <input type="button& ...

  5. HDP Spark2 HIVE3.1 的问题

    HDP 上安装了 Hive3.1 和 Spark2, 提交 Spark 作业时,报找不到 Hive 中表的问题 但是查一了下 hive 表,明明是存在这个表的.查看日志,注意到如下的一段日志. 没修改 ...

  6. Git从码云或者Github 克隆代码到本地

    Git从码云或者Github 克隆代码到本地 1.下载安装Git,傻瓜式下一步下一步即可... 2.配置Git: 2.1.选择你要clone到本地的路径:右键--->$ Git Bash Her ...

  7. 机器学习笔记(四)--sklearn数据集

    sklearn数据集 (一)机器学习的一般数据集会划分为两个部分 训练数据:用于训练,构建模型. 测试数据:在模型检验时使用,用于评估模型是否有效. 划分数据的API:sklearn.model_se ...

  8. HDU - 3085 Nightmare Ⅱ

    HDU - 3085 Nightmare Ⅱ 双向BFS,建立两个队列,让男孩女孩一起走 鬼的位置用曼哈顿距离判断一下,如果该位置与鬼的曼哈顿距离小于等于当前轮数的两倍,则已经被鬼覆盖 #includ ...

  9. 插入排序 思想 JAVA实现

    已知一个数组 60.28.41.39.6 .18 .14.28.49.31 利用插入排序算法进行排序 插入排序是一个运行时间为O(N²)的排序算法. 算法思想  60.28.41.39.6 .18 . ...

  10. mysql的left join、 right join和inner join

    1.定义 left join:左联接,返回包括左表中的所有记录和右表中符合条件的记录. right join:右联接,返回包括右表中的所有记录和左表中符合条件的记录. inner join:等值联接, ...