js读书笔记

51 阅读4分钟

javascript第4版

javascript语言核心特性

基础

  • 运算符
  • 数据类型
  • 流程控制
  • 变量

动态类型

弱类型

面向对象

  • 原型链

    • 任何时候创建一个函数,就会有响应的规则为这个函数创建一个prototype属性,指向原型对象

    • 该原型对象会自动获得一个constructor属性 指向该构造函数,其余属性都继承自object对象

    • 每次创建通过构造函数创建对象实例,实例的prototype属性指向构造函数的prototype指向的原型对象

      • 但是js实例对象上没有prototype属性 故诞生了proto 在这里就理解为前面的prototype属性
    • 结论:实例与构造函数指向的原型对象有联系,与构造函数没有

    • 构造函数 实例 原型对象是三个不同的对象

    • 同一个构造函数创建的实例对象 共享原型对象

    • 判断是否为原型对象 isprototypeof实例

      • 取得原型对象 getprototypeof
    • 修改对象的原型对象

      • setprototypeof
      • 通过create指定原型对象
    • 实例对象可以访问原型对象上的值,但是不是修改

    • 如何确定属性在实例上,还是在原型对象上

      • hasownproperty
    • 两种访问属性的操作符

      • in操作服

        • 可以访问实例对象 或者原型对象属性 两者都返回true
      • for in操作

  • 继承

  • 对象

    • 对象创建

      • new一个对象 然挂载属性创建

        • new object
      • 字面量创建

      • 工厂模式

        • 创建函数

          • 函数内new object
          • 然后挂载属性
          • 返回对象
      • 构造函数模式

        • new person 注意this

          • 会进行如下操作

          • 1.内存中创建一个对象

          • 2.对象的prototype属性会赋值为构造函数的prototype属性

            • 而新创建对象的constructor属性指向Person函数
          • 3.构造函数中的this指向这个对象

          • 4.执行构造函数代码 挂载属性

          • 5.若非空,返回创建的对象 否则,返回刚创建空对象

        • 构造函数也是函数 唯一区别 调用方式不同

        • 若直接调用,属性挂在window对象

        • 问题:实例方法都挂在每一个实例的上面 同名却不相等

          • 解决:定义全局方法,然后挂载在构造函数方法上

            • 新问题:导致全局作用域下很多自定义的方法(尤其含有this)

              • 解决办法 prototype

              • 每个函数都走prototype属性,它是一个对象,是通过调用构造函数创建的原型对象

                • 好处

                  • 在其上面定义的属性和方法会被对象实例共享,这里面的方法都是同一个引用,而不是每个实例都挂载一个不同的引用。节省空间,也解决了污染全局作用域
    • 对象属性

      • 数据属性

        • 描述属性特征 一般用双中括号括起来

        • [[configurable]]

          • 默认为true 是否可以删除该属性 是否可以修改以下几个特性 如果为false则该属性的defineProperty则失效

            • 该属性被设置为false就不能设置为true 了
        • [[enumerable]]

          • 默认为true 是否可以通过for-in拿到这个属性
        • [[writable]]

          • 默认为true 表示值是否可以被修改
        • [[value]]

          • 默认值undefined
      • 访问器属性

        • 不含数据值

        • getter实例

        • setter实例

          • 参数为设置的新值
      • 定义多个属性

        • defineproperties静态
      • 获得属性描述符

        • getownpropertydescriptor静态

          • 对于数据属性

            • 返回configurable,enumerable,writable,value
          • 对于访问器

            • 返回get set configuarable enumerable
        • getownpropertydescriptors静态

          • 对象每个自由属性调用getownpropertydescriptor
    • 合并对象

      • assign

        • 一个目标对象

        • 几个属性源对象

        • 复制的属性为源对象中1,可枚举的属性和2,自由的属性3,字符串和符号为键的属性

        • 复制原理 取源对象属性的get拿到值 赋值到目标对象的set函数参数里面

        • 结果对象和目标对象属于一个引用

        • 本质,为浅复制

          • 只复制源对象上一些复杂类型值的引用(内存地址)
        • 无回滚,中间复制中断,可完成中断之前的复制,这里和数据库操作类比一下 很容易理解

    • 对象标识 及相等判定

      • ===

        • nan===nan返回false 必须使用isnan判断
        • {}==={} false
        • +0===-0 true
        • +0===0 true
        • -0===0 true
      • object.is

        • 接受两个比较的参数 和===类似 有区别
        • +0 0 true
        • -0 0 false
        • nan nan true
        • +0 -0 false
        • 比较多个 使用递归
    • 增强对象语法

      • 属性值简写

      • 可计算属性

        • 中括号
      • 简写方法名

        • 获取与设置函数同样适用
        • 与可计算属性兼容
      • 对象解构

        • 属性名不同
        • 设置默认值
        • 结构右值会自动执行toobject
        • 嵌套解构 结构源属性值为对象的 为引用
  • 封装

    • 隐藏细节 暴露接口
  • 多态

    • 同一个接口不同对象的不同行为
  • 抽象

    • 对象抽象描述,定义一些对象的共同特征

解释执行

函数式编程

  • 高阶函数
  • 闭包

事件驱动

跨平台