js

125 阅读2分钟

一、 数据类型

1、简单/基本/原始数据类型
-   numberstringbooleanundefinednull
2、复杂数据类型
  objectArrayfunctionDateRegExp.....

区别:在内存中的存储位置

基本数据类型的存取都发生在栈内存中

引用类型在堆中保存数据,在栈中保存数据在堆中的地址(引用)

二、数据集类型转换

  1. 隐式类型转换

       运算过程
    
  2. 强制类型转换

     Number()   String()   parseInt()  parseFloat()   toString()
    

三、函数

  1. 递归函数

      function fn(num) {
          if (num == 1) { //终止条件
              return 1
          }
          return num * fn(num - 1)
      }
      var num = fn(10)
      console.log(num);
     /*
      分析递归函数的执行过程:
       10    10*fn(9)
        9     10*9*fn(8)
                   8*fn(7)
                     7*fn(6)
                         ...
                        2*fn(1)
                           1
     */
    
  2. 回调函数

       普通函数: function(){}
       高阶函数:可以接收一个函数作为参数的函数
          function show(fn) {     //fn回调函数   show:高阶函数
                console.log(fn);
          }
         show(function(){
              console.log('hello world');
          }) 
          
    
  3. 匿名函数

      (function() {
          console.log('哈哈哈');
     })();
    

四、什么是闭包

* 闭包:

有权在一个函数内访问另一个函数作用域中的变量(返回该函数), 闭包是连通函数内外的一个桥梁,可以实现局部变量常驻内存。

闭包常见面试题

     var arr = [];
          for (var i = 0; i < 3; i++) {
            (function (i) {
                arr.push(function () {
                    console.log(i);
                })
            })(i)
        }

        // console.log(arr);
        arr[0]()
        arr[1]()
        arr[2]()
        
        
        
        
      var lis = document.querySelectorAll("ul li")
    // for(var i=0;i<lis.length;i++){
    //     // lis[i].index=i;
    //     lis[i].onclick=function(){
    //         console.log(this.index);
    //     }
    // }

    for (var i = 0; i < lis.length; i++) {
        (function (a) {
            lis[a].onclick = function () {
                console.log(a);
            }
        })(i);
        // (function (i) {//0
        //     lis[i].onclick = function () {
        //         console.log(i);
        //     }
        // })(0);

        // (function (i) {//1
        //     lis[i].onclick = function () {
        //         console.log(i);
        //     }
        // })(1);

        // (function (i) {//2
        //     lis[i].onclick = function () {
        //         console.log(i);
        //     }
        // })(2);

        // (function (i) {
        //     lis[i].onclick = function () {
        //         console.log(i);
        //     }
        // })(3);
    } 
    
    

五、递归

一种常见的算法思想:

求阶乘:

    function fn(n){
         if(n==1){
             return 1;
        }
         return n*fn(n-1);
     }
    console.log(fn(10));
    10*fn(9)
    
    
    

打印杨辉三角形:

for (var i = 1; i < 9; i++) {   //行
        for (var j = 1; j <= i; j++) {//列
            document.write(cal(i, j) + "&nbsp;&nbsp;&nbsp;&nbsp;")
        }
        document.write("<br>")
   }

    //数字的计算
    function cal(m, n) {
        //第一行、第一列、最后一列
        if (m == 1 || n == 1 || m == n) {
            return 1;
        }
        return cal(m - 1, n) + cal(m - 1, n - 1)
    }
    

六、 call和apply

this在不同的地方,指向不同:

全局中this指向window

在事件函数中指向事件调用者

对象的方法中,this指向对象(this指向调用者,谁调用,this指向谁)

call和apply都可以修改函数中的this指向问题(功能一致,用法不一致)
  call(obj,参数1,参数2,参数2)
  apply()
     // function show(){
    //     console.log(this);
    // }
    function show(a,b){
        console.log(this,a,b);
    }


    // show();
    // show.call({})   ;//无参
    show.call({},10,20)
    show.apply({}, [10, 20])

七、面向对象

对象:万物皆对象, 事物的抽象

实例:对象的实例化

1. 原型模式

原型 prototype 所有对象都包含一个原型的属性,该属性用来保存对象的公有的属性和方法

  • 对象.ptototype
  • 对象实例. __ proto__

constructor 原型对象的属性 指向构造函数

  ** 特点:属性放置在原型中,会成为公共属性**

2. 混合模式

构造函数+原型

    function Person(name,age,no){
        this.no=no;
        this.name=name
        this.age=age;
    }
    Person.prototype.say=function(){
        console.log(this.name+" 哈哈哈");
    }
    Person.prototype.walk=function(){
        console.log(this.name+" 跑的飞起......");
    }

    var p1=new Person("秦始皇",55,'001')
    var p2=new Person("赵高",56,'002')
    
    

3. 动态混合

  **  动态混合  **
    function Person(name, age, no) {
        this.no = no;
        this.name = name
        this.age = age;
        console.log(typeof this.say);
        //方法
        if (typeof this.say != 'function') {
            Person.prototype.say = function () {
                console.log(this.name + " 哈哈哈");
            }
        }
        
       // Person.prototype.walk = function () {
        //     console.log(this.name + " 跑的飞起......");
        // }
    }