10 жалоб от моего босса, которые помогли мне многому научиться.
Предисловие
Вот как мой босс орал на членов команды во время совещаний по проверке кода. Причина в том, что он обнаружил, что многие части проекта все еще используют ES5. Не то, чтобы ES5 был плохим, будут баги, но он увеличит объем кода и снизит читабельность.
Так уж получилось, что у моего босса есть привычка к чистоте кода. Что касается сотрудников со стажем от 3 до 5 лет, то он крайне недоволен кодом такого уровня и постоянно жалуется на код. Тем не менее, я все еще чувствую, что многое выиграл от его жалоб, поэтому я решил записать жалобы босса и поделиться ими с вами.
1. Жалобы на извлечение значений объекта
Извлечение значений атрибутов очень распространено в программах, например получение значений из объекта obj.
const obj = { a: 1, b: 2, c: 3, d: 4, e: 5, } const a = obj.a const b = obj.b const c = obj.c const d = obj.d const e = obj.e // or const f = obj.a + obj.d const g = obj.c + obj.e
Жалоба BOSS: почему вы не используете назначение деструктуризации ES6, чтобы получить значение? Не лучше ли сделать это одной строкой кода?
const { a, b, c, d, e } = obj const f = a + d const g = c + e
Я возражаю: я не использую ES6, потому что имя свойства интерфейса API не то, что мне нужно.
БОСС жалуется: похоже, вы недостаточно хорошо освоили назначение деструктуризации ES6. Если имя переменной, которую вы хотите создать, не соответствует имени свойства объекта, вы можете написать это:
const { a: a1 } = obj || {} console.log(a1)// 1
2. Жалобы на слияние данных
Например, объединение двух массивов или объединение двух объектов.
const a = [ 1, 2, 3 ] const b = [ 1, 5, 6 ] const c = a.concat(b) // [ 1, 2, 3, 1, 5, 6] const obj1 = { a:1, } const obj2 = { b:1, } const obj = Object.assign({}, obj1, obj2) // { a: 1, b: 1}
Жалоба BOSS: вы забыли оператор распространения ES6, а объединение массивов не учитывает дедупликацию?
const a = [ 1, 2, 3 ] const b = [ 1, 5, 6 ] const c = [...new Set([...a,...b])] // [ 1, 2, 3, 5, 6 ] const obj1 = { a:1, } const obj2 = { b:1, } const obj = {...obj1,...obj2} // { a: 1, b: 1 }
3. Жалобы на сращивание струны.
const name = 'fatfish' const score = 59 let result = '' if(score > 60){ result = `${name}passed the exam` }else{ result = `${name}failed in the exam` }
жалуется BOSS: лучше не использовать строковые шаблоны ES6, как вы. Вы не знаете, что операции можно делать в ${}
? Мы можем выполнять произвольные выражения JavaScript в ${}
, выполнять операции и обращаться к свойствам объекта.
const name = 'fatfish' const score = 59 const result = `${name}${score > 60 ? 'passed the exam' : 'failed in the exam'}`
4. Жалобы на использование if
if( type == 1 || type == 2 || type == 3 || type == 4 || ){ //... }
Жалоба BOSS: не лучше ли нам использовать метод include для массивов в ES6?
const condition = [ 1, 2, 3, 4 ] if( condition.includes(type) ){ //... }
5. Жалобы на поиск по списку.
В проекте функция поиска некоторых списков реализована фронтендом, причем поиск в целом делится на два типа: точный и нечеткий. Как правило, для этого мы используем метод фильтра.
const a = [ 1, 2, 3, 4, 5 ] const result = a.filter( item => { return item === 3 } )
Жалоба BOSS: не могли бы вы использовать метод find в ES6 для точного поиска? Вы понимаете оптимизацию производительности? Если соответствующий элемент найден в методе find, он не будет продолжать обход массива.
const a = [ 1, 2, 3, 4, 5 ] const result = a.find(item => item === 3)
6. Жалобы на плоские массивы.
В данных JSON имя атрибута — это идентификатор отдела, а значение — массив идентификаторов сотрудников отдела. Теперь нам нужно извлечь все идентификаторы членов отдела в коллекцию массивов.
const deps = { 'department_1':[ 1, 2, 3 ], 'department_2':[ 5, 8, 12 ], 'department_3':[ 5, 14, 79 ], 'department_4':[ 3, 64, 105 ], } let member = [] for (let item in deps){ const value = deps[item] if(Array.isArray(value)){ member = [...member,...value] } } member = [...new Set(member)]
Жалоба BOSS: нужно ли мне проходить, чтобы получить все значения свойств объекта? Вы забыли про Object.values? Почему бы не использовать плоский метод, предоставляемый ES6?
const deps = { 'department_1':[ 1, 2, 3 ], 'department_2':[ 5, 8, 12 ], 'department_3':[ 5, 14, 79 ], 'department_4':[ 3, 64, 105 ], } let member = Object.values(deps).flat(Infinity)
Примечания: В качестве параметра flat используется бесконечность, поэтому нам не нужно знать размеры сглаженного массива.
7. Жалобы на получение значений атрибутов объекта.
const name = obj && obj.name
Жалоба BOSS: не будете ли вы использовать необязательный оператор цепочки в ES6?
const name = obj?.name
8. Жалобы на добавление свойств объекта.
Когда мы добавляем свойства к объекту, что нам делать, если имена свойств меняются динамически?
let obj = {} let index = 1 let key = `topic${index}` obj[key] = 'content'
Жалоба BOSS: зачем создавать лишнюю переменную. Разве вы не знаете, что имена свойств объекта в ES6 могут использовать выражения?
let obj = {} let index = 1 obj[`topic${index}`] = 'content'
9. Жалобы на непустое судебное решение
При обработке пользовательского ввода часто оценивается, было ли введено поле ввода.
if(value !== null && value !== undefined && value !== ''){ //... }
Жалоба BOSS: вы слышали о новом операторе объединения нулевых значений в ES6, вам нужно писать так много условий?
if((value ?? '') !== ''){ //... }
10. Жалобы на асинхронные функции
Асинхронные функции распространены и часто реализуются как обещания.
const fn1 = () =>{ return new Promise((resolve, reject) => { setTimeout(() => { resolve(1) }, 300) }) } const fn2 = () =>{ return new Promise((resolve, reject) => { setTimeout(() => { resolve(2) }, 600) }) } const fn = () =>{ fn1().then(res1 =>{ console.log(res1) // 1 fn2().then(res2 =>{ console.log(res2) }) }) }
Жалоба BOSS: если вы используете подобные асинхронные функции, вы не боитесь создать ад обратных вызовов!
const fn = async () =>{ const res1 = await fn1() const res2 = await fn2() console.log(res1) // 1 console.log(res2) // 2 }
Окончательно
Вы можете попытаться опровергнуть 10 жалоб BOSS, приведенных выше. Если ваше опровержение разумно, я опровергну его для вас на следующей встрече по обзору кода.
Перевод этой статьи был одобрен первоначальным автором (Hong chenlianxin).
Исходный адрес: https://juejin.cn/post/7016520448204603423
Спасибо, что прочитали.
Дополнительные материалы на PlainEnglish.io.
Подпишитесь на нашу бесплатную еженедельную рассылку новостей. Подпишитесь на нас в Twitter, LinkedIn, YouTube и Discord .
Заинтересованы в масштабировании запуска вашего программного обеспечения? Ознакомьтесь с разделом Схема.