基本类型

String、Number、Boolean、null、undefined、Symbol、BigInt

//7个基本数据类型
typeof 10 //“number”
typeof ‘1’ //“string”
typeof null //“object”
typeof undefined //“undefined”
typeof Symbol() //“symbol”
typeof 9007199254740991n //“bigint”
typeof true //“boolean”

Object
typeof {} //“object”
typeof [] //“object”
typeof /^$/ //“object”
typeof new Date() //“object”

特殊的:
typeof NaN //“number”
typeof function(){} //“function”
typeof null //“object”
typeof [] //不要搞混,typeof 细分对象是不可以的 //“object”

因为在javascript当中值的类型由类型标签+实际数值表示,对象的类型标签是0,而null指向空指针,用0x00的值来表示,所以null的类型标签也是0,因此typeof null 返回 “object”。

链接

0.1+0.2 !== 0.3
image.png

undefined与null

undefined是未指定特定值的变量的默认值,或者没有显式返回值的函数,如:console.log(1),还包括对象中不存在的属性,这些 JS 引擎都会为其分配 undefined 值。
null是“不代表任何值的值”。null是已明确定义给变量的值。在此示例中,当fs.readFile方法未引发错误时,我们将获得null值。

在比较null和undefined时,我们使用==时得到true,使用===时得到false:
console.log(null == undefined); // true
console.log(null === undefined); // false

+是将字符串转换为数字的最快方法
image.png

DOM

DOM 代表文档对象模型,是 HTML 和 XML 文档的接口(API)。当浏览器第一次读取(解析)HTML文档时,它会创建一个大对象,一个基于 HTM L文档的非常大的对象,这就是DOM。它是一个从 HTML 文档中建模的树状结构。DOM 用于交互和修改DOM结构或特定元素或节点。

事件冒泡

当事件发生在DOM元素上,该事件并不完全发生在那个元素上。

阻止事件冒泡:event.stopPropagetion()、cancelBubble = true(IE)、return fasle、event.preventDefault()

event.preventDefault() 方法可防止元素的默认行为。如果在表单元素中使用,它将阻止其提交。如果在锚元素中使用,它将阻止其导航。如果在上下文菜单中使用,它将阻止其显示或显示。event.stopPropagation()方法用于阻止捕获和冒泡阶段中当前事件的进一步传播。

event.target

发生事件的元素或触发事件的元素。

enent.currentTarget

是我们在其上显式附加事件处理程序的元素。

==和===

==用于一般比较,在==比较的时候可以转化数据类型;
===用于严格比较,只要类型不匹配就返回false。

提升

提升是用来描述变量和函数移动到其(全局或函数)作用域顶部的术语。

执行上下文

执行上下文是当前正在执行的“代码环境”,有两个阶段:编译和执行。
编译:JS获取所有函数声明并将其提升到其作用域的顶部,var声明,默认值:undefined。
执行:将赋值给之前的变量提升,并执行或调用函数(对象中的方法)。
注意:只有使用var声明的变量,或者函数声明才会被提升,相反,函数表达式或箭头函数,let和const声明的变量,这些都不会被提升。

作用域

JavaScript中的作用域是我们可以有效访问变量或函数的区域。三种:全局作用域、函数作用域、块作用域(ES6)。

作用域也是一组用于查找变量的规则。如果变量在当前作用域中不存在,它将向外部作用域中查找并搜索,如果该变量不存在,它将再次查找直到到达全局作用域,如果找到,则可以使用它,否则引发错误,这种查找过程也称为作用域链

闭包

闭包是指有权访问另一个函数作用域中变量的函数,创建闭包的最常见的方式就是在一个函数内创建另一个函数,通过另一个函数访问这个函数的局部变量,利用闭包可以突破作用链域,将函数内部的变量和方法传递到外部。

「函数」和「函数内部能访问到的变量」的总和,就是一个闭包。
闭包常常用来「间接访问一个变量」。换句话说,「隐藏一个变量」。

闭包的特性:
(1)函数内再嵌套函数
(2)内部函数可以引用外层的参数和变量
(3)参数和变量不会被垃圾回收机制回收

好处

①保护函数内的变量安全 ,实现封装,防止变量流入其他环境发生命名冲突

②在内存中维持一个变量,可以做缓存(但使用多了同时也是一项缺点,消耗内存)

③匿名自执行函数可以减少内存消耗

坏处

①其中一点上面已经有体现了,就是被引用的私有变量不能被销毁,增大了内存消耗,造成内存泄漏,解决方法是可以在使用完变量后手动为它赋值为null;

②其次由于闭包涉及跨域访问,所以会导致性能损失,我们可以通过把跨作用域变量存储在局部变量中,然后直接访问局部变量,来减轻对执行速度的影响

使用场景

  1. 给对象设置私有变量并且利用特权方法去访问私有属性
  2. 采用函数引用方式的setTimeout调用
  3. 封装相关功能集
  4. 封装块级作用域
  5. 在缓存中使用闭包函数

image.png

JavaScript中的虚值

‘’, 0, null, undefined, NaN, false

use strict

ES5的特性,严格模式,帮助我们在代码的早期避免bug,并为其添加限制。

  1. 消除Javascript语法的一些不合理、不严谨之处,减少一些怪异行为;
  2. 消除代码运行的一些不安全之处,保证代码运行的安全;
  3. 提高编译器效率,增加运行速度;
  4. 为未来新版本的Javascript做好铺垫。

this

this总是指向函数的直接调用者(而非间接调用者);
如果有new关键字,this指向new出来的那个对象;
在事件中,this指向触发这个事件的对象,特殊的是,IE中的attachEvent中的this总是指向全局对象Window。

对象的prototype(原型)

每个对象都会在其内部初始化一个属性,就是prototype(原型),当我们访问一个对象的属性时,如果这个对象内部不存在这个属性,那就回去prototype里找这个属性,这个prototype又会有自己的prototype,一直找下去,就是原型链。

原型就是对象的蓝图,如果它存在当前对象中,则将其用作属性和方法的回退。它是在对象之间共享属性和功能的方法,是JavaScript实现继承的核心。
链接

对象

  • 对象是单个事物的抽象

当实物被抽象成对象,实物之间的关系就变成了对象之间的关系,从而模拟现实情况,针对对象进行编程。

  • 对象是一个容器,封装了属性(property)和方法(method)

属性是对象的状态,方法是对象的行为(完成某种任务)。 在实际开发中,对象是一个抽象的概念,可以将其简单理解为 : 数据集或功能集。

面向对象

面向对象是过程式代码的一种高度封装,目的在于提高代码的开发效率和可维护性。

作用域链

全局函数无法查看局部函数的内部细节,但局部函数可以查看其上层的函数细节,直至全局细节。
当需要从局部函数查找某一属性或方法时,如果当前作用域没有找到,就会上溯到上层作用域查找,
直至全局函数,这种组织形式就是作用域链。