美文网首页
阮一峰JavaScript 标准参考教程(alpha)阅读笔记

阮一峰JavaScript 标准参考教程(alpha)阅读笔记

作者: htkz_117f | 来源:发表于2017-11-12 05:38 被阅读0次

    0.前言

    作为一个刚刚接触js两个月的小白,拜读一下阮一峰大神的作品,顺手记录一下自己掌握不太好的地方或是让人感觉非常棒的地方。当然里面部分内容来优秀的评论。
    内容持续补充,对自己来说也算是当一个书签来用。

    1.具体内容

    1.1 一段让人看完感觉荡气回肠的js历史

    http://javascript.ruanyifeng.com/introduction/history.html

    1.2 switch不进行强制转换

    需要注意的是,switch语句后面的表达式与case语句后面的表示式,在比较运行结果时,采用的是严格相等运算符(===),而不是相等运算符(==),这意味着比较时不会发生类型转换。

    var x = 1;
    
    switch (x) {
      case true:
        console.log('x发生类型转换');
      default:
        console.log('x没有发生类型转换');
    }
    // x没有发生类型转换
    

    上面代码中,由于变量x没有发生类型转换,所以不会执行case true的情况。这表明,switch语句内部采用的是“严格相等运算符”。

    1.3 全局变量

    a=1,实质应相当于window["a"]=1,这样是给window附加了属性a,而对象的属性是可以删除的,如delete window.a即可删除a。

    1.4 用对象代替switch

    function getDrink (type) {
      if (type === 'coke') {
        type = 'Coke';
      } else if (type === 'pepsi') {
        type = 'Pepsi';
      } else if (type === 'mountain dew') {
        type = 'Mountain Dew';
      } else if (type === 'lemonade') {
        type = 'Lemonade';
      } else if (type === 'fanta') {
        type = 'Fanta';
      } else {
        // acts as our "default"
        type = 'Unknown drink!';
      }
      return 'You\'ve picked a ' + type;
    }
    

    这种代码完全可以用以下代码代替

    function getDrink (type) {
      var drinks = {
        'coke': 'Coke',
        'pepsi': 'Pepsi',
        'lemonade': 'Lemonade',
        'default': 'Default item'
      };
      return 'The drink I chose was ' + (drinks[type] || drinks['default']);
    }
    
    var drink = getDrink('coke');
    // The drink I chose was Coke
    console.log(drink);
    

    1.5 typeof判断值是否存在

    // 错误的写法
    if (v) {
      // ...
    }
    // ReferenceError: v is not defined
    
    // 正确的写法
    if (typeof v === "undefined") {
      // ...
    }
    

    1.6判断为false的值

    如果JavaScript预期某个位置应该是布尔值,会将该位置上现有的值自动转为布尔值。转换规则是除了下面六个值被转为false,其他值都视为true。

    undefined
    null
    false
    0
    NaN
    ""或''(空字符串)
    

    1.7Base64的作用

    Base64是一种编码方法,可以将任意字符转成可打印字符。使用这种编码方法,主要不是为了加密,而是为了不出现特殊字符,简化程序的处理。

    1.8判断变量存在

    在JavaScript语言中,所有全局变量都是顶层对象(浏览器的顶层对象就是window对象)的属性,因此可以用in运算符判断,一个全局变量是否存在。

    // 假设变量x未定义
    
    // 写法一:报错
    if (x) { return 1; }
    
    // 写法二:不正确
    if (window.x) { return 1; }
    
    // 写法三:正确
    if ('x' in window) { return 1; }
    

    1.9 作用域

    var a = 1;
    var x = function () {
      console.log(a);
    };
    
    function f() {
      var a = 2;
      x();
    }
    
    f() // 1
    

    上面代码中,函数x是在函数f的外部声明的,所以它的作用域绑定外层,内部变量a不会到函数f体内取值,所以输出1,而不是2。
    总之,函数执行时所在的作用域,是定义时的作用域,而不是调用时所在的作用域。
    很容易犯错的一点是,如果函数A调用函数B,却没考虑到函数B不会引用函数A的内部变量。

    var x = function () {
      console.log(a);
    };
    
    function y(f) {
      var a = 2;
      f();
    }
    
    y(x)
    // ReferenceError: a is not defined
    

    上面代码将函数x作为参数,传入函数y。但是,函数x是在函数y体外声明的,作用域绑定外层,因此找不到函数y的内部变量a,导致报错。
    同样的,函数体内部声明的函数,作用域绑定函数体内部。

    function foo() {
      var x = 1;
      function bar() {
        console.log(x);
      }
      return bar;
    }
    
    var x = 2;
    var f = foo();
    f() // 1
    

    上面代码中,函数foo内部声明了一个函数bar,bar的作用域绑定foo。当我们在foo外部取出bar执行时,变量x指向的是foo内部的x,而不是foo外部的x。正是这种机制,构成了下文要讲解的“闭包”现象。

    1.10类数组对象转换为数组

    var args = Array.prototype.slice.call(arguments);
    

    相关文章

      网友评论

          本文标题:阮一峰JavaScript 标准参考教程(alpha)阅读笔记

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