目录
一.let
let是 Es6新增语法,用来声明变量。
作用: 声明一个块级作用域的本地变量
可以设置初始值
注意点:1.不能重复声明
2.有块级作用域
3.不会变量提升
语法
// 声明变量
let z
// 声明并赋值
let a = 10
// 重新赋值
a = 55
//打印结果
console.log(a) //55
【注意点1-不允许重复声明】
//let 不允许在相同作用域内,重复声明同一个变量。
function fu() {
let a = 10;
}
function fu1() {
let a = 10;
}
【注意点2-有块级作用域】
// 它的用法类似与var,但是所有声明的变量,只能在let命令所在的代码块内有效。
// 在下面代码块之中,分别用let和var声明了两个变量。
{
let x = 10;
var d = 1;
console.log(x); //10
console.log(d); //1
}
// console.log(x); //x is not defined
console.log(d) //1
// 结果let声明的变量报错,var声明的变量返回了正确的值。
// 这表面,let声明的变量只在它所在的代码有效
【注意点3-不会变提升】
// var命令发生“变量提升”现象,即变量可以在声明之前使用,值为underfined。
// 这种现象多多少少是有些奇怪的,按照一般的逻辑,变量应该在声明语句之后才可以使用。
// 未来纠正这种现象,let命令改变了语法行为,它声明的变量一定要在声明后使用,否则报错。
// var的情况
console.log(foo); //undefined
var foo = 2;
// let情况
// console.log(ber); //Cannot access 'ber' before initialization(无法在初始化之前访问变量)
let ber = 2;
二、const
const声明一个只读的常量。一旦声明,常量的值就不能改变.
注意点:1.基本类型数据无法重新赋值(引用类型可以改变内容)
2.必须设置初始值
3.有块级作用域
4.不会变量提升
5.不能重复声明
语法
const y = 10;
【注意点1 - 基本类型数据无法重新赋值】
const pi = 3.1415926;
console.log(pi);
pi = 5;
console.log(pi); //Assignment to constant variable.(赋值给常量变量。)
【注意点2 - 必须设置初始值】
const n;
console.log(n);//Missing initializer(缺少初始值)
//中声明不符值,就会报错。
【 注意点3 - 有块级作用域】
//const的作用域和let命令相同:只在声明的块级作用域有效
{
const max = 5;
}
console.log(max); //Assignment to constant variable.(赋值到常量变量)
【 注意点4 - 不会变量提升】
// const 命令声明的常量也是不能提升,同样存在暂时性死区,只能在声明的位置后面使用。
{
console.log(max);//Cannot access 'max' before initialization
const max = 5;
}
在const中,并不是变量的值不得改动,而是变量指向的那个内存地址所保存的数据不得改动。
对于简单类型的数据(数值、字符串、布尔值),值就保存在变量指向的那个内存地址,因此等同于常量。
但对于复合类型的数据(主要是对象和数组),变量指向的内存地址,保存的只是一个指向实际数据的指针。
const只能保证这个指针是固定的(即总是指向另一个固定的地址)。
// 基本数据类型无法重新赋值。
// 引用类型(对象、数组...),可以更改内容。
//(注:不能改的是栈)
const q = [];
q.push('hello'); //可执行
console.log(q.length); //1
a.length = 0; //可执行
console.log(q.length); //0
q = ['Dave'] //Assignment to constant variable.(分配给常量变量)
//上面的代码中,常量q是一个数组,这个数组本身是可以写,但是如果将另一个数组赋值给q,就会报错。
三.var
var现在基本不用它,但要认识
作用: 1.设置变量
2.和let非常类似
注意点:1:变量会提升
2.没有块级作用域
var与let的区别和相同点:1.在只声明变量不赋值时,打印该变量时都是undedined
2.var 变量声明会提前,let无发提升
3.var没有块级作用域,let有块级作用域
语法
// 【语法】
// 1.声明变量 var food
//2. 变量声明 + 初始值
var noodle = '重庆小面'
// 3.重新赋值
noodle = '兰州拉面'
console.log(noodle); //兰州拉面
// 【注意点1:变量会提升】
console.log(num);
var num = 10;
// 【注意点2:没有块级作用域】
for (var i = 1; i < 5; i++) {
console.log('循环内' + i);
}
console.log('循环外' + i);
四.变量提升
先了解一下 栈内存与堆内存
栈内存:作用域
1.提供一个存放供js代码自上而下执行的环境(代码都是在栈中执行的),
2.由于基本数据源类型值都比较简单,他们都是直接在栈内存中开辟一个位置,把值直接存进去
ps:当栈内存被销毁,存储的那些基本值也就被销毁了。
堆内存:引用值对应的空间
1.存储引用类型值(对象:键值对 函数: 代码字符串)
ps:当前堆内存释放销毁,那么这个引用值彻底没了
变量提升
变量提升即将变量声明到它所致作用域。
当栈内存(作用域)形成的,js代码自上而下执行之前,浏览器首先会把带有 “var”、"function"关键字的进行提前“声明”或“定义“,这种预先处理的机制就是变量提升。
声明(declare):var a ; (声明的时候 默认返回值是undefined)
定义(defined):a=12 (定义也可以简单理解为赋值)
//通过var定义(声明)的变量,在定义语句之前就可以访问到。
console.log(a) //underfined
var a = 1;
//上面代码实际执行顺序
var a ;
console.log(a);
var a = 1;