个性化阅读
专注于IT技术分析

你可能想开始在项目中应用的10个有用的javascript提示和实践

本文概述

如果你是一位有经验的JS开发人员, 也许你会发现其中一些技巧确实是微不足道的。但是, 对于javascript初学者来说, 如果你想提高使用该语言的开发技能, 这些技巧将非常重要和有用。

著名的JavaScript大师和开发人员一直在使用许多这样的技术来编写功能强大, 高效的JavaScript, 现在你将学习如何使用。

10.仅在外部文件中的脚本

用户设备上的缓存文件总比每次都发出新请求要好。每次用户进入网站时, 模板(即博客)总是不同的, 因为博客作者每次都希望创建一个新条目。因此, 该模板不会被缓存, 因此, 如果你的脚本直接写在文档中, 而脚本标记中没有引用它们, 则每次用户访问该网页时都会请求该模板。

如果文档中的脚本很大(超过30行), 则应将其移至外部脚本中:

<div>
 Bla bla bla ...
</div>
<script>
 //
 // More than 30 lines of Javascript in the Document
 // that you can move to an external file
 //
</script>
<!-- Reference it better in a external script -->
<script src="my/path/tomyscript.js"></script>

如果你可以将js代码移动到脚本文件中, 请始终在有能力时执行。

9.知道何时比较相等或相同

如果需要, ==(或!=)比较器执行自动类型转换。 ===(或!==)运算符将不执行任何转换。它比较值和类型, 可以认为它比==更快(jsPref)。

[20] ==  20      //  true
[20] === 20      //  false

'45' ==  45      // true
'45' === 45      //  false

 []  ==  0       //  true
 []  === 0       //  false

 ''  ==  false   //  true but [true == "a"]  false
 ''  === false   //  false 

==双重等于(也称为宽松相等)将不比较类型, 但是将转换在语句中比较的值。这称为类型强制, 它被认为是邪恶的操作。

===三重等于(也称为严格相等)将比较类型, 但不会类型转换值, 这意味着它们将按原样进行比较而不进行转换。因为没有类型强制, 所以三元等于更快, 是比较各种值的推荐方法。这意味着两种条件都必须相同才能使条件等于true。

仅当你检查null或未定义时, 才使用==(或!=)。

8.注意字符串连接

你需要在串联过程中确定变量的类型。

分析以下示例:

var a = 1;// Int
var b = 2;// Int
var c = '3'; // String
var d = " my Number"; // String

console.log(a + b + c + d);
// Output : 33 my Number
// But expected other thing ...

为避免意外行为, 请将其转换为字符串, 使用concat方法或将它们与加号连接起来, 但将行中的第一个变量设置为string:

var a = 1;// Int
var b = 2;// Int
var c = '3'; // String
var d = " my Number"; // String

console.log("" + a + b + c + d);
console.log(a.toString() + b.toString() + c.toString() + d);
console.log(''.concat(a, b, c, d));
// All of them output : 123 my Number

7.在1行中重新声明变量

而不是使用以下占用三行以上的语法检查if语句是否存在:

注意:尽管使用!操作员已经很短了, 使用短路声明就更短了。

var myInitialString = "";

function concatenate(parameter){
    // Check if variable exists
    // or 
    // typeof(parameter) == "undefined"
    if(!parameter){
        parameter = "A previously default value";
    }
    
    return myInitialString + parameter;
}

请使用短路声明:

var myInitialString = "";

function concatenate(parameter){
    // Re-declare with 1 line instead
    parameter = parameter || "Use this value instead if parameter doesn't exists";
    
    return myInitialString + parameter;
}

如你所知, Javascript中的所有内容都是真实的或虚假的, 虚假的JavaScript值包括:

  • 假。
  • 0.
  • 空字符串(“或”)。
  • 空值。
  • 未定义。
  • NaN(NotANumber)。

||运算符首先计算左侧的表达式, 如果该表达式为真, 则返回该值。如果为假, 它将求值并返回右操作数的值(右侧的表达式)。

6. if语句缩短

继续使用短路声明使if语句比实际短。如果此类的语句返回布尔值, 则可以返回if语句的求值(它返回布尔值)。

function isAdult(age){
    // if age parameters exists and its value is greater than 17..
    if(age && age > 17){
        return true;
    }

    return false;
}

布尔值也将从以下评估中返回:

function isAdult(age){
    // If age parameter doesn't exists, falsy is returned
    // and if the parameters exists and is greater than 17 truthy is returned
    return age && age > 17;
}

而且, 你不仅可以为返回值创建short if语句, 还可以创建结合&&和||的更多代码。具有短路声明样式的比较器:

// Execute a request to the server if the token is valid, otherwise refresh it
if (tokenIsValid(token)) {
    executeRequest(token);
}else{
    refreshToken();
}


// If token is valid is truthy, then the executeRequest will be executed too.
// otherwise the refreshToken will be executed.
tokenIsValid(token) && executeRequest(token) || refreshToken();

简洁, 可读(可疑)的一行代码不是吗?

5.不要害怕按位非运算符(〜或~~), 它不会被咬

如果你在第三方代码中看到此运算符, 但你不知道它的含义, 请不要担心它并不常见, 但并非来自另一个世界。

当与整数一起使用时, 〜的单次使用具有特殊效果, 解释此符号的效果就像使用以下函数:

function bitwiseOperator(value){
  var result = Math.floor(value);
  // return the negative value of the result + 1;
  return - (result+ 1);
}

它只是返回数字加1的负值。一个众所周知的用法是, 检查数组是否具有带有indexOf函数的项, 而不是用-1进行区分, 使计算结果为真或假:

// true
var hasItemTwo = ~[1, 2, 3].indexOf(2);

if (hasItemTwo) {
    console.log("The array contains 2");
}

// instead of 

if([1, 2, 3].indexOf(2) != -1){
    console.log("The array contains 2");
}

没听懂吗?不要惊慌!如果你需要有关此运算符的更多信息, 请阅读本文。

在以下情况下使用双按位NOT:

1.你要将数字从float转换为整数。

2.你想执行与Math.floor()相同的操作, 但是要快得多。

3.你想最小化你的代码。

在以下情况下, 请勿使用双按位NOT:

1.你运行的是Google Chrome(显然吗?)。

2.你关心代码的可读性。

4.正确组合2个阵列中的数据

你需要知道何时使用循环, 何时不使用循环。对于合并2个数组, 你无需遍历第二个数组并将每个项目推入第一个数组, 如下面的示例(不良做法)所示:

var firstArr = ["12", {myObject:12}, 123, "Hi", "Test"];
var secondArr = [9, 5, 23, 12, "Hello", "Second test"];

for(var i = 0;i < secondArr.length;i++){
    var item = secondArr[i];
    // add item to second array
    firstArr.push(item);
}

console.log(firstArr);

// outputs : 
// ["12", {myObject:12}, 123, "Hi", "Test", 9, 5, 23, 12, "Hello", "Second test"]

尽管它起作用了, 但这并不是最好的方法, 不使用循环就将它们组合起来。

var firstArr = ["12", {myObject:12}, 123, "Hi", "Test"];
var secondArr = [9, 5, 23, 12, "Hello", "Second test"];

// Combine arrays
Array.prototype.push.apply(firstArr, secondArr);

console.log(firstArr);

// outputs : 
// ["12", {myObject:12}, 123, "Hi", "Test", 9, 5, 23, 12, "Hello", "Second test"]

如果你不知道函数的.call和.apply属性之间的区别, 则可能需要阅读本文, 否则你会迷失这种做法的工作方式。在这种情况下, 我们使用.apply属性将push方法的此上下文更改为第一个数组, 如你所知, .push方法将其接收的所有参数添加到给定数组中, 例如:

var myEmptyArr = [];

myEmptyArr.push(1, 2, 3, 4, 5);

console.log(myEmptyArr);
// [1, 2, 3, 4, 5]

因此, 由于apply函数, 第二个参数(第二个数组)的项目将作为参数并附加到第一个数组中。比循环更容易编写不是吗?

3.切换vs

关于是否使用switch语句或一系列if和else语句的经典问题并不是JavaScript独有的, 并且几乎激发了具有这些构造的每种编程语言的讨论。当然, 真正的问题不在单个语句之间, 而是与每个语句能够处理一系列条件语句的速度有关。

如果是示例, 请分析以下内容:

// the variables : result
         
           doesn't exists
function example(value){
    if (value < 6){
        if (value < 3){
            if (value == 0){
                return result0;
            } else if (value == 1){
                return result1;
            } else {
                return result2;
            }
        } else {
            if (value == 3){
                return result3;
            } else if (value == 4){
                return result4;
            } else {
                return result5;
            }
        }
    } else {
        if (value < 8){
            if (value == 6){
                return result6;
            } else {
                return result7;
            }
        } else {
            if (value == 8){
                return result8;
            } else if (value == 9){
                return result9;
            } else {
                return result10;
            }
        }
    }
}

example(5);
         

现在, 用switch语句编写的代码相同, switch语句简化了多种条件的外观和性能:

function example(value){
    switch(value){
        case 0:
            return result0;
        case 1:
            return result1;
        case 2:
            return result2;
        case 3:
            return result3;
        case 4:
            return result4;
        case 5:
            return result5;
        case 6:
            return result6;
        case 7:
            return result7;
        case 8:
            return result8;
        case 9:
            return result9;
        default:
            return result10;
    }
}

example(10);

你会选择哪一个?

在JavaScript中, 当仅要评估一两个条件时, if语句通常比switch语句快。当有两个以上的条件, 并且条件很简单(不是范围)时, switch语句往往会更快。这是因为在switch语句中执行单个条件所花费的时间通常少于在if语句中执行单个条件所花费的时间, 这使得switch语句仅在存在大量条件时才是最佳选择。

2.衡量绩效并解决绩效问题

是的, 队长很明显!

队长明显

没有人喜欢缓慢的网站或缓慢的应用程序, 请确保测试你所有繁重的功能并分析可以优化的地方。

你可以在此处阅读有关如何使用Benchmarks或使用Chrome开发人员工具来使用Javascript衡量功能性能的详细文章。

1.使用闭包确保代码安全

将你的代码包装在匿名函数中, 以防止你自己的代码出现问题。几乎每个网站都使用来自不同来源的不同脚本。默认情况下, 在页面上创建的任何函数或变量都在全局”作用域”中定义。如果两个脚本使用相同的确切变量/函数名称, 则可能会成为一个严重的问题。

var myName = 12;

(function(){
    var myName = 123123123123;

    // 123123123123
    console.log(myName);
})();

// 12
console.log(myName);

如你所见, 闭包是受尊重的, 并且myName变量在其上下文中仍然具有12值, 因为包装器中的myName属于另一个上下文。这就是使用闭包的要点。

如果你知道要与社区分享的另一个很棒的技巧, 请不要害羞, 并在评论框中与我们分享!玩得开心

赞(0)
未经允许不得转载:srcmini » 你可能想开始在项目中应用的10个有用的javascript提示和实践

评论 抢沙发

评论前必须登录!