壹——语法
1、区分大小写
在ECMAScript中,所有的东西都是要区分大小写的。无论是变量名,常量名还是操作符,函数名。比如变量PersonNum和变量personNum是不一样的。
2、标识符
标识符,就是变量、函数、属性和函数参数的名称。
标识符必须以字母、下划线、$开头;剩下的可以是字母、数字、下划线和$。
按照惯例, ECMAScript 标识符使用驼峰大小写形式,即第一个单词的首字母小写,后面每个单词的首字母大写。(一点也不强制哦~)
注意:关键字、保留字、 true、 false 和 null 不能作为标识符。
3、注释
// 单行注释
/*
这是多行注释
这是多行注释
*/
4、严格模式
ECMAScript 5 新增了严格模式,字面意思就是严格按照规范写法进行检查。如果编写的代码不符合规范,将会抛出异常。
要对整个脚本启用严格模式,在脚本开头加上这一行:"use strict"; 它是一个预处理指令,任何支持JavaScript的引擎都会切换到严格模式。
严格模式还可以单独的放到某个函数中,只需要把 "use strict" 放到函数体的开始位置就可以了。
function
strictDemo
(){
"use strict";
//函数处理的内容
}
所有现代浏览器都支持严格模式。
(本人做毕设的时候深受其害,还有编辑器的自动格式化)
5、语句
ECMAScript 中的语句以分号结尾。 如果你的程序没有分号,编译器会自动解析在哪断句(编译器:解析错了可别怪我)。
let
snake
=
"head"
+
"body"
+
"tail"
//没有分号仍然有效,但是不建议这么做
let
sum
=
a
+
b
;
//有分号,在此处结尾
加分号,好处多多,可以避免缺少分号带来的问题,同时可以使开发者删除空行,减小代码体积,还能减少解析器的工作量。
6、关键字
关键字不能作为自定义函数名、变量名等等。都是有特殊用途的一串。
break | do | in | typeof |
case | else | instanceof | var |
catch | export | new | void |
class | extends | return | while |
const | finally | super | with |
continue | for | switch | yield |
debugger | function | this | default |
if | throw | delete | import |
try |
未来的保留字,留作将来做关键字用的。
始终保留:enum
严格模式下保留:implements package publicinterface protected staticlet private
模块代码中保留:await
贰——变量
ECMAScript中有三个关键字可以声明变量:var、const和let。其中,var在ECMAScript的任何版本都可以用,const和let只能在ECMAScript 6及以后的版本中使用。
1、var关键字
varmessage1; //定义一个变量,名字为message
varmessage2='hi'; //定义一个变量message并赋值为'hi'
message2=1000; //合法,有效,但不推荐
上述代码中的第一行定义了一个名为 message1 的变量,可以用它保存任何类型的值。在未初始化的情况下,变量会保存一个特殊值undefined。
第二行定义了一个名为message2的变量,并保存字符串值 hi ,像这样初始化变量不会将它标识为字符串类型,只是一个简单的赋值而已。随后,不仅可以改变保存的值,也可以改变值的类型。
使用 var 操作符定义的变量会成为包含它的函数的局部变量。比如在一个函数内部使用var定义一个变量,那么在函数执行完毕后,退出函数时会销毁。
function
demo
(){
var
test1
=
'test'
;
console.log(test1);
}
demo
();
//会打印字符串'test'
console
.
log
(
test1
);
//会报错
function
demo2
(){
userName='zhangsan';
console.log(userName);
}
demo2
();
//输出字符串 'zhangsan'
console
.
log
(
userName
);
//输出字符串 'zhangsan'
但是如果在函数内定义变量时,省略var关键字,则userName变量会变成全局变量(只需要调用一次demo2()函数)。
注意:虽然可以在函数内通过省略var关键字定义全局变量,但是并不推荐这么做,主要是有时候不好找,也想不到它是一个全局变量,容易搞混。
连续定义多个变量的时候,只需要用逗号(英文状态下)分隔开就行。
varmessage='hi',userName='zhangsan',age=18;
2、let 声明
let 跟 var 的作用差不多,但有着非常重要的区别。最明显的区别是, let 声明的范围是块作用域,而 var 声明的范围是函数作用域。
块级作用域:即在{}花括号内的域,由{ }包括,比如if{}块、for(){}块;
函数作用域:变量在声明它们的函数体以及这个函数体嵌套的任意函数体都是有定义的;
if
(
true
) {
letage=26;
letage ; //报错,因为age已经声明过了,同一个块内不能重复声明
console.log(age); // 26
}
console
.
log
(
age
);
// age 没有定义,因为已经超出if块了
//同
一个块中没有重复声明,所以不会报错
let
age
=
30
;
console
.
log
(
age
);
// 30
if
(
true
) {
letage=26;
console.log(age); // 26
}
let
userName
;
var
userName
;
//报错,因为let 和var定义的是同种类型的变量,只是标明的作用域不同。
let 和 var还有一个区别是,let定义的变量,在声明之前不能使用,否则会报错。var定义的变量有声明提升,在定义之前就可以使用。在使用 var 声明变量时,由于声明会被提升, JavaScript 引擎会自动将多余的声明在作用域顶部合并为一个声明。因为 let 的作用域是块,所以不可能检查前面是否已经使用 let 声明过同名变量,同时也就不可能在没有声明的情况下声明它。
使用 let 在全局作用域中声明的变量不会成为 window 对象的属性( var 声明的变量则会)。
还有一点是,在使用for循环时两者有区别。
for
(
var
i
=
1
;
i
<=
5
;
i
++
){
//循环体
}
console
.
log
(
i
);
// i==5
for
(
let
i
=
1
;
i
<=
5
;
i
++
){
//循环体
}
console
.
log
(
i
);
//报错,i未定义
3、const声明
const 的行为与 let 基本相同,唯一一个重要的区别是用它声明变量时必须同时初始化变量,且尝试修改 const 声明的变量会导致运行时错误 。
const
age
=
24
;
age
=
22
;
//报错,给常量赋值
const
userName
=
'zhangsan'
;
const
userName
=
'lisi'
;
//报错,不能重复声明
//const 也是块级作用域
const
sex
=
'man'
;
if
(
taiguo
==
true
){
const
sex
=
'women'
;
}
console
.
log
(
sex
);
// 输出为 'man'
如果const声明的是一个对象,那么修改这个对象内部的属性并不报错。
const
person
=
{
}
person
.
name
=
'zhangsan'
;
//不会报错
for
(
const
i
=
0
;
i
<
5
;
i
++
)
//报错,不能给常量赋值
4、总结
1、不使用var,或者少使用var。
2、const优先,let次之。