本文主要介绍一些 JS 中用到的小技巧,可以在日常 Coding 中提升幸福度。这些技巧可能大家大部分都用过了,如果用过就当作加深点映像,如果没有遇到过,就当作学会了几个技巧。
1.确保数组值
使用 grid ,需要重新创建原始数据,并且每行的列长度可能不匹配, 为了确保不匹配行之间的长度相等,可以使用 Array.fill
方法。
let array = Array(5).fill('');
console.log(array); // outputs (5) ["", "", "", "", ""]
2. 获取数组唯一值
ES6 提供了从数组中提取惟一值的两种非常简洁的方法。不幸的是,它们不能很好地处理非基本类型的数组。在本文中,主要关注基本数据类型。
const cars = [
'Mazda',
'Ford',
'Renault',
'Opel',
'Mazda'
]
const uniqueWithArrayFrom = Array.from(new Set(cars));
console.log(uniqueWithArrayFrom); // outputs ["Mazda", "Ford", "Renault", "Opel"]
const uniqueWithSpreadOperator = [...new Set(cars)];
console.log(uniqueWithSpreadOperator);// outputs ["Mazda", "Ford", "Renault", "Opel"]
3.string 强制转换为数字
可以用 *1
来转化为数字 (实际上是调用 .valueOf
方法),然后使用 Number.isNaN
来判断是否为 NaN
,或者使用 a !== a
来判断是否为 NaN
,因为 NaN !== NaN
'32'*1// 32
'ds'*1// NaN
null*1// 0
undefined*1// NaN
1* {valueOf:()=>'3'}// 3
常用:也可以使用 +
来转化字符串为数字
+'123'// 123
+'ds'// NaN
+''// 0
+null// 0
+undefined// NaN
+ {valueOf:()=>'3'}// 3
4.object 强制转化为 string
可以使用 字符串 +Object
的方式来转化对象为字符串 (实际上是调用 .toString()
方法)
'the Math object:'+Math// "the Math object:[object Math]"
'the JSON object:'+JSON// "the JSON object:[object JSON]"
当然也可以覆盖对象的 toString
和 valueOf
方法来自定义对象的类型转换:
2* {valueOf:()=>'3'}// 6
'J'+ {toString:()=>'S'}// "JS"
5.使用 Boolean 过滤数组中的所有假值
我们知道 JS 中有一些假值: false
, null
, 0
, ""
, undefined
, NaN
,怎样把数组中的假值快速过滤呢,可以使用 Boolean 构造函数来进行一次转换
constcompact =arr=>arr.filter(Boolean)
compact([0,1,false,2,'',3,'a','e'*23,NaN,'s',34])// [ 1, 2, 3, 'a', 's', 34 ]
6.强制参数
默认情况下,如果不向函数参数传值,那么 JS 会将函数参数设置为 undefined
。其它一些语言则会发出警告或错误。要执行参数分配,可以使用 if
语句抛出未定义的错误,或者可以利用 强制参数
。
mandatory =( )=>{
thrownewError('Missing parameter!');
}
foo =(bar = mandatory()) =>{// 这里如果不传入参数,就会执行 manadatory 函数报出错误
returnbar;
}
7.隐式返回值
返回值是我们通常用来返回函数最终结果的关键字。只有一个语句的箭头函数,可以隐式返回结果(函数必须省略大括号 { }
,以便省略返回关键字)。
要返回多行语句(例如对象文本),需要使用 ( )
而不是 { }
来包裹函数体。这样可以确保代码以单个语句的形式进行求值。
functioncalcCircumference(diameter){
returnMath.PI * diameter
}
// 简写为:
calcCircumference =diameter=>(
Math.PI * diameter;
)
8.惰性载入函数
在某个场景下我们的函数中有判断语句,这个判断依据在整个项目运行期间一般不会变化,所以判断分支在整个项目运行期间只会运行某个特定分支,那么就可以考虑惰性载入函数。
functionfoo(){
if(a !== b){
console.log('aaa')
} else {
console.log('bbb')
}
}
// 优化后
functionfoo(){
if (a != b) {
foo = function() {
console.log('aaa')
}
} else {
foo = function() {
console.log('bbb')
}
}
returnfoo();
}
9.一次性函数
跟上面的惰性载入函数同理,可以在函数体里覆写当前函数,那么可以创建一个一次性的函数,重新赋值之前的代码相当于只运行了一次,适用于运行一些只需要执行一次的初始化代码。
var sca = function() {
console.log('msg')
sca = function() {
console.log('foo')
}
}
sca()// msg
sca()// foo
sca()// foo
10.reduce 方法同时实现 map 和 filter
假设现在有一个数列,你希望更新它的每一项(map 的功能)然后筛选出一部分(filter 的功能)。如果是先使用 map 然后 filter 的话,你需要遍历这个数组两次。
在下面的代码中,我们将数列中的值翻倍,然后挑选出那些大于 50 的数。
constnumbers = [10,20,30,40];
constdoubledOver50 = numbers.reduce((finalList, num) => {
num = num *2;
if(num >50) {
finalList.push(num);
}
returnfinalList;
}, []);
doubledOver50;// [60, 80]