nodejs是javascript的运行环境,可以使用node来测试。
1.定义(声明)变量
es5和es6的区别:
js版本 | 作用域 |
---|---|
es5 | 全局作用域和函数作用域 |
es6 | 块级作用域 |
定义(声明)变量 | 定义的变量是否提升 | 在同一个作用域内,是否可以重复定义 | 变量定义后,是否可以修改 |
---|---|---|---|
var | 是 | 是 | 是 |
let | 否 | 否 | 是 |
const | 否 | 否 | 否 除外 object array修改 |
1. 作用域
//常见的块级作用域
if(){}
for(){}
while(){}
- es5 --->for
//例1
if (true) {
var a = 20;
}
console.log(a)
//例2
for(var i=0;i<10;i++){
//var定义的i是全局变量
}
console.log(i) //10
//例3
var arr = [];
for (var i = 0; i < 10; i++) {
arr[i] = function() {
console.log(i)
}
}
arr[1]() //10
arr[2]() //10
- es6 ---> for
//例1
if (true) {
let a = 20;
}
console.log(a) //a is not defined
//例2
for(let i = 0;i<10;i++){
//let定义的i是局部的变量
}
console.log(i) //i is not defined
//例3
let arr = [];
for (let i = 0; i < 10; i++) {
arr[i] = function() {
console.log(i)
}
}
arr[1]() //1
arr[2]() //2
2. 是否有变量提升
- es5 ---> var有变量提升
var a = 20;
function fn(){
alert(a) //undefined
var a = 5;
}
fn()
//相当于下面代码
function fn(){
var a; //变量提升
alert(a)
a = 5;
}
- es6 ---> let没有变量提升
let a = 20;
function fn(){
alert(a); //a is not defined
let a = 5;
}
3.是否可以重复定义
- es5 ---> 在同一作用域内,var可以重复定义
var a = 10;
//....
var a = 5;
console.log(a); //5
- es6 ---> 在同一作用域内,let不可以重复定义
//例1
let a = 10;
//.....
let a = 5;
console.log(a);
//Uncaught SyntaxError: Identifier 'a' has already been declared
//例2
{
let a = 10;
{
let a = 5;
console.log(a)
}
console.log(a)
}
//例3
for (let a = 1; a < 10; a++) { //父级作用域
let a = 'abc'; //子级作用域
console.log(a);
}
注let:
- let没有变量提升,即在代码块内,只要在let定义之前使用变量就会报错。
- 在同一个作用域内,不能重复定义变量
- let声明的变量不能成为window的属性
- 暂时性死区
3.const定义常量
const注:const在定义时必须有值,不能后赋值(修改),经常用于定义配置文件
const arr = ['apple', 'banner'];
// arr = false;
// console.log(arr) //Uncaught TypeError: Assignment to constant variable.
arr.push("orange"); //const定义的对象可以修改,因为对象是引用类型的。
console.log(arr);
基本类型存储在栈内存中
<h6>引用类型同时存储在堆内存和栈内存中</h6>
例:
总结:
- 定义变量使用let,不要使用var
- const在定义时必须有值,不能后赋值(修改),经常用于定义配置文件。例如:node引用的包,可以使用const