1. JavaScript变量 (共分为四个小标题)
1.1 变量的定义
变量是JavaScript中最基本的存储单位,可以用来存储各种数据类型。变量的定义一般使用关键字var,也可以使用let或const。其中,var被广泛使用,let用于块级作用域的变量声明,而const声明常量。下面是变量的定义方式:
//使用var关键字定义变量
var a = 10;
//使用let关键字定义变量
let b = 'hello';
//使用const关键字定义常量
const c = ['apple', 'banana', 'orange'];
1.2 变量的命名规则
变量在命名时需要遵循一定的规则,常见的规则有:
变量名只能包含字母、数字、_或$符号。
变量名第一个字符不能是数字。
变量名不能使用JavaScript保留字。
例如:
//正确的变量命名
var studentName = 'Tom';
var student_age = 18;
var _salary = 2000;
//错误的变量命名
var 2num = 2; //变量名不能以数字开头
var var = 'var'; //变量名不能使用JavaScript关键字
1.3 变量作用域
JavaScript变量的作用域分为全局变量和局部变量。全局变量在整个程序中均可访问,而局部变量只在声明它的函数或语句块中可访问。
//定义全局变量
var globalVar = 10;
function func() {
//定义局部变量
var localVar = 20;
console.log(globalVar); //可以访问全局变量
console.log(localVar); //可以访问局部变量
}
func();
console.log(globalVar); //10
console.log(localVar); //Uncaught ReferenceError: localVar is not defined
1.4 变量提升
JavaScript中变量声明有提升的特性,即变量在声明之前就可以被访问到。这是因为在JavaScript解析执行时,变量声明会被提升到函数或全局作用域的顶部,但是变量的赋值不会被提升。
function func() {
console.log(a); //undefined,变量a被提升了
var a = 10; //变量赋值
console.log(a); //10
}
func();
2. JavaScript数据类型(共分为五个小标题)
2.1 基本数据类型
JavaScript有六种基本数据类型,分别是:
Number(数字类型)
String(字符串类型)
Boolean(布尔类型)
Null(空类型)
Undefined(未定义类型)
Symbol(符号类型,ES6新增)
var num = 10; //Number类型
var str = 'hello'; //String类型
var bool = true; //Boolean类型
var n = null; //Null类型
var und = undefined; //undefined类型
var sym = Symbol('foo'); //Symbol类型
2.2 对象类型
除了基本数据类型外,JavaScript还有一种复杂类型,即对象类型。对象类型可以存储多个键值对的数据,这些数据可以是基本数据类型或其他对象类型。
//定义对象类型
var obj = {
name: 'Tom',
age: 18,
isStudent: true
};
2.3 typeof运算符
typeof运算符可以返回数据类型的字符串表示,它可以应用于任何数据类型,包括基本数据类型和对象类型。
console.log(typeof 10); //"number"
console.log(typeof 'hello'); //"string"
console.log(typeof true); //"boolean"
console.log(typeof null); //"object"
console.log(typeof undefined); //"undefined"
console.log(typeof Symbol('foo')); //"symbol"
console.log(typeof {}); //"object"
console.log(typeof []); //"object"
2.4 强制类型转换
JavaScript中的数据类型转换涉及到两种类型的转换:隐式类型转换和显式类型转换。隐式类型转换是自动发生的,不需要人为干预。而显式类型转换需要通过一些函数或运算符来执行。
console.log(10 + 'hello'); //"10hello",隐式转换
console.log(Number('123')); //123,显式转换
console.log(String(123)); //"123",显式转换
console.log(Boolean(1)); //true,显式转换
2.5 NaN和Infinity
NaN和Infinity是两个特殊的数值,它们属于Number类型。NaN表示“不是数字”,Infinity表示正无穷或负无穷。
console.log(10 / 'foo'); //NaN
console.log(1 / 0); //Infinity
console.log(typeof NaN); //"number"
console.log(typeof Infinity); //"number"
3. 全局变量和全局对象
3.1 全局变量
全局变量是定义在全局作用域中的变量,它可以被程序的任何部分访问到。在JavaScript中,定义全局变量可以使用关键字var,但通常不会这样做,而是直接声明一个变量,这样就会自动成为全局变量。
var globalVar = 10; //全局变量
function func() {
console.log(globalVar); //10,可以访问全局变量
}
func();
3.2 全局对象
JavaScript中有一个全局对象window,它代表整个浏览器窗口。在浏览器中,定义的全局变量和方法都会成为window对象的属性和方法。
var num = 10; //全局变量
function func() {
console.log('hello');
}
console.log(window.num); //10,访问全局变量
window.func(); //"hello",调用全局函数
4. 作用域链和闭包(共分为三个小标题)
4.1 作用域链
在JavaScript中,每个函数都有一个作用域。当函数被调用时,就会创建一个新的作用域,该作用域包含函数内定义的所有变量和函数。
当访问一个变量时,JavaScript会沿着作用域链向上查找该变量。作用域链的顶部是全局作用域,最底部是当前函数作用域。
var num = 10; //全局变量
function outer() {
var num = 20; //局部变量
function inner() {
console.log(num); //20,在当前作用域链中查找变量num
}
inner();
}
outer();
4.2 闭包
闭包是指一个函数可以访问并操作函数外部的变量,即使该函数已经返回了。闭包是一种强大的特性,可以用来创建私有变量或实现高阶函数等功能。
function outer() {
var num = 10; //局部变量
return function inner() {
console.log(num); //可以访问父函数的变量
}
}
var innerFunc = outer();
innerFunc(); //10
4.3 this关键字
this是JavaScript中的一个关键字,它通常指向当前对象。在全局作用域或非严格模式下的函数中,this指向全局对象;而在严格模式下的函数中,this指向undefined。
console.log(this); //Window对象,在全局作用域下
function func() {
console.log(this); //Window对象,在非严格模式下
}
func();
'use strict';
function func() {
console.log(this); //undefined,在严格模式下
}
func();
5. 变量提升和函数提升
5.1 变量提升
JavaScript中的变量声明有提升的特性,即变量可以在声明之前访问到。这是因为在JavaScript解析时,变量声明会被提升到函数或全局作用域的顶部,但是变量的赋值不会被提升。
console.log(num); //undefined,变量被提升了
var num = 10; //变量赋值
5.2 函数提升
只有函数声明有函数提升的特性,即函数可以在声明之前调用。函数表达式没有函数提升的特性,必须在声明之后才能调用。
func(); //直接调用,函数被提升了
function func() {
console.log('hello');
}
var func2 = function() {
console.log('world');
};
func2(); //必须在声明之后才能调用
总结以上内容,比较重要的是JavaScript中的变量定义,包括变量命名规则和变量的作用域;函数提升和变量提升的特性;以及闭包的概念和用法。此外,全局变量和全局对象、数据类型以及类型转换也是需要掌握的知识点。我们要根据实际需求,适时地选择使用不同的变量类型和数据类型,以及了解各种数据类型转换的方法。