ES6のletconstコマンドの詳細な説明と違い
1つ。letコマンド
- letコマンドは変数を宣言するために使用され、その使用法はvarと似ていますが、宣言された変数はletコマンドが配置されているコードブロックでのみ有効です。
{
let a = 1;
var b = 0
}
console.log(a); //因为在a所在的块级作用域之外访问,所以会抛出错误
- letの変数プロモーション、およびvarの変数プロモーションはありません。
console.log(temp); //undefined
var temp = 10;//var存在变量提升,所以不会抛出错误
console.log(temp1); //Error,因为let不存在变量提升,所以要先定义,再使用
let temp1 = 10;
- Temporary Dead Zone(TDZ):ブロックレベルのスコープにletコマンドがある限り、それが宣言する変数はこの領域に「バインド」され、外部の影響を受けなくなります。つまり、コードブロック内、let宣言を使用する変数の前では、変数は使用できません
var temp2 = 123;
if (true) {
temp2 = 'abc';
let temp2;
}
console.log(temp2);//因为在声明temp2之前就使用了temp2,根据let的暂时性死区,会抛出错误
一時的なデッドゾーンは、typeofが100%安全な操作ではなくなったことも意味します
typeof(x); //Error
let x;//因为暂时性死区而没有检测到x的值,所以会抛出错误
比較として、変数が宣言されていない場合、typeofを使用してもエラーは発生しませんが、undefinedが返されるため、letがなくなる前に、typeofを使用してもエラーはまったく発生しません。
console.log(typeof(y)); //undefined
- 同じスコープ内の同じ変数の複数の宣言を許可しない
function fn1() {
let a = 10;
var a = 11;
}
fn1();//Error
function fn2(){
let a=10;
let a=11;
}
fn2();//Error
2.constコマンド
- constは読み取り専用変数を宣言します。一度宣言すると、定数の値は変更できません。
const PI = 3.14;
console.log(PI);
PI = 3.1415926;//Error,因为已经给PI赋值成3.14,所以不允许再对PI进行改动
これは、constが定数として宣言されると、すぐに初期化する必要があり、後で割り当てるために残すことができないことも意味します。つまり、定数を割り当てずに宣言するだけでエラーが発生します。
const foo;//Error,因为没有给foo赋值
- constのスコープはletと同じであり、宣言が配置されているブロックレベルのスコープ(constとletの同じポイント)でのみ有効です。
if (true) {
const MAX = 99;
}
console.log(MAX);//Error,在块级作用域之外访问MAX会抛出错误
- constによって宣言された変数はプロモートされません。宣言後にのみ使用できる一時的なデッドゾーンもあります(constおよびletと同じポイント)。
上記のletコードを参照してください。 - constはletと同じであり、繰り返し宣言することはできません(constとletの間の同じポイント)
上記のletコードを参照してください - constが実際に保証するのは、変数の値を変更できないということではなく、変数が指すメモリアドレスを変更できないということです。単純なタイプのデータ(数値、文字列、ブール値)の場合、値はに格納されます。変数が指すメモリアドレスしたがって、定数と同等ですが、複合データタイプ(オブジェクト、配列)の場合、変数が指すメモリアドレスはポインタのみです。constは、ポインタが固定されていることのみを保証できます。それが指すデータ構造が可能かどうかについてはこれは完全に制御できないので、配列またはオブジェクトを定数として宣言するときは注意してください
const obj = {};
obj.name = 'jisoo';
obj.age = 25;
console.log(obj);//上述代码都没有问题,可以给对象进行属性的添加操作
obj={};//Error,因为不能将obj指向另外一个对象
const arr = [];
arr.push('blackpink'); //blackpink
console.log(arr.length); //1上述代码都没有问题,因为数组是可读写的,可以添加新的元素给数组
// arr = ['jisoo'];//Error,因为不能将此数组赋值给另外一个数组