js高级,知识点梳理

数据类型

1.分类
  • 基本(值)类型

    • String : 任意的字符串
    • Number : 任意的数字
    • boolean : true/false
    • undefined : undefined
    • null : null
  • 对象(引用类型)类型

    • Object:任意对象

    • Function: 一种特别的对象(可以执行)

    • Array: 只用特别的对象(数值下标,内部数据是有序的)

      2.判断
      • typeof:

        • 返回数据类型的字符串表达
        • 可以判断:undefin / 数值 / 字符串 / 布尔值 / function
        • 不能判断: null与object object 与array
      • instanceof:

        • 判断对象的具体类型: 数组与对象
      • ===

        • 可以判断 undefin ,null

      判断的案例:

数据类型相关的问题:
  1. undefined 与 null 的区别 ?

    • undefined 代表定义未赋值

    • null定义并赋值,只是值为null

  2. 什么时候给变量赋值为null ?

    • 初始赋值,表明将要赋值为对象
    • 结束前,让对象成为垃圾对象(被垃圾回收器回收)
  3. 严格区别变量类型与数据类型?

    • 数据的类型

      • 基本类型
      • 对象类型
    • 变量的类型(变量内存值的类型)

      • 基本类型 :保存就是基本类型的数据
      • 引用类型 :保存的是地址值
数据-变量-内存

1.什么是数据

  • 存储在内存中代表特定信息的东西,本质上是0101…
  • 数据的特点: 可传递, 可运算
  • 一切皆对象
  • 内存中所有操作的目标: 数据
    • 算术运算
    • 逻辑运算
    • 赋值
    • 运行函数

2.什么是内存?

  • 内存条是通电后产生的可储存数据的空间(临时的)

  • 内存产生和死亡: 内存条(电路板)》通电〉产生内存空间==》存储数据==〉 断电 ==》内存空间和数据都消失

  • 一块小内存的连个数据

    • 内部储存的数据
    • 地址值
  • 内存分类

    • 栈空间: 全局变量/局部变量
    • 堆空间 : 对象

3.什么是变量?

  • 可变化的量, 由变量名和变量值组成
  • 每个变量都对应的一块小内存,变量名用来查找对应的内存,变量值就是内存中保存的数据
关于引用变量赋值问题
  • 2个引用变量指向同一个对象,通过一个变量修改对象内部数据,另一个变量看到的是修改后的数据
  • 2个引用变量指向同一个对象,让其中一个引用对象指向另一个对象,另一引用变量依然指向前一个对象

对象

1.什么是对象?
  • 多个数据的封装体
  • 用来保存多个数据的容器
  • 一个对象代表现实中的一个事物
2.为什么要用对象?
  • 统一管理多个数据
3.对象的组成
  • 属性: 属性名(字符串)和属性值(任意类型)组成
  • 方法: 一种特别的属性(属性值是函数)
4.如何访问对象内部数据?
  • .属性名:编码简单,有时不能用

5:问题:什么时候必须使用’属性名’的方式?
  • 属性名包含特殊字符 :- 空格
  • 属性名不确定

函数

1.什么是函数?
  • 实现特定功能的n条语句的封装体
  • 只有函数是可以执行的,其他类型的数据不能执行
2.为什么要用函数?
  • 提高代码复用
  • 便于阅读交流
3.如何定义函数?
  • 函数声明
function fn1 () {//函数声明
console.log('fn1()')
}
  • 表达式
var fn2= function () {//表达式
console.log('fn2()')
}
4.如何调用(执行)函数?
  • test():直接调用
  • obj.test(): 通过对象 调用
  • new test() : new 调用
  • test.vall/apply(obj):临时 让test 成为obj 的方法进行调用

回调函数

1.什么函数才是回调函数
  • .你定义的

  • .你没有调用

  • 但最终它执行了

常见的回调函数
  • don事件回调函数
  • 定时器回调函数
  • ajax请求回调函数
  • 生命周期回调函数

函数的 prototype

1.函数的prototype 属性

  • 每个函数都有一个prototype属性 , 它默认指向一个Object空对象 (即称为 : 原型对象)

  • 原型对象中有一个属性 constructor , 它指向函数对象本身

    function Fun () {}
    
    console.log(Fun.prototype)//默认指向一个Object空对象
    //原型对象中有一个属性constructor,它指向函数对象
    console.log(Fun.prototype.constructor===Fun)//true
    

    2.给 对象添加属性( 一般都是方法)

  • 作用: 函数的所有实例对象自动拥有原型中的属性 (方法)

显式原型和隐式原型
  1. 每个函数function都有一个prototype,即 显示原型(属性)

  2. 每个实例对象都有一个__ proto__,可称为隐式原型(属性)

  3. 对象的隐式原型的值为其对应构造函数的显示原型的值

  4. 内存结构:(图)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qhTI1RqX-1633335572560)(/Users/zhiyonghuang/Library/Application Support/typora-user-images/image-20211003234035462.png)]

  1. 总结:
    • 函数的prototype属性:在定义函数时自动添加的 , 默认值是一个空Object 对象
    • 对象的__ proto __属性: 创造对象时自动添加的, 默认值为构造函数 的prototype属性值
    • 程序员能直接操作显式原型, 但不能直接操作隐式原型(ES6之前)
原型链
  1. 原型链(图解)

    • 访问一个对象的属性时

      • 先在自身属性中查找,找到返回
      • 如果没有, 再沿着__ proto __这条链向上查找,找到返回
      • 如果最终没有找到, 返回undefined
    • 别名: 隐式原型链

    • 作用: 查找对象的属性( 方法)

  2. 构造函数 / 原型 / 实体对象的关系(图解)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-D1HHkeJt-1633335572561)(/Users/zhiyonghuang/Library/Application Support/typora-user-images/image-20211004001813541.png)]

原型链补充
  1. 函数的显式原型指向的对象默认是空Object实例对象(但Object不满足)

    console.log(Object.prototype instanceof Object) //false
    console.log(Function.prototype instanceof Object) //true
    
  2. 所有函数都是Function 的实例 ( 包含Function)

    console.log(Function.__ proto __===Function.prototype) //true
    
  3. Object 的原型对象是原型链尽头

    console.log(Object.prototype.__ proto __) //null
    
原型链属性问题
  1. 读取对象的属性值时 : 当访问对象的属性或方法时,先在当前实例对象是查找,然后再去原型对象查找,并且原型对象被所有实例共享。
  2. 设置对象的属性值时 : 不会查找原型链 , 如果当前对象中没有此属性 , 直接添加此属性并设置其值
  3. 方法一般定义在原型中, 属性一般通过构造函数定义在对象本身上

闭包

1.如何产生闭包
  • 当一个嵌套的内部(子)函数引用了嵌套的外部(父)函数的变量(函数)时,就产生了闭包
闭包到底是什么
  • 使用chrome调试查看
  • 理解一: 闭包是嵌套的内部函数
  • 理解二: 包含被引用变量( 函数 )的对象
  • 注意 : 闭包存在于嵌套的内部函数中
产生闭包的条件
  • 函数嵌套

  • 内部函数引用了外部函数的数据(变量/函数)

    <script>
      function foo() {
        let i = 0;
    
        // 函数内部分函数
        function bar() {
    			console.log(++i);
        }
    
        // 将函数做为返回值
        return bar;
      }
      
      // fn 即为闭包函数
      let fn = foo();
      
      fn(); // 1
    </script>
    
常见的闭包
//将函数作为实参传递给另一个函数调用
function showDelay (msg,time) {
	setTimeout ( function () {
		alert(msg)
	},time)
}
showDelay('nihao',2000)
闭包的作用
  1. 使用函数内部的变量在函数执行完后, 仍然存活在内存中( 延长了局部变量的生命周期)
  2. 让函数外部可以操作(读写)到函数内部的数据( 变量/ 函数)

问题:

  1. 函数执行完后, 函数内部声明的局部变量是否还存在?

    • 一般是不存在,存在于闭包中的变量才可能存在
  2. 在函数外部能直接访问函数内部的局部变量吗?

    • 不能,但是我们可以通过闭包让外部操作它
闭包的生命周期
  1. 产生: 在嵌套内部函数定义执行完时就产生了( 不是在调用)
  2. 死亡: 在嵌套内部函数成为垃圾对象时
内存溢出和内存泄漏
  1. 内存溢出

    • 一种程序运行出现的错误
    • 当程序运行需要的内存超过了剩余的内存时,就抛出内存溢出的错误
  2. 内存绣楼

    • 占用的内存没有及时释放
    • 内存泄漏积累多了就容易导致内存溢出
    • 常见的内存泄漏
      • 意外的全局变量
      • 没有及时清理的计时器或回调函数
      • 闭包

闭包面试题

用断点一步步看

function fun(n,o) {
      console.log(o);
      return {
        fun: function(m){
          return fun(m,n)
        }
      }
    }
    // var a=fun(0)
    // console.log(a.fun(3));
    // var b=fun(0).fun(1).fun(2).fun(3) //undefined,0,1,2
    // console.log(b);
    var c= fun(0).fun(1) //undefined,0
    console.log(c.fun(3)); //unefined,0,1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值