JavaScript开发技巧收集
2021-02-20 10:37:31 0 举报
AI智能生成
JavaScript开发技巧收集
作者其他创作
大纲/内容
判空并赋默认值
描述
判断变量不是null,undefined,''的时候赋值给第二个变量,否则给个默认值
举例
较长表达式
if (first !== null || first !== undefined || first !== '') {
let second = first;
}
let second = first;
}
简写
let second = first || '';
简写循环遍历
描述
for 循环是最基本的,但是有点繁琐。可以用for...in、for...of或者forEach代替
举例
对象
长表达式
for (var i = 0; i < testData.length; i++)
简写
for (let i in testData) or for (let i of testData)
数组
长表达式
function testData(element, index, array) {
console.log('test[' + index + '] = ' + element);
}
console.log('test[' + index + '] = ' + element);
}
简写
[11, 24, 32].forEach(testData);
简化多行字符串拼接
描述
字符串表达式过长,我们可能会拆成多行拼接的方式。不过随着 ES6 的普及,更好的做法是用模板字符串
举例
长表达式
const data = 'abc abc abc abc abc abc\n\t'
+ 'test test,test test test test\n\t'
+ 'test test,test test test test\n\t'
简写
const data = `abc abc abc abc abc abc
test test,test test test test`
test test,test test test test`
简化分支条件语句
描述
if...else if...else!跟switch类似,也可以用key-value形式简化
举例
长表达式
if (type === 'test1') {
test1();
}
else if (type === 'test2') {
test2();
}
else if (type === 'test3') {
test3();
}
else if (type === 'test4') {
test4();
} else {
throw new Error('Invalid value ' + type);
}
test1();
}
else if (type === 'test2') {
test2();
}
else if (type === 'test3') {
test3();
}
else if (type === 'test4') {
test4();
} else {
throw new Error('Invalid value ' + type);
}
简写
var types = {
test1: test1,
test2: test2,
test3: test3,
test4: test4
};
var func = types[type];
(!func) && throw new Error('Invalid value ' + type); func();
test1: test1,
test2: test2,
test3: test3,
test4: test4
};
var func = types[type];
(!func) && throw new Error('Invalid value ' + type); func();
指数运算
举例
长表达式
Math.pow(2,3);
简写
2**3
空值合并操作符(??)
描述
只有当左侧为null和undefined时,才会返回右侧的数
空值合并操作符(??)是一个逻辑操作符,当左侧的操作数为 null 或者 undefined 时,返回其右侧操作数,否则返回左侧操作数
与逻辑或操作符(||)不同,逻辑或操作符会在左侧操作数为假值时返回右侧操作数。也就是说,如果使用 || 来为某些变量设置默认值,可能会遇到意料之外的行为。比如为假值(例如,'' 或 0)时
举例
const foo = null ?? 'default string';
console.log(foo);
// expected output: "default string"
const baz = 0 ?? 42;
console.log(baz);
// expected output: 0
console.log(foo);
// expected output: "default string"
const baz = 0 ?? 42;
console.log(baz);
// expected output: 0
const nullValue = null;
const emptyText = ""; // 空字符串,是一个假值,Boolean("") === false
const someNumber = 42;
const valA = nullValue ?? "valA 的默认值";
const valB = emptyText ?? "valB 的默认值";
const valC = someNumber ?? 0;
console.log(valA); // "valA 的默认值"
console.log(valB); // ""(空字符串虽然是假值,但不是 null 或者 undefined)
console.log(valC); // 42
const emptyText = ""; // 空字符串,是一个假值,Boolean("") === false
const someNumber = 42;
const valA = nullValue ?? "valA 的默认值";
const valB = emptyText ?? "valB 的默认值";
const valC = someNumber ?? 0;
console.log(valA); // "valA 的默认值"
console.log(valB); // ""(空字符串虽然是假值,但不是 null 或者 undefined)
console.log(valC); // 42
出处
简化条件表达式
描述
判断某个变量是否为指定的某些值,用常规的逻辑表达式会很长。做法是把这些值放进数组里
举例
过长的表达式
if (x === 'abc' || x === 'def' || x === 'ghi' || x ==='jkl') {
//其他逻辑
}
//其他逻辑
}
简写
if (['abc', 'def', 'ghi', 'jkl'].includes(x)) {
//其他逻辑
}
//其他逻辑
}
简化 if ... else
描述
简单的变量赋值,完全没必要用这种冗长的语句,一行表达式就搞定
举例
较长的表达式
let test= boolean;
if (x > 100) {
test = true;
} else {
test = false;
}
if (x > 100) {
test = true;
} else {
test = false;
}
简写
// 简写表达式
let test = (x > 10) ? true : false;
// 更直接的
let test = x > 10;
console.log(test);
let test = (x > 10) ? true : false;
// 更直接的
let test = x > 10;
console.log(test);
补充
三元表达式可以做复杂的条件分支判断,会牺牲可读性
let x = 300,
let test2 = (x > 100) ? 'greater than 100' : (x < 50) ? 'less 50' : 'between 50 and 100';
console.log(test2); // "greater than 100"
let test2 = (x > 100) ? 'greater than 100' : (x < 50) ? 'less 50' : 'between 50 and 100';
console.log(test2); // "greater than 100"
简化 switch
描述
把switch 转换成对象的key-value形式
举例
长表达式
switch (data) {
case 1:
test1();
break;
case 2:
test2();
break;
case 3:
test();
break;
// And so on...
}
case 1:
test1();
break;
case 2:
test2();
break;
case 3:
test();
break;
// And so on...
}
简写
var data = {
1: test1,
2: test2,
3: test
};
data[anything] && data[anything]();
1: test1,
2: test2,
3: test
};
data[anything] && data[anything]();
善用箭头函数简化 return
描述
当函数简单到只需要返回一个表达式时,用箭头函数最合适不过了,return都不用写
举例
长表达式
function getArea(diameter) {
return Math.PI * diameter
}
return Math.PI * diameter
}
简写
getArea = diameter => (
Math.PI * diameter;
)
Math.PI * diameter;
)
重复字符串 N 次
描述
出于某种目的需要将字符串重复 N 次,最笨的方法就是用for循环拼接。其实更简单的方法是用repeat
举例
长表达式
let test = '';
for(let i = 0; i < 5; i ++) {
test += 'test ';
}
console.log(str); // test test test test test
for(let i = 0; i < 5; i ++) {
test += 'test ';
}
console.log(str); // test test test test test
简写
'test '.repeat(5);
数字分隔符
描述
ES2021 提出来的,数字字面量可以用下划线分割,提高了大数字的可读性
举例
长表达式
let number = 98234567
简写
let number = 98_234_567
可选链操作符( ?. )
描述
可选链操作符( ?. )允许读取位于连接对象链深处的属性的值,而不必明确验证链中的每个引用是否有效
?. 操作符的功能类似于 . 链式操作符,不同之处在于,在引用为空(nullish ) (null 或者 undefined) 的情况下不会引起错误,该表达式短路返回值
举例
const adventurer = {
name: 'Alice',
cat: {
name: 'Dinah'
}
};
const dogName = adventurer.dog?.name;
console.log(dogName);
// expected output: undefined
console.log(adventurer.someNonExistentMethod?.());
// expected output: undefined
name: 'Alice',
cat: {
name: 'Dinah'
}
};
const dogName = adventurer.dog?.name;
console.log(dogName);
// expected output: undefined
console.log(adventurer.someNonExistentMethod?.());
// expected output: undefined
语法
obj?.prop
let myMap = new Map();
myMap.set("foo", {name: "baz", desc: "inga"});
let nameBar = myMap.get("bar")?.name;
myMap.set("foo", {name: "baz", desc: "inga"});
let nameBar = myMap.get("bar")?.name;
obj?.[expr]
可选链与表达式:
let nestedProp = obj?.['prop' + 'Name'];
arr?.[index]
可选链访问数组:
let arrayItem = arr?.[42];
func?.(args)
函数调用
let result = someInterface.customMethod?.();
如果希望允许 someInterface 也为 null 或者 undefined ,那么你需要像这样写 someInterface?.customMethod?.()
如果希望允许 someInterface 也为 null 或者 undefined ,那么你需要像这样写 someInterface?.customMethod?.()
短路计算
let potentiallyNullObj = null;
let x = 0;
let prop = potentiallyNullObj?.[x++];
console.log(x); // x 将不会被递增,依旧输出 0
当在表达式中使用可选链时,如果左操作数是 null 或 undefined,表达式将不会被计算
let x = 0;
let prop = potentiallyNullObj?.[x++];
console.log(x); // x 将不会被递增,依旧输出 0
当在表达式中使用可选链时,如果左操作数是 null 或 undefined,表达式将不会被计算
连用可选链操作
let customer = {
name: "Carl",
details: {
age: 82,
location: "Paradise Falls" // details 的 address 属性未有定义
}
};
let customerCity = customer.details?.address?.city;
// … 可选链也可以和函数调用一起使用
let duration = vacations.trip?.getTime?.();
name: "Carl",
details: {
age: 82,
location: "Paradise Falls" // details 的 address 属性未有定义
}
};
let customerCity = customer.details?.address?.city;
// … 可选链也可以和函数调用一起使用
let duration = vacations.trip?.getTime?.();
空值合并操作符可以在使用可选链时设置一个默认值:
let customer = {
name: "Carl",
details: { age: 82 }
};
let customerCity = customer?.city ?? "暗之城";
console.log(customerCity); // “暗之城”
name: "Carl",
details: { age: 82 }
};
let customerCity = customer?.city ?? "暗之城";
console.log(customerCity); // “暗之城”
出处
0 条评论
下一页