从设计层思考JavaScript

ECMAScript与JavaScript

  • ECMAScript是JavaScript的规范,JavaScript是ECMA的具体实现
  • ECMAScript只是JavaScript的一部分
  • JavaScript由ECMAScript,文档对象模型(DOM)浏览器对象模型(BOM)组成

ECMAScript主要版本与ES6

  • ES3是各大浏览器支持度最高的一个版本,几乎所有的浏览器都支持ES3
  • ES4版本因争议巨大而放弃,一部分作为3.1发版,一部分由ES6实现
  • 09年底推出ES5,这一版是我们最熟悉的一版,因为ESMA完全支持向下兼容,所以ES5也通常是我们学习JavaScript的起点。
  • 到了2015年6月,ES6横空出世,它变革巨大、增幅很多,推动JavaScript语言向着越来越规范、严格的方向走
  • 而后ES7/ES8都是作为ES6的补充,可以理解为小版本升级

语言设计思想

  • 语言设计之灵魂拼接

    • 借鉴了C的基本语法
    • Java的数据类型/内存管理
    • scheme函数式编程语言风格
    • self的原型
  • JavaScript是函数式编程+面向对象编程糅合出的产物

    • 面向对象基本规则
      • 属性与方法的综合体
      • 不存在独立的属性和方法
    • 原型编程语言基本规则
      • 所有的数据都是对象
      • 对象会记住他的原型
      • 当请求访问对象的某个方法无法响应时,会把这个请求委托给自己的原型

区分对象

  • 本地对象: 独立于宿主环境的,ECMAScript实现提供
  • 内置对象: ECMAScript实现提供,无需实例化
  • 宿主对象: 执行JS脚本的环境提供的对象,一般是浏览器

window对象挂载来源

  • 浏览器对象模型(BOM)- 如window.location
  • 宿主环境对象提供的全局作用域 - 全局变量/方法都会成为window的对象/属性

语言的执行规则

  • 赋值:赋值变量的内存地址,包括值类型
  • 变量提升:先定义后执行,定义与执行分步进行.首先自上向下执行定义语句,其后执行赋值语句

奇怪的undefined与null

  • undefined和null都是JS的基本数据类型,但null实际是比较特殊的基本数据类型
  • undefined的数据类型为undefined,而null的数据类型是Object
  • undefined所代表的含义是缺少值
  • null是对象,存在于堆中,它是唯一的,也是原型链的终点

引用类型

  • Array和function的值都是Object
  • Array和Function是Object的派生类

返回undefined的3种情况

  • 定义未赋值的变量
  • 函数默认的返回值
  • 访问不存在的对象属性

函数的执行规则

  • 不存在独立的函数,所有的函数必定是某个对象的方法
  • 只要是函数声明,在内存中就一定有一个引用名称
  • 当我们调用一个函数fn,首先会去栈中检索有没有定义fn的变量,如若有,根据fn存储的内存地址找到相应的内存空间.如何fn变量没有存储内存空间,就去堆中找fn的引用;没有,在堆中查找fn的引用

闭包

  • 闭包是纯函数编程的一种语言特征
  • 闭包是一个函数在创建时允许访问自身作用域之外的变量

普通函数和构造函数的区别

  • 相同点
    • 都是在堆中开辟内存空间
    • 都是函数对象
  • 不同点
    • 构造函数需要通过new来创建实例
    • 普通函数直接调用
    • 构造函数的返回值不报错也无意义
    • 人为习惯将构造函数首字母大写

construct