前端—今日面试题
var、let和const的区别
简介:能用const的情况下尽量使用const,大多数情况使用let,避免使用var
技巧:const一般声明引用数据类型,let一般声明基本数据类型
区别:
var | let | const | |
---|---|---|---|
变量提升 | √ | ||
块级作用域 | √ | √ | |
同一个作用域下重复声明 | √ | ||
修改变量的值 | √ | √ |
var的特点
1.存在变量提升;
// 编辑器中
console.log(a);
// 打印undefined
var a = 1;
// 变量提升的效果
// 编译过程会将var a;提升到最前面
var a;
console.log(a);
a = 1;
注意:赋值不会提升,所以打印undefined,而不是打印1
2.可以多次声明,最后一次声明有效
var a = 1;
var a = 2;
console.log(a);
// 打印 2,后一次声明会覆盖上一次声明
3.关于函数中的var
3.1 函数中使用var,则为局部变量
var a = 1;
function change(){
var a = 2;
}
change();
console.log(a);
// 打印 1
简单说;函数内部属于局部作用域,在局部作用域内寻找a变量,如果寻找不到,去函数外全局作用域寻找a变量(就近原则)
//使用自执行函数
var a = 1;
(function() {
var a = 2;
// 此处存在作用域和作用域链的知识点
console.log(a);
// 输出: 2
})();
console.log(a); //输出:1
3.2函数内不使用变量声明关键字(var),该变量是全局的
var a = 1;
(function() {
a = 2;
console.log(a);
// 输出: 2
})();
console.log(a); //输出:2
4.基本不会使用,尽量避免使用,存在污染变量和内存泄露等问题
使用 let 可以避免 var 在 for 循环中带来的弊端,因为它提供了块级作用域,使得循环变量只在循环内部有效。
// 使用 var
for (var i = 0; i < 5; i++) {
console.log(i);
// 0, 1, 2, 3, 4
}
console.log(i);
// 5,i 仍然可以访问,因为它是函数作用域
// 使用 let
for (let j = 0; j < 5; j++) {
console.log(j); // 0, 1, 2, 3, 4
}
// console.log(j);
// ReferenceError: j is not defined,j 只在 for 循环的块级作用域内有效
var具有函数作用域,在同步异步中关于for循环的问题
如下例子,var声明的i时函数作用域的,回调函数共享同一个i,异步执行时,i已经变成5,因此都会输出5
for(var i = 0; i < 5 ; i++){
setTimeout(function(){
console.log(i)
) }
}
使用let具有块级作用域来解决,在每一次定时器回调函数的时候都在函数块里声明了一个i,相当于声明了5次,所以打印0-4
for(let i = 0; i < 5 ; i++){
setTimeout(function(){
console.log(i)
)}
}
let的特点
1.不存在变量提升,在声明之前,不可以使用(暂时性死区)
console.log(a)
// 报错,变量a没有定义
let a = 1;
2.块级作用域
{
let a = 1;
}
console.log(a);
// 报错,变量a没有定义
3.在相同的作用域中不可以重复声明
let a = 1;
let a = 2;
// 报错,变量a已经被定义
// 在不同的作用域中不会报错
let a = 1;
{
let a = 2;
}
// 不会报错
const的特点
1.声明只读变量,声明之后,变量的值不可改变,相当于常量
const a = 1;
a = 2;// 报错,a是一个常量
2 const声明必须初始化
3.const声明对象,变量指向的内存地址所保存的数据不可以改动
const obj = {
age: 17
}
obj.age = 18;
// obj内存地址没有改变,而是地址下obj的一个属性的值发生改变,是ok的
// obj被赋予一个新的对象,内存地址发生变化,报错
obj = {
age: 18
}
4.块级作用域等let的特点const都有
标签:面试题,console,log,作用域,前端,let,var,const From: https://blog.csdn.net/weixin_53649241/article/details/140379213