一、数据类型
数据类型分类:基本数据类型、引用数据类型、大整数 和 Symbol
- 基本数据类型:
Number
、String
、Boolean
、Undefined
和Null
,其中Undefined
和Null
不常用;上述五种数据类型在typeof
作用下分别返回"number
"、"string
"、"boolean
"、"undefined
“和”object
"; - 引用数据类型:
Object
(’Object‘、‘Function’和’Array’),在typeof
作用下返回"object
"; - 大整数:
BigInt
,在typeof
作用下返回"bigint
"; - Symbol:
Symbol
,在typeof
作用下返回"symbol
";
二、数据、内存、变量
- 数据:将实体事物以二进制的形式存储于计算机中的’东东’;
- 内存:我们通常所指的是临时内存(内存条通电后分配的内存空间),固态硬盘是永久存在的。内存分类为栈和堆内存空间,用于存储相应的数据类型数据;
- 变量:由变量名和变量值组成;
总结:数据存储于内存当中,变量是这个数据的标识符,通过这个标识符可以读写操作内存中的数据;
三、对象
对象是一个事物的属性及行为描述的封装体;
四、函数
函数是一个功能模块封装及实现的封装体;
五、构造函数之原型链
- 一切函数都是通过
new Function()
产生(包括函数Function
本身,Object
也是通过new Function()
产生); A instanceof B
:其结果返回true
,表示确定A
对象是B
类的实例或者说实现了某个特定的接口,那么返回true
需要满足的条件是B
类的显示原型与A
对象的隐式原型链有交集;下面是instanceof
案例:
Function instanceof Function // true(注意:Function.__proto__ === Function.prototype,唯一一个对象本身的隐式原型和显示原型相等)
Function instanceof Object // true
Object instanceof Object // true
Object instanceof Function // true
Array instanceof Array // false
Array instanceof Function // true
Array instanceof Object // true
let arr = new Array();
arr instanceof Array // true
arr instanceof Object // true
arr instanceof Function // false
let obj = {
}; // 等同于let obj = new Object();
obj instanceof Object // true
obj instanceof Function // false
六、变量提升、函数提升
- 用
var
来声明的变量名存在变量提升:
console.log(a); // undefined
var a = '变量提升';
- 用此方式声明的函数存在函数提升:
a(); // '函数提升'
function a() {
console.log('函数提升');
}
- 先变量提升,后函数提升
var c = 1;
function c(c) {
console.log(c);
}
c(2); // 报错:c is not a function
var
声明的变量挂载于何处?
if(!(b in window)) {
var b = 1;
}
console.log(b); // undefined 因为非模块化环境下运行,var存在变量提升并且没有代码块这个概念,所以上面语句先`var b;`(var声明的变量会在全局变量挂载和window对象下挂载这个属性,所以此时打印window.b为undefined),然后`if(!(b in window)) {b=1}`,最后打印`console.log(b)`为undefined;如果是在模块化环境下运行,在运行到if判断语句时就会报出b is not defined;
七、执行上下文、执行上下文栈
- 执行上下文: 全局执行上下文、函数执行上下文和
eval
函数执行上下文(此上下文不推荐使用及产生); - 执行上下文栈:由全局执行上下文和函数执行上下文的执行形成的一个栈结构,遵循后进先出原则;
**注意:**执行上下文栈存在“栈溢出”,造成这样的结果是函数多次递归调用的原因;
八、作用域、作用域链
- 作用域就是一个封闭的空间,外界不能读写这个空间的数据(闭包除外);
- 作用域的产生:全局作用域和代码块、函数形成的局部作用域;
- 作用域与执行上下文的区别:作用域是“静态的”,执行上下文是“动态的”。所谓静态就是代码在运行前,作用域就已经产生(
n+1
,1代表的是全局作用域,n代表的是局部作用域),函数所能访问到的上层作用域在函数声明定义时就已经确定了,函数声明在哪里,上层作用域就在哪,和函数在哪里调用没有任何关系(闭包);所谓动态就是执行上下文是在代码运行过程中产生(n+1
,1代表全局执行上下文,n代表函数执行上下文和eval函数执行上下文)。
function test() {
x = 999;
function a() {
console.log