前端—面试题1

var、let和const的区别

简介:能用const的情况下尽量使用const,大多数情况使用let,避免使用var

技巧:const一般声明引用数据类型,let一般声明基本数据类型

区别:

varletconst
变量提升
块级作用域
同一个作用域下重复声明
修改变量的值

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 = 1function 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都有

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值