- ECMAScript 和 JavaScript 的关系
1996 年 11 月,JavaScript 的创造者 Netscape 公司,决定将 JavaScript 提交给标准化组织 ECMA,希望这种语言能够成为国际标准。次年,ECMA 发布 262 号标准文件(ECMA-262)的第一版,规定了浏览器脚本语言的标准,并将这种语言称为 ECMAScript,这个版本就是 1.0 版。
该标准从一开始就是针对 JavaScript 语言制定的,但是之所以不叫 JavaScript,有两个原因。一是商标,Java 是 Sun 公司的商标,根据授权协议,只有 Netscape 公司可以合法地使用 JavaScript 这个名字,且 JavaScript 本身也已经被 Netscape 公司注册为商标。二是想体现这门语言的制定者是 ECMA,不是 Netscape,这样有利于保证这门语言的开放性和中立性。
因此,ECMAScript 和 JavaScript 的关系是,前者是后者的规格,后者是前者的一种实现(另外的 ECMAScript 方言还有 Jscript 和 ActionScript)。日常场合,这两个词是可以互换的。 - 运行环境
Node是JS服务器的运行环境 - Babel转码器
Babel 是一个广泛使用的 ES6 转码器,可以将 ES6 代码转为 ES5 代码,从而在现有环境执行。这意味着,你可以用 ES6 的方式编写程序,又不用担心现有环境是否支持。下面是一个例子。 - Let命令
ES6 新增了let命令,用来声明变量。它的用法类似于var,但是所声明的变量,只在let命令所在的代码块内有效。
let不允许在相同作用域内,重复声明同一个变量。
function test() {
//情况1 报错
var a = 3;
let a = 2;
//情况2 报错
let a = 1;
let a =0;
}
不能在函数内部重新声明参数。
function smcs(){
let a = 0;//错误
}
function smcs2(){
{
let a = 0;//正确
}
}
ES5 只有全局作用域和函数作用域,没有块级作用域。会出现内层变量可能会覆盖外层变量和用来计数的循环变量泄露为全局变量的情况。ES6 允许块级作用域的任意嵌套,外层作用域无法读取内层作用域的变量,内层作用域可以定义外层作用域的同名变量。
-
const
const声明一个只读的常量。一旦声明,常量的值就不能改变。(不是变量的值不得改动,而是变量指向的那个内存地址所保存的数据不得改动)
注意:a.一旦声明变量,就必须立即初始化,不能留到以后赋值。
b.只在声明所在的块级作用域内有效。
c.const命令声明的常量也是不提升,同样存在暂时性死区,只能在声明的位置后面使用。
d.不可重复声明同一个常亮。 -
顶层对象属性
ES5 之中,顶层对象的属性与全局变量是等价的。ES6 为了改变这一点,一方面规定,为了保持兼容性,var命令和function命令声明的全局变量,依旧是顶层对象的属性;另一方面规定,let命令、const命令、class命令声明的全局变量,不属于顶层对象的属性。