变量无处不在,即使我们在写一个小的函数,或者一个应用程序:我们总是先声明,分配和使用变量。编写好的变量可提高代码的可读性和易维护性。
在本文中,主要介绍 5种有关在 JavaScript 中声明和使用变量的最佳做法。
我使用const或let声明变量,两者之间的主要区别是const变量需要一个初始值,并且一旦初始化就无法重新分配其值。
另一方面,let声明不需要初始值,我们可以多次重新分配其值。
// const 需要初始化
const pi = 3.14;
// 不能重新分配const
pi = 4.89; // throws "TypeError: Assignment to constant variable"
另一方面,let声明不需要初始值,我们可以多次重新分配其值。
// let 初始化是可选的
let result;
// let can be reassigned
result = 14;
result = result * 2;
选择变量的声明类型时的一个好习惯是首选const,否则使用let。
function myBigFunction(param1, param2) {
/* lots of stuff... */
const result = otherFunction(param1);
/* lots of stuff... */
return something;
}
例如,如果我们正在查看函数体,并看到const result = ...声明:
function myBigFunction(param1, param2) {
/* lots of stuff... */
const result = otherFunction(param1);
/* lots of stuff... */
return something;
}
不知道myBigFunction()内部会发生什么, 我们可以得出结论,result 变量只分配了一次,声明之后是只读的。
在其他情况下,如果必须在执行过程中多次重新分配变量,则可以使用let声明。
变量存在于它们所创建的作用域内。代码块和函数体为const和let变量创建一个作用域。提高变量可读性的一个好习惯是将变量保持在最小作用域内。
例如,以下函数是二进制搜索算法的实现:
function binarySearch(array, search) {
let middle;
let middleItem;
let left = 0;
let right = array.length - 1;
while(left <= right) {
middle = Math.floor((left + right) / 2);
middleItem = array[middle];
if (middleItem === search) {
return true;
}
if (middleItem < search) {
left = middle + 1;
} else {
right = middle - 1;
}
}
return false;
}
binarySearch([2, 5, 7, 9], 7); // => true
binarySearch([2, 5, 7, 9], 1); // => false
middle和middleItem变量在函数体的开头声明。因此,这些变量在binarySearch()函数体创建的整个作用域内都是可用的。
middle变量保留二进制搜索的中间索引,而middleItem变量保留二进制搜索的中间索引。
但是,middle和middleItem变量只在while循环代码块中使用。所以为什么不直接在while代码块中声明这些变量呢?
function binarySearch(array, search) {
let left = 0;
let right = array.length - 1;
while(left <= right) {
const middle = Math.floor((left + right) / 2);
const middleItem = array[middle];
if (middleItem === search) {
return true;
}
if (middleItem < search) {
left = middle + 1;
} else {
right = middle - 1;
}
}
return false;
}
现在,middle和middleItem变量仅存在于使用变量的作用域。 他们的生命周期和生命周期极短,因此更容易推断其作用。
我强烈希望在函数主体的顶部声明所有变量,尤其是在函数较大的情况下。 不幸的是,这种做法的缺点是使我在函数中使用的意图变量变得混乱。
尽量在接近使用位置的地方声明变量。这样,我们就不用猜了:嘿,我看到了这里声明的变量,但是它在哪里被使用了。
假设我们有一个函数,该函数的主体中包含很多语句。 我们可以在函数的开头声明并初始化变量结果,但是只能在return语句中使用result:
function myBigFunction(param1, param2) {
const result = otherFunction(param1);
let something;
/*
* calculate something...
*/
return something + result;
}
问题在于result 变量在开头声明,但仅在结尾使用,没有足够的理由在开始时声明该变量。
让我们通过将result 变量声明移到return语句之前来改进这个函数
function myBigFunction(param1, param2) {
let something;
/*
* calculate something...
*/
const result = otherFunction(param1);
return something + result;
}
现在,result变量在函数中有了它的正确位置。
从良好的变量命名的众多规则中,我区分出两个重要的规则。
第一个很简单:使用驼峰命名为变量取名,并且在命名所有变量时保持一致。
const message = 'Hello';
const isLoading = true;
let count
有特殊含义的数字或字符串,变量命名通常是大写的,在单词之间加下划线,以区别于常规变量
const SECONDS_IN_MINUTE = 60;
const GRAPHQL_URI = 'http://site.com/graphql';
第二条规则,在变量命名中,我认为这是最重要的:变量名称应明确无歧义地指出哪些数据保存了该变量。
以下是一些很好的变量命名示例:
let message = 'Hello';
let isLoading = true;
let count;
message 名称表示此变量包含某种消息,很可能是字符串。
isLoading相同,布尔值指示加载是否在进行中。
count变量表示保存一些计数结果的数字类型变量。
选择一个明确表明其角色的变量名。
举个例子,这样就能看出区别了。假设看到了这样一个函数:
function salary(ws, r) {
let t = 0;
for (w of ws) {
t += w * r;
}
return t;
}
你能总结出这个函数的作用吗?像ws、r、t、w这样的变量名几乎没有说明它们的意图。
相反,相同的函数,但使用了解释性变量命名
function calculateTotalSalary(weeksHours, ratePerHour) {
let totalSalary = 0;
for (const weekHours of weeksHours) {
const weeklySalary = weekHours * ratePerHour;
totalSalary += weeklySalary;
}
return totalSalary;
}
该代码清楚地说明了它的作用。 这就是良好命名的力量。
我比较少注释代码。我更喜欢编写代码即解释的风格,通过对变量、属性、函数和类的良好命名来表达意图。
编写自文档代码的一个好习惯是引入中间变量。 在处理长表达式时很有用。
考虑以下表达式:
const sum = val1 * val2 + val3 / val4;
我们引入两个中间变量,增强长表达式的可读性:
const multiplication = val1 * val2;
const division = val3 / val4;
const sum = multiplication + division;
另外,让我们回顾一下二进制搜索实现算法:
function binarySearch(array, search) {
let left = 0;
let right = array.length - 1;
while(left <= right) {
const middle = Math.floor((left + right) / 2);
const middleItem = array[middle];
if (middleItem === search) {
return true;
}
if (middleItem < search) {
left = middle + 1;
} else {
right = middle - 1;
}
}
return false;
}
这里middleItem是一个保存中间项目的中间变量。 使用中间变量MiddleItem而不是直接使用项目访问器array [middle]可读性更好。
与缺少middleItem解释变量的函数版本进行比较:
function binarySearch(array, search) {
let left = 0;
let right = array.length - 1;
while(left <= right) {
const middle = Math.floor((left + right) / 2);
if (array[middle] === search) {
return true;
}
if (array[middle] < search) {
left = middle + 1;
} else {
right = middle - 1;
}
}
return false;
}
这个版本,没有解释变量,可读性就比较差。
变量无处不在,我们总是先声明,分配和使用变量。
在 JS 中使用变量时,第一个好的做法是使用const,否则使用let
试着保持变量的作用域尽可能小。同样,将变量声明往尽可能靠近使用位置。
不要低估好的命名的重要性。始终遵循这样的规则:变量名应该清晰而明确地表示保存变量的数据。不要害怕使用较长的名字:最好是清晰而不是简洁。
最后,少使用注释,多写写代码即的效果 。 在高度复杂的地方,我更喜欢引入中间变量。
原文:https://dmitripavlutin.com/
在程序开发中,经常会使用到for循环的,但是很多人写的for循环效率都是比较低的,下面就举例说明,并总结优化for循环的方法,来提高我们程序的执行效率。
网站的加载速度不仅影响着用户体验,也会影响搜索引擎的排名,在百度推出“闪电算法”以来,将网站首屏打开速度被列入优化排名行列,作为前端开发的我们需要如果来优化网站的打开速度呢?下面就整理挖掘出很多细节上可以提升性能的东西分享给大家
DocumentFragments是DOM节点。它们不是主DOM树的一部分。通常的用例是创建文档片段,将元素附加到文档片段,然后将文档片段附加到DOM树。在DOM树中,文档片段被其所有的子元素所代替。因为文档片段存在于内存中,并不在DOM树中
对于代码裡面的 if else,我们可以使用逻辑判断式,或更好的三元判断式来优化代码。除了可以降低维护项目的成本之外,还可以提升代码可读性。就让我们从最简单的 if else 例子开始吧。
小程序从发布到现在也已经有将近两年的时间,越来越来多的公司开始重视小程序生态带来的流量,今年也由于小程序平台对外能力的越来越多的开放以及小程序平台的自身优化,越来越多的开发者也自主的投入到小程序的开发当中
无论你正在将 GIF 动图转换为 MP4 视频,还是手头已经有一大堆 MP4 视频,你都可以优化文件结构,以使得这些视频更快地加载和播放。通过重组 atoms 将 moov 放到文件开头,浏览器可以避免发送额外的 HTTP range request 请求来搜寻和定位 moovatom
要优化 Web 服务器的性能,我们先来看看 Web 服务器在 web 页面处理上的步骤:Web 浏览器向一个特定的服务器发出 Web 页面请求; Web 服务器接收到 web 页面请求后,寻找所请求的 web 页面,并将所请求的 Web 页面传送给 Web 浏览器; 显示出来
浏览器下载完页面所有的资源后,就要开始构建DOM树,于此同时还会构建渲染树(Render Tree)。(其实在构建渲染树之前,和DOM树同期会构建Style Tree。DOM树与Style Tree合并为渲染树)
写篇文章的目的,是以开放小程序代码的层面的优化。包括:条件判断将wx:if换成了hidden 、页面跳转请销毁之前使用的资源、列表的局部更新、小程序中多张图片懒加载方案、Input状态下隐藏input,应预留出键盘收起的时间
生活在信息爆炸的今天,我们每天不得不面对和过滤海量的信息--无疑是焦躁和浮动的,这就意味着用户对你站点投入的时间可能是及其吝啬的(当然有一些刚需站点除外)。如何给用户提供迅速的响应就显得十分重要了
内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!