美文网首页
【读书笔记】:《编写可维护的JavaScript》第04章 变量

【读书笔记】:《编写可维护的JavaScript》第04章 变量

作者: 龍天下 | 来源:发表于2020-11-14 10:02 被阅读0次

    第04章 变量、函数和运算符

    4.1 变量声明

    1. 所有变量声明提前
    2. 将所有的var语句合并成一个,每个变量的初始化独占一行。赋值运算符对齐,没有赋值的变量放在末尾。注意每个变量之间用逗号“,”隔开,不能用分号
    function movable(i,j){
        // 我并不推荐这种写法 因为容易将末尾的逗号(,) 写成分号(;) 
        // 这会导致意外的创建全局变量
        var i     = 100,
            j     = 1001,
            value = "fu2",
            txt;
            
        function test(){
        }    
    }
    
    1. 这里推荐每一个变量都用一个 var 声明:
    function movable(i,j){
        var i = 100;
        var j = 1001;
        var value = "fu2";
        var txt;
        
        function test(){
        }    
    }
    

    4.2 函数声明

    建议先声明再调用

    4.3 立即调用的函数 匿名函数

    匿名函数,即为没有函数名的函数
    将匿名函数赋值给变量或者属性:

    var doSomething = function() {
        //函数体
    };
    

    将函数的执行结果赋值给变量(在函数后面加上一对圆括号)

    var doSomething = function() {
        //函数体
        return {
            message:"Hi"
        }
    }();
    

    这种情况下,在没有读完整个代码,完全不知道是将函数整体赋值给变量,还是将函数执行结果赋值给变量。我们可以将整个函数用一对圆括号包裹起来,来做区分:

    var doSomething = (function() {
        //函数体
        return {
            message:"Hi"
        }
    }());
    

    4.4严格模式

    "use strict"
    

    推荐在函数内部使用该语句。这样就只会在该函数内部使用严格模式。
    ES6 已经完全使用严格模式

    4.5 相等

    JavaScript具有强制类型转换机制(type coercion)。
    使用相等运算符==和!=做判断时,如果两个值得类型不同时,这两个运算符都会将做比较的两个值进行强制类型转换。这会导致在很多实际情况下,代码并不按照我们所期望的方式运行。
    如果数字和字符串进行比较,字符串会搜西安转换为数字,然后进行比较:

    // 比较数字5和字符串5
    console.log(5 == "5"); // true
    
    // 比较数字25和十六进制的字符串
    console.log(25 == "0x19"); // true
    

    当发生强制类型转换时,字符串会被转换成数字,类似使用Number()转换函数。因为Number()可以正确解析十六进制的格式,它会将看起来像十六进制的数字转换为十进制数,然后再进行比较。

    如果一个布尔值和数字比较,布尔值会首先转换为数字,然后再进行比较。false:0,true:1。

    // 数字 1 和 true 比较
    console.log(1 == true); // true 
    
    // 数字 0 和 false 比较
    console.log(0 == false); // true
    
    // 数字 2 和 false 比较
    console.log(2 == true); // false
    

    如果其中一个值是对象而另一个不是,则会首先调用对象的valueOf()方法,得到原始类型值再进行比较。如果没有定义valueOf(),则调用toString()。

    var object = {
        toString:function(){
            return "0x19";
        }
    };
    
    console.log(object == 25); // true
    

    null 和 undefined,根据ECMAScript标准规范的描述,这两个特殊值被认为是相等的。

    console.log(null == undefined); // true
    

    由于强制类型转换的缘故,我们推荐不要使用==和!=,而是使用===和!==。这两个运算符可以避免变量进行强类型转换。因此,如果两个值的类型不一样,则认为它们不相等,这样就可以让你的比较语句执行比较时行为一致。

    // 比较数字5和字符串5
    console.log(5 == "5"); // true
    console.log(5 === "5"); // false
    
    // 比较数字25和十六进制的字符串
    console.log(25 == "0x19"); // true
    console.log(25 === "0x19"); // false
    
    // 数字 1 和 true 比较
    console.log(1 == true); // true 
    console.log(1 === true); // false 
    
    // 数字 0 和 false 比较
    console.log(0 == false); // true
    console.log(0 === false); // false
    
    // 数字 2 和 false 比较
    console.log(2 == true); // false
    console.log(2 === true); // false
    
    var object = {
        toString:function(){
            return "0x19";
        }
    };
    
    // 一个对象和 25 比较
    console.log(object == 25); // true
    console.log(object === 25); // false
    
    // null 和 undefined 比较
    console.log(null == undefined); // true
    console.log(null === undefined); // false
    

    相关文章

      网友评论

          本文标题:【读书笔记】:《编写可维护的JavaScript》第04章 变量

          本文链接:https://www.haomeiwen.com/subject/zjmvbktx.html