ホームページ  >  記事  >  バックエンド開発  >  JavaScriptのvarとlet/constの違いは何ですか?

JavaScriptのvarとlet/constの違いは何ですか?

青灯夜游
青灯夜游転載
2019-01-04 18:02:093771ブラウズ

JavaScript の var と let/const の違いは何ですか?この記事では、var と let/const の違いを誰もが理解できるように、var と let/const について紹介します。一定の参考値があり、困っている友人は参考にしてください。お役に立てれば幸いです。 [推奨コース: JavaScript ビデオ チュートリアル ]

JavaScriptのvarとlet/constの違いは何ですか?

#letconst は ES6 の新しいコマンドで、変数を宣言するために使用されます。これら 2 つのコマンドは ES5 の var とは大きく異なり、letconst もあります。いくつかの微妙な違いがあります。以下で詳しく見てみましょう。

内容:

var および let/const違い

  1. ブロックレベルのスコープ

  2. 変数のプロモーションはありません

  3. 一時的なデッドゾーン

  4. 繰り返し不可能な宣言

  5. let および const によって宣言されたグローバル変数は、最上位オブジェクトの下にハングされません。

constコマンドについて注意すべき 2 つの点:

  1. const には、宣言直後の値、そうでない場合はエラーが報告されます

  2. const 単純型は一度宣言すると変更できません。複合型のポインタが指すアドレス (配列、オブジェクトなど) は変更できませんが、内部データは変更できます。

なぜブロックレベルのスコープが必要なのでしょうか?

ES5 にはグローバル スコープと関数スコープのみがあり、ブロックレベルのスコープはありません。

これは多くの不合理なシナリオをもたらします:

  1. 内部変数が外部変数を上書きする可能性がある

  2. カウントに使用されるループ変数がリークされるグローバル変数として

#
var tmp = new Date();
function f() {
  console.log(tmp); // 想打印外层的时间作用域
  if (false) {
    var tmp = 'hello world'; // 这里声明的作用域为整个函数
  }
}
f(); // undefined

var s = 'hello';
for (var i = 0; i < s.length; i++) {
  console.log(s[i]); // i应该为此次for循环使用的变量
}
console.log(i); // 5 全局范围都可以读到

ブロックレベルのスコープ

  1. スコープ

function f1() {
  let n = 5;
  if (true) {
    let n = 10;
    console.log(n); // 10 内层的n
  }
  console.log(n); // 5 当前层的n
}
  1. ブロックレベルのスコープは任意にネストされています

{{{{
  {let insane = &#39;Hello World&#39;}
  console.log(insane); // 报错 读不到子作用域的变量
}}}};
  1. ブロックレベルのスコープは true コードを分割します

  2. #
    {
    let a = ...;
    ...
    }
    {
    let a = ...;
    ...
    }
上記のフォームを使用すると、重複する変数名や外部干渉を気にせずにいくつかのアイデアをテストできます

#ブロック レベル スコープでの関数の宣言:

ブロック レベル スコープで関数を宣言すると、ブラウザーが古いコードと互換性を持つ必要があるため、いくつかの問題が発生します。

関数はブロック レベルのスコープで、できれば匿名関数の形式で宣言します

if(true){
  let a = function () {}; // 作用域为块级 令声明的函数作用域范围更清晰
}
ES6 のブロック レベルのスコープでは、関数を宣言するためのルールが許可されています。これは中括弧が使用されている場合にのみ当てはまります。中括弧が使用されていない場合は、エラー

が報告されます。

// 报错
&#39;use strict&#39;;
if (true)
  function f() {} // 我们需要给if加个{}

変数昇格はありません

変数昇格現象

: 同じスコープ内で、変数 宣言前に使用可能 値が未定義#ES5の場合はvar

を使用して変数を宣言 変数の昇格が頻繁に発生します。

// var 的情况
console.log(foo); // 输出undefined
var foo = 2;

// let 的情况
console.log(bar); // 报错ReferenceError
let bar = 2;

一時的なデッド ゾーン:

現在のスコープに入るとすぐに、使用したい変数はすでに存在しますが、 変数を宣言するコード行が表示されるまでのみ、変数を取得して使用できます

var tmp = 123; // 声明
if (true) {
  tmp = &#39;abc&#39;; // 报错 因为本区域有tmp声明变量
  let tmp; // 绑定if这个块级的作用域 不能出现tmp变量
}
一時的なデッド ゾーンと変数をプロモートできないことの重要性は次のとおりです。

実行時エラーを減らすために、変数が宣言される前に使用されないようにします。これにより、予期しない動作が発生する可能性があります。

変数の繰り返しの宣言は許可されていません

この状況はテスト中に発生します:var a= '宣言'; const a = 「エラーなし」

、この状況は、Babel が変換中に何らかの処理を実行し、ブラウザー コンソールでテストし、エラーを正常に報告したためです
let
,

const同じスコープ内で同じ変数を繰り返し宣言することはできません

function func(arg) {
  let arg; // 报错
}

function func(arg) {
  {
    let arg; // 不报错
  }
}

let と const によって宣言されたグローバル変数は、最上位オブジェクトの下にハングされません

ブラウザ環境のトップレベル オブジェクトは次のとおりです:
    window
  1. ##トップレベル オブジェクトノード環境の構成は次のとおりです:

    global
  2. #var で宣言されたグローバル変数は最上位オブジェクトの下にハングされますが、let と const はトップレベル オブジェクトの下にハングされません。最上位のオブジェクト。たとえば、次のようなチェストナット

  3. var a = 1;
    // 如果在 Node环境,可以写成 global.a
    // 或者采用通用方法,写成 this.a
    window.a // 1
    
    let b = 1;
    window.b // undefined

  4. const コマンド

宣言されると、 、すぐに値を割り当てる必要があります
  1. let p; var p1; // 不报错
    const p3 = &#39;马上赋值&#39;
    const p3; // 报错 没有赋值

    const 宣言された値は変更できません
  2. 単純型: 変更できません

    const p = &#39;不能改变&#39;;
    p = &#39;报错&#39;
    複合型: 変数ポインタは変更できません

    次の状況を考慮してください:

    const p = [&#39;不能改动&#39;]
    const p2 = {
      name: &#39;OBKoro1&#39;
    }
    p[0] = &#39;不报错&#39;
    p2.name = &#39;不报错&#39;
    p = [&#39;报错&#39;]
    p2 = {
      name: &#39;报错&#39;
    }

    const所说的一旦声明值就不能改变,实际上指的是:变量指向的那个内存地址所保存的数据不得改动

    • 简单类型(number、string、boolean):内存地址就是值,即常量(一变就报错).

    • 复杂类型(对象、数组等):地址保存的是一个指针,const只能保证指针是固定的(总是指向同一个地址),它内部的值是可以改变的(不要以为const就安全了!)

      所以只要不重新赋值整个数组/对象, 因为保存的是一个指针,所以对数组使用的pushshiftsplice等方法也是允许的,你就是把值一个一个全都删光了都不会报错。

> 复杂类型还有函数,正则等,这点也要注意一下。

总结:

再总结一下,看到这些名词,脑子里应该会有对应的理解,如果没有的话,那可以再看看对应的内容。

var和let/const的区别:

  1. 块级作用域

  2. 不存在变量提升

  3. 暂时性死区

  4. 不可重复声明

  5. let、const声明的全局变量不会挂在顶层对象下面

const命令两个注意点:

  1. let可以先声明稍后再赋值,而const在 声明之后必须马上赋值,否则会报错

  2. const 简单类型一旦声明就不能再更改,复杂类型(数组、对象等)指针指向的地址不能更改,内部数据可以更改。

let、const使用场景:

  1. let使用场景:变量,用以替代var。

  2. const使用场景:常量、声明匿名函数、箭头函数的时候。

以上就是本篇文章的全部内容,希望能对大家的学习有所帮助。更多精彩内容大家可以关注php中文网相关教程栏目!!!

以上がJavaScriptのvarとlet/constの違いは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はsegmentfault.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。