用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. Android阻止AlertDialog关闭

    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); builder.setTitle("测试" ...

  2. [C#学习笔记]C#中的decimal类型——《CLR via C#》

    System.Decimal是非常特殊的类型.在CLR中,Decimal类型不是基元类型.这就意味着CLR没有知道如何处理Decimal的IL指令. 在文档中查看Decimal类型,可以看到它提供了一 ...

  3. Android 载入 HTML

    Android 中载入 HTML 有两种方式: 1. 用 TextView.setText(Html.fromHtml("<html></html>")); ...

  4. Android / iOS 招聘

    1. 面试题 https://github.com/ChenYilong/iOSInterviewQuestions 2. 一些不错的idea CDI - Développeur iOS/Androi ...

  5. Tomcat绿色版启动"startup.bat"一闪问题的解决方法!

    进入DOS窗口,运行"startup.bat",会出现错误提示,我是win7 64位,提示“JRE_HOME”设置不正确.于是进入环境变量配置,设置“JRE_HOME”项,随后保存 ...

  6. Python3.5 学习二

    模块/库: Python的强大在于丰富的各种库的存在. 用import方法导入的  分为标准库.第三方库 程序运行时会先从当前目录下寻找import的模块名的文件,如果没有,则去全局环境变量对应的路径 ...

  7. mysql 赋给用户远程权限 grant all privileges on

    我配置了权限 就可以在Windows下访问我虚拟机中的数据库了 来源:http://blog.csdn.net/louisliaoxh/article/details/52767209 登录: 在本机 ...

  8. sql注入原理详解(一)

    我们围绕以下几个方面来看这个问题: 1.什么是sql注入? 2.为什么要sql注入? 3.怎样sql注入? 1.什么是sql注入? 所谓SQL注入,就是通过把SQL命令插入到Web表单递交或输入域名或 ...

  9. mysql中字符串1.1/1.2/1.2.2/1.2.5排序问题

    1.创建查询函数:(split_pid为函数名称) create function split_pid(str varchar (1000),delimiter varchar(1)) returns ...

  10. (转)InnoDB存储引擎MVCC实现原理

    InnoDB存储引擎MVCC实现原理 原文:https://liuzhengyang.github.io/2017/04/18/innodb-mvcc/ 简单背景介绍 MySQL MySQL是现在最流 ...