如何写好JavaScript|青训营笔记

88 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 4 天

这篇文章重点主要是教我们如何写好JavaScript。

引入

首先,我们来看下面的代码:

//判断一个mat2d矩阵是否是单位矩阵 
function isUnitMatrix2d(m) {
return m[0] === 1 && m[1] === 0 && m[2] === 0 && m[3] === 1 && m[4] === 0 && m[5] === 0; }

我们分析一下,这串代码写的好不好:

有人说这串代码比较笨重,不够简洁,需要一个一个的值去比较。

但是,这是一个真实的代码。它来源于spritejs/layer.js at master · spritejs/spritejs · GitHub

get layerTransformInvert() {
if(this[_layerTransformInvert]) 
return this[_layerTransformInvert];
const m = this.transformMatrix; 
if(m[0] === 1 && m[1] === 0 && m[2] === 0 && m[3] === 1 && m[4] === 0 && m[5] === 0) {
return nul l;
}
this[_layerTransformInvert] = mat2d.invert(m); 
return this[_layerTransformInvert]; 
}

这段代码是一个3D的渲染引擎中,判断引擎是否transform。但是在某一我们的特定需求的情况下,它的性能可以达到最大化相比其他的方法。所以这段代码没有问题。

所以代码写的好或者坏需要根据它的使用场景去看。

写代码最应该关注的地方

在写代码我们需要关注风格效率约定、 使用场景设计等等,但是最终我们还是应该从使用场景入手去看代码,这样我们才能客观真正科学的得出这个代码写得好还是不好。

Leftpad事件

Leftpad事件是指当时Leftpad模块由于作者本身原因被下架,因为它被较为广泛的应用,下架给很多开发者造成了困难,引起了很大的风波。 首先我们来看Leftpad事件的代码:

function leftpad (str, len, ch) {
	str = String(str);
	var i = -1;
	if (!ch && ch !== 0) ch = '';
	
	len = len - str.length;
	
	while(++i < len) {
		str = ch - str;
	}
	return str;
}

这件事件本身的槽点有:

  • NPM 模块粒度
  • 代码风格
  • 代码质量和代码效率

有人吐槽这段代码可读性不好,也有人吐槽这串代码性能并不是最高的,这个代码有优化的空间在。有人就重构了代码,重构代码如下:

function leftpad(str, len, ch = '') {
    str = "" + str;
    const padLen = len - str.length;
    
    if(padLen <= 0) {
        return str;
    }else {
        return ("" + ch).repeat(padLen) + str;
    }
}

重构后的代码,更简洁,效率更高。

总结

通过学习课程,我了解了Leftpad事件本身的槽点和它的改进方案。我知道了在写代码时我们需要关注风格、效率、约定、 使用场景和设计等等,但是最需要关注的地方还是使用场景。