前言:最近再看winter大佬写的前端知识架构,理解到自己刚好是处于这个知识不能形成系统的一个阶段,所以打算写下这篇笔记。

数据类型包括:Undefined Null Boolean String Number Symbol Object
1.Undefined:表示未定义,任何变量赋值前都是 undefined,不是关键字,一般用void 0代替,(并且作为全局对象,不能被修改,局部对象可以)。
2.Null:定义了但是为空,并且null为关键字。
3.String:最大长度受字符串的UTF16编码长度影响为2^53-1。
4.Number:符合IEEE规定的双精度浮点规则,(额外:NaN,Infinity,-Infinity)
0.1+0.2 != 0.3(浮点数精度问题,也就是计算机计算是把十进制转2进制,然后这几个数只能无限表达)
5.Symbol:(一切非字符串的key的集合)
6.Object:一切。。。
2.类型转换:
相应规则:
- 1.StringToNumber:Number()可支持十,二,八,十六进制,正负号,科学计数。parseInt()不能传入第二个参数,默认16和parseFloat并非如此。
- 2.NumberToString:多数情况下可以采用Object.prototype.toString与typeOf结合来判断类型(拆箱转换:经过valueOf和toString)
3.javascript对象:
Object.defineProperty可以用于定义属性,可以改变writable和enumerable..。
(vue2.0采用此方式进行双向绑定)
1.数据属性:
* value:属性值。
* writable: 决定属性能否被赋值。
* enumerable:决定for in能否枚举该属性。
* configurable:决定该属性能否被删除或者改变特征值。
2.访问器属性:
* getter:函数或undefined,在取属性值时被调用。
* setter:函数或 undefined,在设置属性值时被调用。
* enumerable:决定 for in 能否枚举该属性。
* configurable:决定该属性能否被删除或者改变特征值。
4关于javascript中的类与对象:
下图是网上一张关于原型和原型链即new的操作的图: var person = new Person()

-
1.javascript原型:
- 如果所有对象都有私有字段 [[prototype]],就是对象的原型。
- 读一个属性,如果对象本身没有,则会继续访问对象的原型,直到原型为空或找到为止。
-
2.new做了什么:
- 以构造器的 prototype 属性(注意与私有字段 [[prototype]] 的区分)为原型,创建新对象。
- 将 this 和调用参数传给构造器,执行;
- 如果构造器返回的是对象,则返回,否则返回第一步创建的对象。
-
3.Es6中的类:
ES6 中引入了 class 关键字,并且在标准中删除了所有 [[class]] 相关的私有属性描述,类的概念正式从属性升级成语言的基础设施,从此,基于类的编程方式成为了 JavaScript 的官方编程范式。其中constructor函数里是实例属性,之外是原型属性,extends关键字是继承。
-
4.对象分类:
-
宿主对象(host Objects):由 JavaScript 宿主环境提供的对象,它们的行为完全由宿主环境决定。
-
内置对象(Built-in Objects):由 JavaScript 语言提供的对象。
固有对象(Intrinsic Objects ):由标准规定,随着 JavaScript 运行时创建而自动创建的对象实例。
原生对象(Native Objects):可以由用户通过 Array、RegExp 等内置构造器或者特殊语法创建的对象。
普通对象(Ordinary Objects):由{}语法、Object 构造器或者 class 关键字定义类创建的对象,它能够被原型继承。
-
1.函数对象的定义是:具有 [[call]] 私有字段的对象,构造器对象的定义是:具有私有字段 [[construct]] 的对象。
2.[[call]] 私有字段必须是一个引擎中定义的函数,需要接受 this 值和调用参数,并且会产生域的切换。
3.任何对象只需要实现 [[call]],它就是一个函数对象,可以去作为函数被调用。而如果它能实现 [[construct]],它就是一个构造器对象,可以作为构造器被调用。
5.宏观任务和微观任务:SetTimeOut(宏观) Promise,async/await微观(async 函数必定返回 Promise)
微观任务优先于宏观任务(由于javascript引擎等待宿主环境分配任务)
6.闭包和执行上下文以及作用域等。
闭包:(环境部分(函数词法环境+标识符【函数中用到的未声明变量】)+表达式部分(函数体))
执行上下文:执行的基础设施,包含以下:

块级作用域
7.函数种类:
当一个函数执行时,会创建一条新的执行环境记录,记录的外层词法环境(outer lexical environment)会被设置成函数的 [[Environment]]。
当函数调用时,会入栈一个新的执行上下文,函数调用结束时,执行上下文被出栈。

* lexical:表示从上下文中找 this,这对应了箭头函数。
* global:表示当 this 为 undefined 时,取全局对象,对应了普通函数。
* strict:当严格模式时使用,this 严格按照调用时传入的值,可能为 null 或者 undefined,对应了class。
8.try里面放return,finally依旧会执行。因为js语句执行之后的状态:
[[type]] 表示完成的类型,有 break continue return throw 和 normal 几种类型;(普通语句执行之后得到type为normal)
[[value]] 表示语句的返回值(表达式语句),如果语句没有,则是 empty;
[[target]] 表示语句的目标,通常是一个 JavaScript 标签(标签在后文会有介绍)。
9.为什么12.toString会报错? 与javascript词法定义有关。代码执行,会将12.看做是一体。词法包括以下几种:


关于函数体、模块和脚本能使用的语句的表格:

12.预处理:
JavaScript 执行前,会对脚本、模块和函数体中的语句进行预处理。预处理过程将会提前处理 var、函数声明、class、const 和 let 这些语句,以确定其中变量的意义。
var 除了脚本和函数体都会穿透
13.javascript语句:

