学会这些 JS 小技巧,提升编码幸福度
编程相关|

本文主要介绍一些 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]

帮助中心

使用文档

服务价格

提交需求 在线咨询

联系方式

尖草坪区龙康街,青年城1-2-1003

山西省,太原市

isharebest@gmail.com

周一至周五 09:00-18:00

关注我们