“这本被称之为前端红宝书的《JavaScript高级程序设计》共865页,一个假期还要忙别的肯定是肝不完,尽量把ECMAScript语法部分学完吧,还好学过C++,与类C语言有很大相似之处,但是与JAVA是没有半毛钱关系,纯纯是网景公司想蹭热度,但是随着前端(你所能看到的界面,不管是手机或者电脑乃至AR,APP微信小程序等等都叫前端)需求的增多也火了起来,甚至Node.js也可以进行后端开发,虽然对考试和考研没有(如果有幸两年后初试过了,最起码复试的时候还可以说我会点前端),但人这辈子每走的一步都算数。”
首先,他的(因为发明者是个男的,赋予其生命)变量、函数名和操作符都是区分大小写的,并且不能和自己的关键字重名。
其次是他的标识符,就是变量、函数、属性或函数参数的名称,可以由一或多个下列字符组成:
第一个字符必须是一个字母、下划线(__)或美元符号($);
其余的字符可以是字母、下划线、美元符号或者数字。
但是ECMAScript的毛病是使用驼峰大小写形式,如:firstSecond,第一个单词首字母小写,第二个开始大写。
然后注释就和C++一样了,
//单行注释/* 多行注释 */
随着ES标准的更新,ES5增加了严格模式的概念(strict mode),ES3的一些不规范的概念在这种模式下会被处理,对于不安全的活动也将抛出错误,要对整个脚本(脚本语言:电脑读一行编译一行的语言)启用严格模式要在脚本开头加上一行:
"use strict";//预处理指令
也可以对指定函数在严格模式下执行,把预处理指令放到函数开头即可:
function doSomething() {"use strict";//函数体}
JS的语句以分号结尾,虽然没有分号也有效,但是加分号的好处很多,不再一一列举因为记不住
。
多条语句则合并到c语言风格的代码块中,以左({)花括号标识开始,右(})花括号标识结束。
再就是js的保留字了(虽然四级考了两次了但是这些单词还是记得的):break、do、in、typeof、case、else巴拉巴拉一大堆,还有未来的保留字,用的时候避开就好,大都不会冲突。
天空一声巨响,大佬闪亮登场——变量
ES的变量是松散型的,意思是变量可以保存任何类型的数据。有三个关键字可以声明变量:var、const和let,var通吃,而const和let只能在ES6以及更晚的版本中使用。
附:桌面端浏览器对ES2015/ES6的支持情况

Chrome:51 版起便可以支持 97% 的 ES6 新特性。
Firefox:53 版起便可以支持 97% 的 ES6 新特性。
Safari:10 版起便可以支持 99% 的 ES6 新特性。
IE:Edge 15可以支持 96% 的 ES6 新特性。Edge 14 可以支持 93% 的 ES6 新特性。(IE7~11 基本不支持 ES6)
我就火狐、微软Edge、谷歌Chrome三款互补使用。
1.var关键字
声明变量
var message;var message = "hi";//声明变量并初始化
声明作用域
function test(){var message = "hi";//局部变量}test();console.log(message);//出错!省略var操作符即为全局变量function test(){message = "hi";//局部变量}test();console.log(message);//"hi"但是不推荐这样,严格模式下会报错定义多个变量:var message = "h1",found = false,age = 29;//可以不缩进和空格,但是有利于阅读
var声明提升(hoist)
function foo() {console.log(age);var age = 26;}foo(); //undefined上面不会报错,是因为ES运行时把他等价于如下代码:function foo() {var age;//所谓的提升就是把所有的变量声明都拉到函数作用域的顶部console.log(age);var age = 26;}foo(); //undefined
2.let 声明
与var最明显的区别是let声明的范围是块作用域,var是函数作用域
if (ture){var name = 'Matt';console.log(name);//Matt}console.log(name); //Matt再看letif (ture){let name = 'Matt';console.log(name);//Matt}console.log(name); //RefrenceError(参考错误):name没有定义
其次就是let不允许一个块作用域中出现冗余声明,但是嵌套使用相同的标识符不会报错:
var name;var name;//允许var name;let name;//报错或let name;var name;//报错或let age;let age;//SyntaxError(语法错误):标识符age已经声明过了允许嵌套:var name = '张祥臻';console.log(name);//'ZXZ'if (ture) {var name = '陈虹';console.log(name);//'陈虹'}var name = '张祥臻';console.log(name);//'ZXZ'if (ture) {let name = '陈虹';console.log(name);//'陈虹'}
let存在暂时性死区,不会被“提升”,必须先声明
与var关键字不同,使用let在全局作用域中声明的变量不会成为window对象的属性(var声明的变量就会)。
var name = 'Matt';console.log(winndow.name);//'Matt'let age = 26;console.log(window.age);//undefined
条件声明
<script>//假设脚本不确定页面中是否已经声明过同名变量//那它可以假设还没有声明过var name = 'Matt';//这里没问题,因为可以被作为一个提升声明来处理//不需要检查之前是否声明过同名变量let age = 36;//如果age之前声明过,这里会报错</script>
for循环中的let声明
//迭代变量:一般就叫循环变量,控制循环的次数。for (var i = 0;i<5;++i){//循环逻辑}console.log(i);//5改用let之后:for (let i = 0;i<5;++i){//循环逻辑}console.log(i);//referenceerror:i没有定义再看for (var i = 0;i<5;++i){setTimeout(() =>console.log(i),0)}//实际输出5、5、5、5、5、5原因:在退出循环时,迭代变量保存的是导致循环退出的值:5。在之后的执行超时逻辑时,所有的i都是同一个变量。而let:for (let i = 0;i<5;++i){setTimeout(() =>console.log(i),0)}//实际输出0、1、2、3、4
3.const声明
const的行为与let基本相同,唯一一个重要的区别是用它声明变量的同时初始化变量,且尝试修改const声明的变量会报错(有点像c++的常变量)
const也不允许重复声明,其作用域也是块
但是如果const变量引用的是一个对象,那么修改这个对象内部的属性并不违反const的限制
不可以用const变量声明迭代变量
声明风格:
不使用var
const优先,let次之




