摘要:小駝峰式命名法首字母小寫(xiě)。函數(shù)命名動(dòng)詞含義返回值判斷是否可執(zhí)行某個(gè)動(dòng)作權(quán)限函數(shù)返回一個(gè)布爾值。
codereview 思考
提升代碼質(zhì)量
代碼復(fù)盤(pán)
有利于規(guī)范的落地
對(duì)業(yè)務(wù)的理解加深
表達(dá)溝通能力的增強(qiáng)
相互學(xué)習(xí)
儀式感
前端代碼規(guī)范Airbnb 代碼規(guī)范 https://github.com/airbnb/jav...命名規(guī)則eslint 代碼檢查 https://cn.eslint.org
korofileheader 注釋生成 https://marketplace.visualstu...
凹凸實(shí)驗(yàn)室代碼規(guī)范 https://guide.aotu.io/index.html
react 代碼規(guī)范 https://github.com/airbnb/jav...
vue 代碼規(guī)范 https://cn.vuejs.org/v2/style...
Pascal Case 大駝峰式命名法:首字母大寫(xiě)。eg:StudentInfo、UserInfo、ProductInfo Camel Case 小駝峰式命名法:首字母小寫(xiě)。eg:studentInfo、userInfo、productInfo函數(shù)命名
動(dòng)詞 | 含義 | 返回值 |
---|---|---|
can | 判斷是否可執(zhí)行某個(gè)動(dòng)作(權(quán)限) | 函數(shù)返回一個(gè)布爾值。true:可執(zhí)行;false:不可執(zhí)行 |
has | 判斷是否含有某個(gè)值 | 函數(shù)返回一個(gè)布爾值。true:含有此值;false:不含有此值 |
is | 判斷是否為某個(gè)值 | 函數(shù)返回一個(gè)布爾值。true:為某個(gè)值;false:不為某個(gè)值 |
get | 獲取某個(gè)值 | 函數(shù)返回一個(gè)非布爾值 |
set | 設(shè)置某個(gè)值 | 無(wú)返回值、返回是否設(shè)置成功或者返回鏈?zhǔn)綄?duì)象 |
load | 加載某些數(shù)據(jù) | 無(wú)返回值或者返回是否加載完成的結(jié)果 |
/* * @description: * @Author: xiaoping.zhang * @Date: 2019-02-17 10:22:28 * @LastEditors: xiaoping.zhang * @LastEditTime: 2019-02-17 10:22:28 */代碼片段注釋
/** * @Author: xiaoping.zhang * @description: * @return: * @Date: 2019-07-17 22:35:35 */類型 基本類型
字符串
數(shù)值
布爾類型
null
undefined
const foo = 1 let bar = foo bar = 9 console.log(foo, bar) // 1, 9復(fù)雜類型
object
array
function
const foo = [1, 2, 3] const bar = foo bar[0] = 9 console.log(foo[0], bar[0]) // 9, 9引用
對(duì)所有引用都使用 const,不要使用 var
// bad var a = 1 var b = 2 // good const a = 1 const b = 2
如果引用是可變動(dòng)的,則使用let
// bad var count = 1 if (count < 10) { count += 1 } // good let count = 1 if (count < 10) { count += 1 }對(duì)象
請(qǐng)使用字面量值創(chuàng)建對(duì)象
/ bad const a = new Object{} // good const a = {}
別使用保留字作為對(duì)象的鍵值,這樣在 IE8 下不會(huì)運(yùn)行
// bad const a = { default: {}, // default 是保留字 common: {} } // good const a = { defaults: {}, common: {} }
請(qǐng)使用對(duì)象方法的簡(jiǎn)寫(xiě)方式
const job = "FrontEnd" // bad const item = { job: job } // good const item = { job }
-對(duì)象屬性值的簡(jiǎn)寫(xiě)方式要和聲明式的方式分組
onst job = "FrontEnd" const department = "JDC" // bad const item = { sex: "male", job, age: 25, department } // good const item = { job, department, sex: "male", age: 25 }數(shù)組
請(qǐng)使用字面量值創(chuàng)建數(shù)組
// bad const items = new Array() // good const items = []
向數(shù)組中添加元素時(shí),請(qǐng)使用 push 方法
const items = [] // bad items[items.length] = "test" // good items.push("test")
使用拓展運(yùn)算符 ... 復(fù)制數(shù)組
// bad const items = [] const itemsCopy = [] const len = items.length let i // bad for (i = 0; i < len; i++) { itemsCopy[i] = items[i] } // good itemsCopy = [...items]
-使用數(shù)組的 map 等方法時(shí),請(qǐng)使用 return 聲明,如果是單一聲明語(yǔ)句的情況,可省略 return
// good [1, 2, 3].map(x => { const y = x + 1 return x * y }) // good [1, 2, 3].map(x => x + 1) // bad const flat = {} [[0, 1], [2, 3], [4, 5]].reduce((memo, item, index) => { const flatten = memo.concat(item) flat[index] = flatten }) // good const flat = {} [[0, 1], [2, 3], [4, 5]].reduce((memo, item, index) => { const flatten = memo.concat(item) flat[index] = flatten return flatten }) // bad inbox.filter((msg) => { const { subject, author } = msg if (subject === "Mockingbird") { return author === "Harper Lee" } else { return false } }) // good inbox.filter((msg) => { const { subject, author } = msg if (subject === "Mockingbird") { return author === "Harper Lee" } return false })解構(gòu)賦值
當(dāng)需要使用對(duì)象的多個(gè)屬性時(shí),請(qǐng)使用解構(gòu)賦值
// bad function getFullName (user) { const firstName = user.firstName const lastName = user.lastName return `${firstName} ${lastName}` } // good function getFullName (user) { const { firstName, lastName } = user return `${firstName} ${lastName}` } // better function getFullName ({ firstName, lastName }) { return `${firstName} ${lastName}` }
當(dāng)需要使用數(shù)組的多個(gè)值時(shí),請(qǐng)同樣使用解構(gòu)賦值
const arr = [1, 2, 3, 4] // bad const first = arr[0] const second = arr[1] // good const [first, second] = arr
函數(shù)需要回傳多個(gè)值時(shí),請(qǐng)使用對(duì)象的解構(gòu),而不是數(shù)組的解構(gòu)
// bad function doSomething () { return [top, right, bottom, left] } // 如果是數(shù)組解構(gòu),那么在調(diào)用時(shí)就需要考慮數(shù)據(jù)的順序 const [top, xx, xxx, left] = doSomething() // good function doSomething () { return { top, right, bottom, left } } // 此時(shí)不需要考慮數(shù)據(jù)的順序 const { top, left } = doSomething()字符串
字符串統(tǒng)一使用單引號(hào)的形式" "
// bad const department = "JDC" // good const department = "JDC"
字符串太長(zhǎng)的時(shí)候,請(qǐng)不要使用字符串連接符換行,而是使用 +
const str = "前端js規(guī)范" + "前端js規(guī)范" + "前端js規(guī)范前端js規(guī)范前端js規(guī)范"
程序化生成字符串時(shí),請(qǐng)使用模板字符串
const test = "test" // bad const str = ["a", "b", test].join() // bad const str = "a" + "b" + test // good const str = `ab${test}`函數(shù)
請(qǐng)使用函數(shù)聲明,而不是函數(shù)表達(dá)式
/ bad const foo = function () { // do something } // good function foo () { // do something }
不要在非函數(shù)代碼塊中聲明函數(shù)
// bad if (isUse) { function test () { // do something } } // good let test if (isUse) { test = () => { // do something } }
不要使用 arguments,可以選擇使用 ...
// bad function test (opts) { opts = opts || {} } // good function test (opts = {}) { // ... }模塊
使用標(biāo)準(zhǔn)的 ES6 模塊語(yǔ)法 import 和 export
// bad const util = require("./util") module.exports = util // good import Util from "./util" export default Util // better import { Util } from "./util" export default Util
不要使用 import 的通配符 *,這樣可以確保你只有一個(gè)默認(rèn)的 export
// bad import * as Util from "./util" // good import Util from "./util"迭代器
不要使用 iterators
const numbers = [1, 2, 3, 4, 5] // bad let sum = 0 for (let num of numbers) { sum += num } // good let sum = 0 numbers.forEach(num => sum += num) // better const sum = numbers.reduce((total, num) => total + num, 0)
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/105769.html
摘要:的報(bào)告進(jìn)一步證實(shí)了與成功項(xiàng)目最密切的因素是良好的需求管理,也就是項(xiàng)目的范圍管理,特別是管理好項(xiàng)目的變更。需求管理的第一步就是要梳理不同來(lái)源的需求,主要包括從產(chǎn)品定位出發(fā)外部用戶反饋競(jìng)爭(zhēng)對(duì)手情況市場(chǎng)變化以及內(nèi)部運(yùn)營(yíng)人員客服人員開(kāi)發(fā)人員的反饋。 showImg(https://upload-images.jianshu.io/upload_images/2509688-ac38883baf...
導(dǎo)語(yǔ): 隨著業(yè)務(wù)的增長(zhǎng)和開(kāi)發(fā)團(tuán)隊(duì)的成員快速增加,其中很多新人來(lái)自于五湖四海各大門(mén)派,在編碼的風(fēng)格和習(xí)慣中也出現(xiàn)各異。 通常在相互 codereview 時(shí)發(fā)現(xiàn)很多代碼上的問(wèn)題,久而久之代碼出現(xiàn)了代碼難以維護(hù)的問(wèn)題,甚至還會(huì)出現(xiàn)低級(jí)錯(cuò)誤。 因此,我嘗試在前端代碼質(zhì)量的管控上做了些探索,也總結(jié)了一些經(jīng)驗(yàn)分享給大家。 作者:鄭振波 本文大綱介紹 編碼規(guī)范 冗余文件與代碼 1. 編碼規(guī)范 在一些老項(xiàng)...
摘要:用不了多久,我們就會(huì)發(fā)現(xiàn)我們已經(jīng)無(wú)力償還這份技術(shù)債務(wù)啦,只能重構(gòu)啦。當(dāng)然,最重要的其實(shí)是把技術(shù)債務(wù)的重要性提到一個(gè)被認(rèn)可的位置上。切記一些重要的技術(shù)債務(wù)遠(yuǎn)遠(yuǎn)比開(kāi)發(fā)新系統(tǒng)的優(yōu)先級(jí)要高很多。 技術(shù)債務(wù) 「技術(shù)債務(wù)」是開(kāi)發(fā)團(tuán)隊(duì)在設(shè)計(jì)或架構(gòu)選型時(shí),從短期效應(yīng)的角度選擇了一個(gè)易于實(shí)現(xiàn)的方案。但從長(zhǎng)遠(yuǎn)來(lái)看,這種方案會(huì)帶來(lái)更消極的影響,亦即開(kāi)發(fā)團(tuán)隊(duì)所欠的債務(wù)。 簡(jiǎn)單的說(shuō)就是為了快速地解決問(wèn)題,而采取...
摘要:用不了多久,我們就會(huì)發(fā)現(xiàn)我們已經(jīng)無(wú)力償還這份技術(shù)債務(wù)啦,只能重構(gòu)啦。當(dāng)然,最重要的其實(shí)是把技術(shù)債務(wù)的重要性提到一個(gè)被認(rèn)可的位置上。切記一些重要的技術(shù)債務(wù)遠(yuǎn)遠(yuǎn)比開(kāi)發(fā)新系統(tǒng)的優(yōu)先級(jí)要高很多。 技術(shù)債務(wù) 「技術(shù)債務(wù)」是開(kāi)發(fā)團(tuán)隊(duì)在設(shè)計(jì)或架構(gòu)選型時(shí),從短期效應(yīng)的角度選擇了一個(gè)易于實(shí)現(xiàn)的方案。但從長(zhǎng)遠(yuǎn)來(lái)看,這種方案會(huì)帶來(lái)更消極的影響,亦即開(kāi)發(fā)團(tuán)隊(duì)所欠的債務(wù)。 簡(jiǎn)單的說(shuō)就是為了快速地解決問(wèn)題,而采取...
閱讀 3110·2019-08-30 15:56
閱讀 1259·2019-08-29 15:20
閱讀 1600·2019-08-29 13:19
閱讀 1514·2019-08-29 13:10
閱讀 3412·2019-08-26 18:27
閱讀 3092·2019-08-26 11:46
閱讀 2256·2019-08-26 11:45
閱讀 3800·2019-08-26 10:12