3.语言基础 - 1

101 阅读4分钟

语法

区分大小写

无论是变量名,函数名还是操作符,都是区分大小写的

标识符

所谓标识符,就是变量、函数、属性或者函数参数的名称。标识符可以由一个或者多个下列的字符组成

  • 第一个字符必须是一个字母,下划线(_)或者美元符号($)
  • 剩下的字符可以是数字,字母,下划线,或者美元符号

注释

// 我是单行注释

/*
  我是多行注释
  我是多行注释
  我是多行注释
*/

语句

ECMAScript中的语句以分号结尾,省略分号意味着由解析器来决定语句在哪里结尾

即使语句末尾不加分号也是可以的,但是也应该记得加上

加分号有助于避免省略造成的问题,避免输入的内容不全、

此外,加分号也方便开发者删除空行来压缩代码

加分号也有助于在某些情况下的性能提升, 因为解析器会尝试在合适的位置补上分号以纠正错误语法

变量

有三个关键字可以声明变量:var, let, const, 其中var可以在 ECMAScript 的任何版本去使用,而 constlet 只有在 ECMAScript6 以及更高的版本去使用

var

声明函数作用域

使用var操作符定义的变量会成为包含他的函数的局部变量

 function test() {
      var message = 'hi'; // 局部变量
 }
 test();
 console.log(message) // 出错

声明提升

使用这个关键字声明的变量会自动提升到函数作用域的顶部

function test() {
      console.log(message) // undefined
      var message = 'hi';
      console.log(message) // hi
}
test();

上述的代码相当于

    function test() {
      var message;
      console.log(message) // undefined
      message = 'hi';
      console.log(message) // hi
    }
    test();

let

letvar 用法差不多,但有着非常重要的区别,最明显的区别是,let声明的是块作用域,而var声明的是函数作用域

暂时性死区

let声明的变量不会再作用域中被提升

    function test() {
      console.log(age); // Cannot access 'age' before initialization
      let age = 18;
    }
    test();

全局声明

let在全局声明的变量不会称为window对象的属性,而var会

    var message = 'hi';
    let age = 18;
    console.log(window.message); // hi
    console.log(window.age); // undefined

条件声明

在使用var声明变量的时候,由于var有变量提升,js引擎会将所有的var的声明在作用域的顶部合并称为一个声明

因为let是块级作用域,没有提升,所以不可能检查前面是否已经使用let声明了同名变量,在遇到的时候只能报错

for循环中的let

在let出现之前,for循环定义的迭代变量会渗透到循环体外部

    for (var i = 0; i < 5; i++) {
      setTimeout(() => console.log(i)) //  5 5 5 5 5
    }

正如上面所看,之所以会这样,是因为在退出循环的时候迭代变量保存的是内存的最新值,最新值i已经被改为5,所以输出5个5

    for (let i = 0; i < 5; i++) {
      setTimeout(() => console.log(i)) //  0 1 2 3 4
    }

因为let有块级作用域,所以每次执行log的时候,在每一个for循环的块级内部会保存一个当时循环的值

const

const的行为与let基本相同,唯一一个重要的区别是用它声明的变量时必须同时初始化变量,尝试修改会导致错误

const 声明的限制适用于他的变量的引用,例如如果const声明的是一个对象,则我们可以修改对象内部的属性

    obj.a = 2; // 不会报错
    const a = 1;
    a = 2; // Assignment to constant variable.

声明风格以及最佳实践

es6增加了let和const已经从客观上为这门语言更精准的声明了作用域和语义提供了更好的支持

  1. 不使用var

限制自己使用let和const,有助于提高代码质量,因为变量有了明确的作用域,声明位置,以及不变的值

  1. const有限,let其次

const可以强制浏览器运行时保持变量不变,也可以让静态代码分析工具提前发心不合法的赋值操作。因此,很多开发者认为应该优先使用const来声明变量,只有在未来知道变量要改变时,才会使用let,这样可以让开发者更有信心的推断某些变量的值永远不会变,同时也能尽快发现意外赋值导致的非法预期行为