前言
因为学习JS有一段时间了,所以决定做个总结,对于我来说也是一个查缺补漏的过程
文章目录
一、JS的变量
1.JS的数据类型
值类型(基本类型):字符串(String)、数字(Number)、布尔(Boolean)、对空(Null)、未定义(Undefined)、Symbol。
引用数据类型:对象(Object)、数组(Array)、函数(Function)。
2.JS变量的声明(主要讨论var let const)
通过var 或 let 或 const +变量名 三种方式最常用
三种方式的区别:
1.var
最常用的声明变量关键字。 定义变量的时候,可以不初始化,会输出undefined。其值之后可以修改。全局或函数级别作用域,无块级作用域,有变量提升
2.let
let 可以声明块作用域的变量,定义变量的时候,可以不初始化,会输出undefined。其值之后可以修改。无变量提升
3.const
const 声明一个变量的时候,必须同时初始化,且其值之后不可以修改。潜规则一般用大写作为变量名。无变量提升
4.function
声明一个函数
5.class
声明一个类
6.import
加载模块,然后输出变量
3.var let const的区别
1.块级作用域
var没有块级作用域
{
var a=1;
}
a++
console.log(a);
//输出的是2
let,const有块级作用域
{
let a=1;
}
a++
console.log(a);
//直接报错a is not defined
{
const b=1;
}
console.log(b);
//直接报错a is not defined
可以看出来在if for while这些块级作用域里面用var非常不友好,而let和const不会
2. 变量提升
console.log(a,fun);
var a=1;
function fun(){
a=2
}
//输出undefined和fun函数
JavaScript 代码的执行分为两个阶段。第一个阶段解析,第二个阶段执行
解析阶段就是变量提升发生的地方
浏览器会把 “var”、"function"关键字在代码最开始“声明”或“定义“,这种预先处理的机制就是变量提升。
console.log(a,b);//输出的是a函数,undefined
var a=1;
var b=2
function a(){
console.log("a");
}
a=100
console.log(a);//输出的是 100
function a(){
console.log("a3");
}
console.log(a);//输出的是 100
实际上等价于
function a(){
console.log("a");
}
var b
console.log(a,b);
a=1
b=2
a=100
console.log(a);
console.log(a);
总结一下就是
1定义的函数名和变量名相同时,函数提升优先级高于变量,不会被变量声明覆盖
2多个声明的变量相同会被最后一个覆盖
3. 暂时性死区
指的就是在作用域内未声明先使用
{
console.log(a);
let a=1;
}
//报错 Uncaught ReferenceError: Cannot access 'a' before initialization
function test(x = y, y = 2) {
return [x, y];
}
test()
//报错 Uncaught ReferenceError: Cannot access 'y' before initialization
函数里,块级作用域里经常出现很难发现的暂时性死区问题
二. 特殊的情况
1.重复声明
var是允许重复声明的,但是很多时候会造成很多错误,最好不要重复声明
let,const重复声明直接报错
2.更改const
const一般是不可以修改的
但是const声明的对象类型只保证指针指向的地址不变,对象里面的值是可变的
如果要完全禁止修改
应该用 Object.freeze()这个函数