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.大括号{}的使用

我们应该学会使用大括号,即使在可选的情况下也是如此。从技术上讲,如果你只有一个 if 或一个 for 语句,可以不写大括号,但我还是建议要使用它们。因为它会使代码更一致,更容易维护。
想象一下,你只有一个语句的for循环。你可以省略大括号,不会出现语法错误:
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

 

posted @ 2017-12-21 11:29  cashinMonster  阅读(216)  评论(0编辑  收藏  举报