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