Javascript中的一些优化小技巧
很多时候我们在写移动端的时候,由于移动端的性能限制,我们需要考虑代码的质量以及性能,然而很多细微的地方都被我们忽略了
下面是我在工作中总结的一些比较常见的可以优化js的地方:
1.for循环
a)往常所写for循环(不建议)
for (var i = 0; i < myarray.length; i++) { // ... }
这种模式的一个问题是数组的长度在每个循环迭代中都被访问。这可能会减慢你的代码,特别是当myarray不是一个数组而是一个对象时。
b)现在的for循环(建议)
for (var i = 0, max = myarray.length; i < max; i++) { // ... }
这样你只需检索一次长度的值,并在整个循环中使用它。
同理,我们也应当将变量声明 放在for 循环之外:
//建议 var container = document.getElementById('container'); for(var i = 0, maxLength = myarray.length; i < maxLength; i++) { container.innerHtml += 'my number: ' + i; console.log(i); }
而不是放在循环之内,随着循环的遍历使得变量声明多次,消耗不必要的性能:
//不建议 for (var i = 0, maxLength = myarray.length; i < maxLength; i++) { var container = document.getElementById('container'); container.innerHtml += 'my number: ' + i; console.log(i); }
2.大括号{}的使用
for (var i = 0; i < 10; i += 1) alert(i);
但是,如果稍后在循环体中添加另一行呢?
for (var i = 0; i < 10; i += 1) alert(i); alert(i + " is " + (i % 2 ? "odd" : "even"));
第二个警告是在循环之外,虽然缩进可能欺骗你。但是从长远来看,最好的做法是始终使用大括号,即使是一行代码块:
for (var i = 0; i < 10; i += 1) { alert(i); }
同样如果条件:
// bad if (true) alert(1); else alert(2); // better if (true) { alert(1); } else { alert(2); }
那么说到 {} ,我们如何写它的位置才是最优的呢?在同一行或在下面的行?
这样:
if (true) { alert("cashin"); }
还是:
if (true) { alert("cashin"); }
在这个特定的例子中,这是一个偏好的问题,但是有些情况下,程序可能会根据大括号的位置而有所不同。这是因为 JavaScript 不挑剔,当你选择不用一个分号正确地结束你的语句时,会为你添加它。但是当一个函数返回一个对象并且开始的大括号位于下一行时,这种行为会导致麻烦:
function func() { return
{ name : "cashin" } } console.log(func()); //打印出来的结果是undefined
如果你期望这个函数返回一个name属性的对象,你会感到惊讶。由于隐含的分号,函数返回 undefined 。上面的代码等同于这个:
function func() { return undefined; { name : "cashin" } } console.log(func());
总之,我们需要使用 {} ,并始终把开始的括号写在声明同一行内:
function func() { return { name : "cashin" }; } console.log(func());
关于分号的说明:就像使用 {} 一样,即使JavaScript分析器隐含了分号,我们也要使用分号。正如前面的例子所显示的那样,这不仅可以优化代码规范,还可以更加严格地处理代码,同时也有助于解决一些始料未及的问题。
3.快速建立字符串的方法
当你需要循环访问一个数组或对象时,不要总是写出你觉得方便的“for”语句。发挥创造力,为手头的工作找到最快捷的解决方案,例如:
var arr = ['item 1', 'item 2', 'item 3', ...]; var list = '<ul><li>' + arr.join('</li><li>') + '</li></ul>';
4.使用parseInt()来转换数字
使用parseInt()
你可以从一个字符串中获得一个数值。该函数接受第二个基数参数,这个参数经常被省略,但我们不应该忽略它。当要解析的字符串以0开始时会出现问题:例如,输入到表单字段的日期的一部分。以0开头的字符串在ECMAScript 3中被视为八进制数,但是,这在ES5中已经改变了,不支持字面量形式的八进制数值,而且仅在严格模式下才会开启运行时检查,为避免出现不一致和意外的结果,请始终指定第二个基数参数:
var month = "06", year = "09"; month = parseInt(month, 10); year = parseInt(year, 10);
在这个例子中,如果你省略了基数参数写成 parseInt(year) ,那么返回的值将是0,因为“
09
”只是字面量形式上的八进制数,并不是一个严格模式下的八进制数。
将字符串转换为数字的替代方法还有:
var str = "08"; console.log(Number(str));
这些往往比 parseInt() 要快,因为 parseInt() 顾名思义就是解析,而不是简单地转换,两者是有区别的,例如:
var str = "2017 hello"; console.log(Number(str)); //NaN console.log(parseInt(str)); //2017
5.我们可以使用一些简单的代码来替换掉一些略显复杂冗余的代码:
这个代码:
var lunch = new Array(); lunch[0]='a'; lunch[1]='b'; lunch[2]='c'; lunch[3]='d';
相同的代码:
var lunch = [ 'a', 'b', 'c', 'd' ];
这个代码:
if(v){ var x = v; } else { var x =10; }
相同的代码:
var x = v || 10;
这个代码:
var direction; if(x > 100){ direction = 1; } else { direction = -1; }
相同的代码:
var direction = (x > 100) ? 1 : -1;
(本文引用: https://code.tutsplus.com/tutorials/the-essentials-of-writing-high-quality-javascript--net-15145)