课程介绍
本课程主要面向刚刚入门的前端同学,主要讲述了JS的整体发展及一些比较重要的知识。其中通过一些简单的代码讲述了变量提升、JS的数据是怎么存储的、基础数据类型和复杂数据类型的区别等一些基础知识,也讲解了JS的执行、闭包、垃圾回收等一些稍微进阶一些的知识,希望大家能有所收获
笔记
JS的基本概念
JavaScript是一种轻量级的解释型编程语言,它可以在浏览器或服务器端运行,实现动态的交互效果。JavaScript的语法借鉴了C、Java和Perl等语言,但也有自己的特色,如原型继承、函数式编程等。JavaScript的核心是ECMAScript标准,它定义了语言的基本语法和对象。除此之外,JavaScript还包含了一些扩展,如BOM(浏览器对象模型)、DOM(文档对象模型)和ES6(ECMAScript 2015)等。
JS的数据类型
JavaScript有七种基本数据类型,分别是:number、string、boolean、null、undefined、symbol和bigint。其中,number、string和boolean是原始类型,它们不可变且没有属性和方法。null和undefined是特殊值,表示空或未定义。symbol是一种独一无二的标识符,可以用作对象的属性名。bigint是一种可以表示任意精度的整数的类型。
JavaScript还有一种复杂数据类型,就是object。object是一种可变且具有属性和方法的数据结构,它可以表示数组、函数、日期、正则表达式等各种对象。object的属性名可以是任意类型的值,但通常是字符串或symbol。
变量提升
变量提升(hoisting)是JavaScript中一种特殊的机制,它会将变量声明(var)或函数声明(function)提升到当前作用域的顶部,而不管它们实际出现在哪里。这意味着我们可以在声明之前使用变量或函数,但这并不推荐,因为可能会导致意外的结果或错误。
例如:
console.log(a); // undefined var a = 1;
这段代码实际上相当于:
var a; console.log(a); // undefined a = 1;
注意,只有声明会被提升,赋值不会被提升。另外,let和const声明不会被提升,它们会形成块级作用域,并且在声明之前使用会抛出错误。
作用域
作用域(scope)是指变量或函数在程序中可访问的范围。JavaScript有两种作用域:全局作用域和局部作用域。全局作用域是指在任何地方都可以访问的变量或函数,它们通常定义在代码的最外层或者直接挂载在window对象上。局部作用域是指只能在某个特定区域内访问的变量或函数,它们通常定义在函数内部或者使用let或const声明。
例如:
var x = 1; // 全局变量 function foo() { var y = 2; // 局部变量 console.log(x); // 1 console.log(y); // 2 } foo(); console.log(x); // 1 console.log(y); // ReferenceError: y is not defined
闭包
闭包(closure)是指一个函数能够访问并操作其外部作用域中的变量或函数的能力。闭包可以实现一些特殊的功能,如封装私有数据、模拟块级作用域、实现柯里化等。
例如:
function makeCounter() { var count = 0; // 私有变量 return function() { return ++count; // 访问并修改外部变量 }; }
var counter = makeCounter(); // 创建一个闭包 console.log(counter()); // 1 console.log(counter()); // 2 console.log(counter()); // 3
垃圾回收
JS垃圾回收
JavaScript是一种动态类型的编程语言,它不需要程序员显式地分配和释放内存。相反,它使用了一种称为垃圾回收的机制,自动地管理内存的分配和回收。垃圾回收的基本思想是,当一个对象不再被其他对象引用或访问时,它就成为垃圾,可以被回收并释放内存空间。但是,如何判断一个对象是否不再被引用或访问呢?不同的垃圾回收算法有不同的策略和实现方式,本文将介绍两种常见的垃圾回收算法:标记清除和引用计数。
标记清除
标记清除是一种基于可达性的垃圾回收算法,它的核心思想是从一个或多个根对象开始,遍历所有可达的对象,并给它们打上标记,然后清除所有没有标记的对象。根对象是一些固定的、始终存在的对象,比如全局对象、函数参数、局部变量等。可达的对象是指从根对象出发,可以通过引用链找到的对象。