1. 强类型检查
用===代替 ==
// 如果处理不当,它会极大地影响程序逻辑。这就像,你想向左走,但由于某种原因,你向右走 0 == false // true 0 === false // false 2 == "2" // true 2 === "2" // false
// 例子 const value = "500"; if (value === 500) { console.log(value); // 条件不成立,不会进入 } if (value === "500") { console.log(value); // 条件成立,会进入 }
2.变量
用知名其意的方式为变量命名,通过这种方式,当一个人看到它们时,易于搜索和理解。
不好的方式:
let daysslv = 10; let y = new date().getfullyear(); let ok; if (user.age > 30) { ok = true; } 好的方式: const max_age = 30; let dayssincelastvisit = 10; let currentyear = new date().getfullyear(); ... const isuserolderthanallowed = user.age > max_age;
不要在变量名中添加额外的不需要的单词。
不好的方式: let namevalue; let theproduct; 好的方式: let name; let product; 不要简写变量上下文。 不好的方式: const users = ["john", "marco", "peter"]; users.foreach(u => { dosomething(); dosomethingelse(); // ... // ... // ... // ... // 当上面代码很多的时候 ,这 `u` 是什么鬼 register(u); }); 好的方式: const users = ["john", "marco", "peter"]; users.foreach(user => { dosomething(); dosomethingelse(); // ... // ... // ... // ... register(user); }); 不要添加不必要的上下文。 不好的方式: const user = { username: "john", usersurname: "doe", userage: "28" }; ... user.username; 好的方式: const user = { name: "john", surname: "doe", age: "28" }; ... user.name;
3. 函数
使用长而具有描述性的名称。 考虑到函数表示某种行为,函数名称应该是动词或短语,用以说明其背后的意图以及参数的意图。 函数的名字应该说明他们做了什么。
不好的方式:
function notif(user) { // implementation } 好的方式: function notifyuser(emailaddress) { // implementation }
避免使用大量参数。 理想情况下,函数应该指定两个或更少的参数。 参数越少,测试函数就越容易,参数多的情况可以使用对象。
不好的方式:
function getusers(fields, fromdate, todate) { // implementation } 好的方式: function getusers({ fields, fromdate, todate }) { // implementation } getusers({ fields: ['name', 'surname', 'email'], fromdate: '2019-01-01', todate: '2019-01-18' });
使用默认参数替代 || 操作
不好的方式: function createshape(type) { const shapetype = type || "cube"; // ... } 好的方式: function createshape(type = "cube") { // ... }
一个函数应该只做一件事,不要在一个函数中执行多个操作。
不好的方式: function notifyusers(users) { users.foreach(user => { const userrecord = database.lookup(user); if (userrecord.isverified()) { notify(user); } }); } 好的方式: function notifyverifiedusers(users) { users.filter(isuserverified).foreach(notify); } function isuserverified(user) { const userrecord = database.lookup(user); return userrecord.isverified(); }
使用object.assign设置对象默认值。
不好的方式: const shapeconfig = { type: "cube", width: 200, height: null }; function createshape(config) { config.type = config.type || "cube"; config.width = config.width || 250; config.height = config.height|| 250; } createshape(shapeconfig); 好的方式: const shapeconfig = { type: "cube", width: 200 // exclude the 'height' key }; function createshape(config) { config = object.assign( { type: "cube", width: 250, height: 250 }, config ); ... } createshape(shapeconfig);
不要使用标志作为参数,因为它们告诉函数做的比它应该做的多。
不好的方式: function createfile(name, ispublic) { if (ispublic) { fs.create(`./public/${name}`); } else { fs.create(name); } } 好的方式: function createfile(name) { fs.create(name); } function createpublicfile(name) { createfile(`./public/${name}`); }
不要污染全局变量。 如果需要扩展现有对象,请使用es类和继承,而不是在原生对象的原型链上创建函数。
不好的方式: array.prototype.myfunc = function myfunc() { // implementation }; 好的方式: class superarray extends array { myfunc() { // implementation } }
4. 条件
避免使用反面条件。
不好的方式: function isusernotblocked(user) { // implementation } if (!isusernotblocked(user)) { // implementation } 好的方式: function isuserblocked(user) { // implementation } if (isuserblocked(user)) { // implementation }
使用条件简写。这可能微不足道,但值得一提。仅对布尔值使用此方法,并且如果你确信该值不会是undefined 或null的,则使用此方法。
不好的方式: if (isvalid === true) { // do something... } if (isvalid === false) { // do something... } 好的方式: if (isvalid) { // do something... } if (!isvalid) { // do something... }
尽可能避免条件句,而是使用多态性和继承。
不好的方式: class car { // ... getmaximumspeed() { switch (this.type) { case "ford": return this.somefactor() + this.anotherfactor(); case "mazda": return this.somefactor(); case "mclaren": return this.somefactor() - this.anotherfactor(); } } } 好的方式: class car { // ... } class ford extends car { // ... getmaximumspeed() { return this.somefactor() + this.anotherfactor(); } } class mazda extends car { // ... getmaximumspeed() { return this.somefactor(); } } class mclaren extends car { // ... getmaximumspeed() { return this.somefactor() - this.anotherfactor(); } }
5. 类
class 是javascript中新的语法糖。一切工作就像以前的原型,只是它现在看起来不同,你应该更喜欢他们比es5普通功能。
不好的方式: const person = function(name) { if (!(this instanceof person)) { throw new error("instantiate person with `new` keyword"); } this.name = name; }; person.prototype.sayhello = function sayhello() { /**/ }; const student = function(name, school) { if (!(this instanceof student)) { throw new error("instantiate student with `new` keyword"); } person.call(this, name); this.school = school; }; student.prototype = object.create(person.prototype); student.prototype.constructor = student; student.prototype.printschoolname = function printschoolname() { /**/ }; 好的方式: class person { constructor(name) { this.name = name; } sayhello() { /* ... */ } } class student extends person { constructor(name, school) { super(name); this.school = school; } printschoolname() { /* ... */ } }
使用链接。许多库(如jquery和lodash)都使用这种模式。在类中,只需在每个函数的末尾返回this就可以将更多的该类方法链接到它上。
不好的方式: class person { constructor(name) { this.name = name; } setsurname(surname) { this.surname = surname; } setage(age) { this.age = age; } save() { console.log(this.name, this.surname, this.age); } } const person = new person("john"); person.setsurname("doe"); person.setage(29); person.save(); 好的方式: class person { constructor(name) { this.name = name; } setsurname(surname) { this.surname = surname; // return this for chaining return this; } setage(age) { this.age = age; // return this for chaining return this; } save() { console.log(this.name, this.surname, this.age); // return this for chaining return this; } } const person = new person("john") .setsurname("doe") .setage(29) .save();
总结
这只是改进代码的一小部分。一般生活入,这里所说的原则是人们通常不遵守的原则。他们尝试着去做,但出于各种原因,就没有坚持下去。也许在项目开始时,代码是简洁的,但是当要在截止日期前完成时,这些原则常常被忽略,并被转移到“todo”或“refactor”部分。在这一点上,你的客户更希望您在最后期限之前完成任务,而不是编写简洁的代码。
发表评论