var let const的区别
一)var声明变量存在变量提升,let和const不存在变量提升
二)let、const都是块级局部变量
三)同一作用域下let和const不能声明同名变量,而var可以
那么笔试题
for(let i=0;i<5;i++){
setTimeout(function(){
console.log(i);
},0)
}
console.log(i);
输出:5 0 1 2 3 4
for(var i=0;i<5;i++){
setTimeout(function(){
console.log(i);
},0)
}
console.log(i);
输出:5 5 5 5 5 5
这里是为什么呢?
其实我们可以把let声明的变量,它的局部定义域理解为闭包,就是把这个变量在函数声明的同时,给到它的父级域里面使它保存下来,我说的可能有点抽象,不对的地方请指正
但其实到这里这三个还是没有结束,因为还有一个特殊的const的作用,正所谓存在即合理,自然有它的特点,
const
这里独特强调一下,因为我认为我准备够充分了,但还是被面试官小姐姐问蒙了,
小姐姐问:const 声明一个变量必须给它赋值吗?
答:必须,不赋值会报错
问:const声明的值能改变吗?
答:不可以,重新赋值会报错
问:那如果给它一个数组或者对象,去修改对象里面的属性或者数组里面的值呢?
答:???还有这操作呢?没用过呀
问:那你回家再看看吧,我们公司不适合你(玩笑话)
然后完了我仔细看了下,原来这基本数据类型和引用数据类型放在栈中是不一样的,基本数据类型会放一个值,而引用数据类型是放的一个地址,这我虽然知道,可我从未这么去想过const,浅薄了,浅薄了,那么这也就迎刃而解了
const声明的变量的值,对引用类型而言放的是一个地址,地址并不会变,但地址所对应的那个数组对象是可以修改的
提到栈,又想到了数组和对象的深浅拷贝的面试题,下次讲解