var,let ,const区别(包含习题)

57 阅读3分钟

var

var定义变量

定义变量,不初始化的时候值为undefind

var  message;//定义一个名为message的变量
console.log(message) //undefined
​
​

定义多个变量

var message ="hello",name="liang",age=18;

定义的变量赋值后,可以重新给变量赋值

var message="hello"; //定义了一个message的变量,并赋值了一个字符串类型的值hello
message=100;//不仅可以改变值的类型,还可以改变值

var声明提升

把所有变量的声明拉到函数作用域的顶部

//代码块1
function foo(){
    console.log(age);
    var age = 18;
}
foo(); //undefind
//代码块2
function foo(){
    var age;
    console.log(age);
    age=18;
}
foo(); //undefind
//代码块1等价于代码块2

var的作用域

var具有函数作用域

function test(){
    var message = "hello";
}
test();              //函数执行完变量message被销毁
console.log(message);  //message is not defined//在if()语句之外仍可访问到内部变量
if(true){
    var name = "liang";
    console.log(name);      //liang
}
console.log(name);//liang

注意:var具有局部作用域,即函数作用域

在函数内省略var关键字直接对变量进行赋值,则变量会变成全局变量

即在函数外部能够访问

function test(){
    message = "hello";
}
test();
consle.log(message); //hello

let

let不能在同一个块内同一个变量进行声明

//Identifier 'age' has already been declared
let age;
let age;

let具有块级作用域

if(true){
    let age = 16;
    console.log(age);//26
}
console.log(age);//age is not defined

暂时性死区

在let声明之前的执行瞬间被称为"暂时性死区"

console.log(name);  //name is not defined
let name='里昂'

全局声明

使用let在全局作用域中声明的变量不会成为window对象的属性

let age =26;
console.log(window.age);//undefined

在全局作用域中,不能用let对同一个变量进行声明赋值

//dentifier 'age' has already been declared
let age = 18;
let age = 36;

for循环中let的声明

for(let i=0;i<5;++i){
    setTimewout(() =>{
        console.log(i)
    },1000)
}

const

const声明常量

使用const关键字去声明一个常量,也就是在声明的时候同时初始化

const name ="里昂";

不能对常量重新复制

const age = 18;
age = 15;   //TypeError
​
const person ={};
person.name = '里昂';
consoe.log(person);     //{name:'里昂'}

不允许重复声明

const name="里昂";
const name = "马婷达"; //SyntaxEorror

具有块级作用域

const name = '里昂'
if(true){
    const name = '马婷达';
}
console.log(name);  //里昂
​
​

区分练习

//undefined
var name;
var name;
​
​
//Identifier 'name' has already been declared
let name;
let name;
//----------------//
var name="里昂";
console.log(name);//里昂
if(true){
    var name='马婷达';
    console.log(name);//马婷达
}
​
//
let age = 18;
console.log(age);//18
if(true){
    let age = 26;
    console.log(age);//26
}
//-------------//
if(true){
    var name = '里昂';
    consoloe.log(name);//里昂
}
console.log(name);//里昂//
if(true){
    let age = 26;
    console.log(age); //26
}
console.log(age);//age is not defined//
function fn(){
    var age = 12;
    console.log(age); //12
}
fn();  //函数执行完毕后释放age占用的内存
console.log(age); //age is not defined
//---------------//
console.log(name);  //undefined
var name='里昂'
​
​
//
console.log(name);  //name is not defined
let name='里昂'
​
​
//------------------//
var name ="里昂";
console.log(window.name);//里昂//
let age =26;
console.log(window.age);//undefined
//---------------//
for(var i=0;i<5;++i){
    
}
console.log(i); //5
​
​
//
for(let i=0;i<5;++i){
    
}
console.log(i); 
//-------------//迭代变量保存的是导致循环退出的值
for(var i=0;i<5;++i){
    setTimewout(() =>{
         console.log(i)
    },1000)
}
//输出5 5 5 5 5
​
​
//每个迭代循环都声明一个新的迭代变量
for(let i=0;i<5;++i){
    setTimewout(() =>{
         console.log(i)
    },1000)
}
//输出0 1 2 3 4 //
const person={
    name:"liang",
    age:21,
}
for(const item in person){
    console.log(item);
}
//输出 name,age