javascript_recap

General

  • 在JS中,对象相当于大部分语言的map,以键值对的形式存在
  • 如果将值赋给为申明的变量,该变量将自动作为全局变量,即使在函数内执行。
1
carname="Volvo";  // carname will be treated as global variable
  • =====区别

    1. 对于 string、number 等基础类型,== 和 === 是有区别的
      • 不同类型间比较,== 之比较 “转化成同一类型后的值” 看 “值” 是否相等,=== 如果类型不同,其结果就是不等。
      • 同类型比较,直接进行 “值” 比较,两者结果一样。
    2. 对于 Array,Object 等高级类型,== 和 === 是没有区别的:进行 “指针地址” 比较
    3. 基础类型与高级类型,== 和 === 是有区别的
      • 对于 ==,将高级转化为基础类型,进行 “值” 比较
      • 因为类型不同,=== 结果为 false
    4. != 为 == 的非运算,!== 为 === 的非运算
  • 自调用
    函数表达式可以 “自调用”。如果表达式后面紧跟 () ,则会自动调用。通过添加括号,来说明它是一个函数表达式

1
2
3
(function () {
var x = "hello world!"
})();
  • 闭包
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    function f1(){
        var n=999;
        nAdd=function(){n+=1} // nAdd 前没有关键字,相当于全局函数
        function f2(){
          alert(n);
        }
        return f2;
      }
      var result=f1();
      result(); // 999
      nAdd();
      result(); // 1000

在这段代码中,result实际上就是闭包f2函数。它一共运行了两次,第一次的值是999,第二次的值是1000。这证明了,函数f1中的局部变量n一直保存在内存中,并没有在f1调用后被自动清除

为什么会这样呢?原因就在于f1是f2的父函数,而f2被赋给了一个全局变量,这导致f2始终在内存中,而f2的存在依赖于f1,因此f1也始终在内存中,不会在调用结束后,被垃圾回收机制(garbage collection)回收。

ES2015

  • 新增箭头函数

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    // 传统定义函数方式
    function Test () {
    //
    }

    const Test = function () {
    //
    }

    // 使用箭头函数定义函数时可以省略 function 关键字
    const Test = (...params) => {
    //
    }
    // 该函数只有一个参数时可以简写成:
    const Test = param => {
    return param;
    }
  • 新增let修饰符:let是修复了var的作用域的一些bug,变的更加好用。let是更好的varvar的作用于是函数作用于,而let是块级别(大括号括起来的内容)。https://www.zhihu.com/question/52662013

其他

  • for...in and for...of
    一般使用for...of来遍历整个数组,for...in会多遍历一个Array.Prototype属性。

  • arguments
    Javascript中函数可以访问一个叫arguments的隐含变量。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    function add() {
    var sum = 0;
    for (var i = 0, j = arguments.length; i < j; i++) {
    sum += arguments[i];
    }
    return sum;
    }

    add(2, 3, 4, 5); // 14
  • apply() and call()
    call 和 apply 都是为了改变某个函数运行时的 context 即上下文而存在的,换句话说,就是为了改变函数体内部 this 的指向。比如,可以通过 func1.call(this, arg1, arg2); 或者 func1.apply(this, [arg1, arg2]); 来调用。以下通过apply实现对象的继承

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    var Parent = function(){
    this.name = "yjc";
    this.age = 22;
    }

    var child = {};

    console.log(child);//Object {} ,空对象

    Parent.call(child);

    console.log(child); //Object {name: "yjc", age: 22}