js 代码风格(2)

- var luke = {
- jedi: true,
- age: 28
- };
- // bad
- var isJedi = luke['jedi'];
- // good
- var isJedi = luke.jedi;

• 当以变量的方式访问属性的时候,用下标符号([])。——除非特殊需求,否则尽量避免使用obj[variable]的方式进行属性访问。

- var luke = {
- jedi: true,
- age: 28
- };
- function getProp(prop) {
- return luke[prop];
- }
- var isJedi = getProp('jedi');

- // bad
- superPower = new SuperPower();
- // good
- var superPower = new SuperPower();
汤姆大叔—javascript系列文章中提到“JavaScript有隐含的全局概念,意味着你不声明的任何变量都会成为一个全局对象属性。在技术上,隐式全局变量并不是真正的全局变量,但它们是全局对象的属性。属性是可以通过
delete
操作符删除的,而变量是不能的。"

- // bad
- var items = getItems();
- var goSportsTeam = true;
- var dragonball = 'z';
- // good
- var items = getItems(),
- goSportsTeam = true,
- dragonball = 'z';

• 用var定义多个变量的时候,把不进行赋值的变量放置到最后——这是相当有益的。尤其是当你的变量需要赋前面变量值的时候。

- // bad
- var i, len, dragonball,
- items = getItems(),
- goSportsTeam = true;
- // bad
- var i, items = getItems(),
- dragonball,
- goSportsTeam = true,
- len;
- // good
- var items = getItems(),
- goSportsTeam = true,
- dragonball,
- length,
- i;

• 把你的赋值变量放置在当前作用域的顶端。这将避免变量声明和hoisting(悬置/置顶解析/预解析)的问题。

- // bad
- function() {
- test();
- console.log('doing stuff..');
- //..other stuff..
- var name = getName();
- if (name === 'test') {
- return false;
- }
- return name;
- }
- // good
- function() {
- var name = getName();
- test();
- console.log('doing stuff..');
- //..other stuff..
- if (name === 'test') {
- return false;
- }
- return name;
- }
- // bad
- function() {
- var name = getName();
- if (!arguments.length) {
- return false;
- }
- return true;
- }
- // good
- function() {
- if (!arguments.length) {
- return false;
- }
- var name = getName();
- return true;
- }

汤姆大叔:1、JavaScript中,你可以在函数的任何位置声明多个var语句,并且它们就好像是在函数顶部声明一样发挥作用,这种行为称为 hoisting(悬置/置顶解析/预解析)。2、对于JavaScript,只 要你的变量是在同一个作用域中(同一函数),它都被当做是声明的,即使是它在var声明前使用的时候。

- function example() {
- console.log(notDefined); // => throws a ReferenceError
- }
- function example() {
- console.log(declaredButNotAssigned); // => undefined
- var declaredButNotAssigned = true;
- }
- function example() {
- var declaredButNotAssigned;
- console.log(declaredButNotAssigned); // => undefined
- declaredButNotAssigned = true;
- }

• 匿名表达式会自动提升它们的变量名称(也就是说在var anonymous上面,example函数就已经知道有这个变量了),但是它们的函数体不会。

- function example() {
- console.log(anonymous); // => undefined
- anonymous(); // => TypeError anonymous is not a function
- var anonymous = function() {
- console.log('anonymous function expression');
- };
- }

• 命名函数表达式也会提升它们的变量名称,而它们的函数名称和函数体不会这样做。

- function example() {
- console.log(named); // => undefined
- named(); // => TypeError named is not a function
- superPower(); // => ReferenceError superPower is not defined
- var named = function superPower() {
- console.log('Flying');
- };
- function example() {
- console.log(named); // => undefined
- named(); // => TypeError named is not a function
- var named = function named() {
- console.log('named');
- };
- }
- }

• 注意:函数声明会提升它们的变量名称还有它们的函数体。

- function example() {
- superPower(); // => Flying
- function superPower() {
- console.log('Flying');
- }
- }

== 和 != 会进行隐式类型转换,所以建议使用===和!==。
- if ([0]) {
- // true
- // An array is an object, objects evaluate to true
- }
• 使用快捷方式。

- // bad
- if (name !== '') {
- // ...stuff...
- }
- // good
- if (name) {
- // ...stuff...
- }
- // bad
- if (collection.length > 0) {
- // ...stuff...
- }
- // good
- if (collection.length) {
- // ...stuff...
- }

- // bad
- if (test)
- return false;
- // good
- if (test) return false;
- // good
- if (test) {
- return false;
- }
- // bad
- function() { return false; }
- // good
- function() {
- return false;
- }


- // bad
- // make() returns a new element
- // based on the passed in tag name
- //
- // @param <String> tag
- // @return <Element> element
- function make(tag) {
- // ...stuff...
- return element;
- }
- // good
- /**
- * make() returns a new element
- * based on the passed in tag name
- *
- * @param <String> tag
- * @return <Element> element
- */
- function make(tag) {
- // ...stuff...
- return element;
- }


- // bad
- var active = true; // is current tab
- // good
- // is current tab
- var active = true;
- // bad
- function getType() {
- console.log('fetching type...');
- // set the default type to 'no type'
- var type = this._type || 'no type';
- return type;
- }
- // good
- function getType() {
- console.log('fetching type...');
- // set the default type to 'no type'
- var type = this._type || 'no type';
- return type;
- }

• 对于一些问题,注释前加FIXME或TODO,这样将快速帮助开发者快速明白代码意图。
• 使用 // FIXME: 注释问题

- function Calculator() {
- // FIXME: shouldn't use a global here
- total = 0;
- return this;
- }

• 使用 // TODO: 注释问题的解决方案

- function Calculator() {
- // TODO: total should be configurable by an options param
- this.total = 0;
- return this;
- }


- // => this.reviewScore = 9;
- // bad
- var totalScore = this.reviewScore + '';
- // good
- var totalScore = '' + this.reviewScore;
- // bad
- var totalScore = '' + this.reviewScore + ' total score';
- // good
- var totalScore = this.reviewScore + ' total score';

• 对于数字转换,使用parseInt,而且要带着类型转换的基数。
• 如果parseInt成为你的瓶颈,处于性能原因,需要你使用“位移”操作。那么请写下注释解释你这样做的原因。

- var inputValue = '4';
- // bad
- var val = new Number(inputValue);
- // bad
- var val = +inputValue;
- // bad
- var val = inputValue >> 0;
- // bad
- var val = parseInt(inputValue);
- // good
- var val = Number(inputValue);
- // good
- var val = parseInt(inputValue, 10);
- // good
- /**
- * parseInt 使我的代码变慢.
- * 为了提高速度,使用位移操作让字符串强制转化为数字。
- */
- var val = inputValue >> 0;

• 布尔

- var age = 0;
- // bad
- var hasAge = new Boolean(age);
- // good
- var hasAge = Boolean(age);
- // good
- var hasAge = !!age;


- function Jedi() {
- console.log('new jedi');
- }
- // bad
- Jedi.prototype = {
- fight: function fight() {
- console.log('fighting');
- },
- block: function block() {
- console.log('blocking');
- }
- };
- // good
- Jedi.prototype.fight = function fight() {
- console.log('fighting');
- };
- Jedi.prototype.block = function block() {
- console.log('blocking');
- };


- // bad
- Jedi.prototype.jump = function() {
- this.jumping = true;
- return true;
- };
- Jedi.prototype.setHeight = function(height) {
- this.height = height;
- };
- var luke = new Jedi();
- luke.jump(); // => true
- luke.setHeight(20) // => undefined
- // good
- Jedi.prototype.jump = function() {
- this.jumping = true;
- return this;
- };
- Jedi.prototype.setHeight = function(height) {
- this.height = height;
- return this;
- };
- var luke = new Jedi();
- luke.jump()
- .setHeight(20);

• 我们可以自定义一个toString()方法。——要确保它能正常运行,而且不会产生其他影响。

- function Jedi(options) {
- options || (options = {});
- this.name = options.name || 'no name';
- }
- Jedi.prototype.getName = function getName() {
- return this.name;
- };
- Jedi.prototype.toString = function toString() {
- return 'Jedi - ' + this.getName();
- };


js 代码风格(2)的更多相关文章
- 大神的JS代码风格指南
js代码风格指南:1.缩进使用空格,不要用制表符2.必须用分号3.暂时不用ES6(modules)例如export和import命令4.不鼓励(不禁止)水平对齐5.少用var 都应该使用const或者 ...
- Google HTML/CSS/JS代码风格指南
JS版本参见:http://www.zhangxinxu.com/wordpress/2012/07/google-html-css-javascript-style-guides/ HTML/CSS ...
- JS代码风格自动规整工具Prettier
问题背景 通常使用 ESLint做代码风格检查检查, 和部分代码质量检查. 但是使用ESLint在入库时候, 会产生很多的代码修正工作, 需要开发者一个一个的修改. 如果很多,并且时间紧迫,甚是尴尬. ...
- JS代码风格指南
一.基本格式 缩进 建议每级4个空格,可以给编辑器设置tab = 4个空格,自动转换 分号 不要省略分号,防止ASI(自动插入分号)错误 行宽 每行代码不超过80个字符,过长应该用操作符手动断行 断行 ...
- highlight.js代码风格引入方法
<link href="https://cdn.bootcss.com/highlight.js/9.15.10/styles/darcula.min.css" rel=&q ...
- js代码风格之链式结构
<div class="box"> <ul class="menu"> <li class="level1"& ...
- [Js代码风格]浅析模块模式
1.实例解释模块模式 简明扼要的说,经典的模块模式指的定义一个立即执行的匿名函数.在函数中定义私有函数和私有变量并且返回一个包含公共变量和公共函数作为属性和方法的匿名对象. var classicMo ...
- Django之代码风格
1 代码风格 稍微关注一下下面这些代码标准风格指导规则将会对你大有益处,我们高度建议你通读词章,即便你此时可能正想跳过它. 1.1 让你的代码保持可读性的重要性 代码在读方面的重要性胜过写.一个代码块 ...
- .NET 项目代码风格要求
原文:http://kb.cnblogs.com/page/179593/ 项目代码风格要求 PDF版下载:项目代码风格要求V1.0.pdf 代码风格没有正确与否,重要的是整齐划一,这是我拟的一份&l ...
随机推荐
- 实现toggleClass功能
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- android回调函数
在我们进行android开发的时候,常常遇到一些回调函数,当中,我们最常常使用的回调就是,当我们对一个组件设置监听的时候,事实上就相对于设置的回调函数.比如: Button btn = (Button ...
- 微信小程序innerAudioContext接口
voice:function(){ var word = this.data.word; var src = 'https://--/'+word['word']+'.mp3'; console.lo ...
- [Swift A] - DataSource 与 Delegate有啥区别?
lukeluke 2012-05-22 07:46 是不是DATASOURCE,提供的是原来对象里并没有的数据,比如,共有几个ITEM啊, 而DELEGATE里,提供的是原来就有的数据,只不过 ...
- Spring Boot(二)Application events and listeners
一.自定义监听器: 1.创建: META-INF/spring.factories 2.添加: org.springframework.context.ApplicationListener=com. ...
- shell中$0,$?,$!等的特殊使用方法
变量说明: $$ Shell本身的PID(ProcessID) $! Shell最后执行的后台Process的PID $? 最后执行的命令的结束代码(返回值) $- 使用Set命令设定的Flag一览 ...
- 使用css3属性transition实现页面滚动
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-type" content ...
- C# EF更新当前实体报错 ObjectManager无法管理具有相同键值的多个对象
原因: ObjectManager已经在跟踪此对象 更新实体前判断 if (db.Entry<T>(t).State != EntityState.Modified) db.Entry&l ...
- 自制MVC框架基础插件介绍
本文介绍的基础插件不是实现BeforehandCommonAttribute或ProceedPlugin的postsharp插件,这些都是自定义的基础性的拦截,而且在项目中经常用到. 1). Comp ...
- 捅伊朗黑客PP — 后台登陆POST+错误回显 注入
看了一个泰国政府的网站被伊朗的黑客挂页,上面写着“Your Box 0wn3z By Behrooz_Ice – Q7x -Sha2ow -Virangar -Ali_Eagle -iman_takt ...