nodejs是javascript的運行環(huán)境,可以使用node來測試。
1.定義(聲明)變量
es5和es6的區(qū)別:
| js版本 | 作用域 |
|---|---|
| es5 | 全局作用域和函數(shù)作用域 |
| es6 | 塊級作用域 |
| 定義(聲明)變量 | 定義的變量是否提升 | 在同一個作用域內(nèi),是否可以重復定義 | 變量定義后,是否可以修改 |
|---|---|---|---|
| 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 ---> 在同一作用域內(nèi),var可以重復定義
var a = 10;
//....
var a = 5;
console.log(a); //5
- es6 ---> 在同一作用域內(nèi),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沒有變量提升,即在代碼塊內(nèi),只要在let定義之前使用變量就會報錯。
- 在同一個作用域內(nèi),不能重復定義變量
- let聲明的變量不能成為window的屬性
- 暫時性死區(qū)
3.const定義常量
const注:const在定義時必須有值,不能后賦值(修改),經(jīng)常用于定義配置文件
const arr = ['apple', 'banner'];
// arr = false;
// console.log(arr) //Uncaught TypeError: Assignment to constant variable.
arr.push("orange"); //const定義的對象可以修改,因為對象是引用類型的。
console.log(arr);
基本類型存儲在棧內(nèi)存中
image
<h6>引用類型同時存儲在堆內(nèi)存和棧內(nèi)存中</h6>
image
例:
image
總結(jié):
- 定義變量使用let,不要使用var
- const在定義時必須有值,不能后賦值(修改),經(jīng)常用于定義配置文件。例如:node引用的包,可以使用const