• JavaScript 开发者都应该知道的十个概念


    1. 原始值和引用值(Value vs. Reference)

    理解对象、数组和函数是如何复制和传递到函数中的。了解引用值是被复制了什么,理解原始值是通过复制值来进行复制和传递的。

    简析:ECMAScript 定义了五种原始值类型:Undefined,Null,Boolean,Number和String。

      JS中的引用值类型包括对象、数组和函数。

      首先,在传递的时候,JS这几种数据类型分别传递的是什么:
      引用:函数、数组、对象(其实函数和数组也是对象)
      复制:数字、布尔
      由于字符串的特殊性,无法确定是传递引用还是复制数值(因为字符串的值是没法改变的)但是用于比较的时候显然是属于传值比较。

      接下来讲一下在使用中的具体表现: 

      var a = 10;
      var b = a;
      b += 10;
      alert(a);
    //返回10,显然,改变b的值不会影响到a的值

      var a = [10,20,30];//定义a是一个数组
      var b = a;
      b[0] += 10;
      alert(a);
    //返回20,20,30,b的值改变影响到a的值

      由于数组是引用类型,因此变量 a 其实存的是数组的指针,把数组的指针赋值给 b,那么 b 指向的也是 a 所指向的那片内存,指向的是同一个数组。因此修改 b 也会影响到 a。

    2. 域(Scope)

      理解全局域、函数域以及块级作用域之间的区别。了解变量在哪里是可用的,了解 JavaScript 引擎如何执行变量查找。

      简析:

        全局域:声明在函数外部的变量(所有没有var直接赋值的变量都属于全局变量)

        函数作用域:变量在定义的函数内及嵌套的子函数内处处可见;

         块级函数域:变量在离开定义的块级代码后马上被回收。

         JavaScript 引擎通过作用域链执行变量查找。

    3. 提升(Hoisting)

      认识到变量和函数的声明会被提升到声明所在的上下文,即在变量的作用域内,不管变量在何处声明,都会被提升到作用域的顶部,但是变量初始化的顺序不变。认识到函数表达式不会被提升。

         函数的声明:function foo(){};

      函数表达式:var bar = function foo(){};

    4. 闭包(Closures)

      认识到一个函数会保留对在其内部创建的域的访问,认识到这些可以让我们做什么,例如数据隐藏、内存化以及动态函数生成。

        可阅读《让你分分钟理解js闭包》

    5. this

      理解 this 绑定的规则。知道它的工作机制,知道在函数中如何判断它等同于什么,并且认识到为什么它是有用的。

        可阅读《this的详解》《this 的作用》这两篇文章

    6. new

      认识到它如何与面向对象编程产生联系。了解通过 new 调用的函数会发生什么。理解通过使用 new 来自函数 prototype 属性的继承的对象是如何生成的。

      简析:

    function x(){
       debugger
       this.w=1
       this.a()
    }
    x.prototype={
        a:function(){
             lert(22)
         }
    }
    
    console.log(new x())

      当我们new一个函数的时候,在执行函数里的第一条语句之前,首先创建一个空的对象{},并且this等于这个空对象,并且已经完成了原型链的构建,接下来就是执行函数里的代码,最后返回一个这个对象,除非我们显示返回其他的对象,否则一律返回this代表的这个对象。

    7. apply, call, bind

      了解这些函数是如何工作的,了解如何使用它们。了解它们对 this 做了什么。

     

    8. 原型和继承(Prototypes & Inheritance)

      理解 JavaScript 中的继承通过 [[Prototype]] 链进行工作。理解如何通过函数和对象设置继承,以及 new 是如何帮助我们实现的。了解 __proto__ 和 prototype 属性是什么,以及它们的作用。

      tips:

        1.每个对象都具有一个名为__proto__的属性;

        2.每个构造函数(构造函数标准为大写开头,如Function(),Object()等等JS中自带的构造函数,以及自己创建的)都具有一个名为prototype的方法(注意:既然是方法,那么就是一个对象(JS中函数同样是对象),所以prototype同样带有__proto__属性);

        3.每个对象的__proto__属性指向自身构造函数的prototype;

    9. 异步 JS(Asynchronous JS)

      理解事件循环,理解浏览器是如何处理用户输入、Web 请求和一般事件的。知道如何识别并正确实现异步代码。理解 JavaScript 中异步和单线程分别是怎样的。.

     

    10. 高阶函数(Higher Order Functions)

      理解这些函数是 JavaScript 中的第一类对象以及这意味着什么,了解从另一个函数返回函数是完全合法的。了解闭包和高阶函数允许我们使用的技术。

      简析:高阶函数是指至少满足下列条件之一的函数:

      • 函数可以作为参数被传递;

      • 函数可以作为返回值输出。

      例子:

    function add(x, y, f) {
        return f(x) + f(y);
    }
    add(-5, 6, Math.abs)
    当执行add这个函数时,参数x,y和f分别接收-5,6和函数Math.abs,

     

  • 相关阅读:
    简单获取input file 选中的图片,并在一个div的img里面赋值src实现预览图片
    MVC4方法行为过滤器例子(用户登录)
    MVC4过滤器
    MVC4 @RenderBody、@RenderSection、@RenderPage、Html.RenderPartial、Html.RenderAction的作用和区别
    FPGA之外,了解一下中断
    滤波器中的窗口
    关于有限脉冲响应滤波器
    分布式算法原理
    学习FPGA过程中的理论知识
    关于硬件实现FFT逆运算
  • 原文地址:https://www.cnblogs.com/wangdan0915/p/7867323.html
Copyright © 2020-2023  润新知