ECMAScript语法:
-
区分大小写
- 一切都区分大小写。无论是变量、函数名还是操作符都区分大小写
-
标识符(变量、函数、属性或函数参数的名称)
- 第一个字符必须是一个字母、下划线或美元符号$
- 剩下的其他字符可以是字母、下划线、美元符号或数字
- 标识符使用驼峰大小写形式,例如myCar
- 注意关键词不能作为标识符(如true、null等)
-
注释
- 单行注释
- 多行注释
-
严格模式
- 严格模式下,一些不规范的写法会被处理,抛出错误。
- 启用严格模式,需加上"use strict"(预处理指令)
-
语句
- 语句以分号结尾(没有分号也有效,但不推荐)
- 多行语句可以用{ }包裹起来,以{开始,以}结束(代码块)
if (test) {
test = fasle;
console.log(test);
}
- 关键字和保留字
- 变量
- ECMAScript变量是松散类型,可以用于保存任何类型数据(此处可去了解typeScript)
- 声明变量有三个关键词:var let const(后两者只有在ECMAScript6以后版本使用)
- var声明作用域
使用var操作符定义的变量会成为包含它的函数的局部变量,在函数退出时销毁
function test() {
var a = 'hello world'
}
test()
console.log(a) // 出错
// 省略var操作符定义全局变量 不推荐 局部作用域内定义全局变量很难维护
function test1() {
b = 'hello world 1'
}
test()
console.log(b) // 'hello world 1'
-
var声明提升
var声明的变量会自动提升到函数作用域的顶部
例如上面代码不会报错,是因为var声明会被提升到函数作用域顶部,ECMAScript运行时把它看以下代码
不用var时
-
let声明
- let声明跟var差不多,最明显的区别是let声明范围是块作用域,var是函数作用域
- let声明跟var差不多,最明显的区别是let声明范围是块作用域,var是函数作用域
-
块作用域是函数作用域的子集,所限制var的也适用于let
-
let不能重复声明
-
let和var还有一个重要的区别,let声明在作用域中不会被提升。
-
全局声明
与var关键词不同,使用let在全局作用域中声明的变量不会成为window对象的属性(var会)
-
条件声明
let声明全局变量的时候,不确定同页面其他脚本有没有声明了同名变量,可用以下方式声明,可避免因重复声明而抛出错误。
-
for循环中的let声明
let出现之前,使用var声明,会渗透到循环体的外部
-
const声明
const和let基本相同,唯一一个重要区别是用const声明变量时必须同时初始化变量,且不能修改变量。(const声明的限制只适用于它指向的变量的引用) -
声明风格及最佳实践
- 尽量不使用var(行为怪异的var所造成的各种问题,已经让JavaScript社区为之苦恼了很多年)
- const优先,let次之
-
数据类型
- ECMAScript有6种简单数据类型(也称原始类型):Undefined、Null、Boolean、Number、String、Symbol。(Symbol是ECMAScript6新增的)
- 还有一种复杂数据类型叫Object(对象)【小菜叽发出疑惑:啊咧咧,奇怪,为 什么没有Array数组】
- typeof操作符(用于确定任意变量的数据类型)
-
Undefined类型(只有一个值,就是特殊值undefined),声明了变量未初始化就相当于给变量赋予了undefined值
-
Null类型,null值表示一个空对象指针(typeof null返回object,就是因为特殊值null被认为是一个对空对象的引用)
-
Boolean类型
-
Number类型
- 特殊数值NaN,意思是“不是数值”(No A Number)
- isNaN()函数 该函数接收一个参数 可判断该参数是否数值或是否能转换成数值
-
数值转换
-
有三个函数可将非数值转换为数值:Number()、parseInt()、parseFloat()
-
Number()函数转换字符串相对复杂且有点反常规,所以用parseInt()取整数,parseFloat()转换取小数。
-
String类型 字符串可以使用双引号(")、单引号(’)或反引号(`)标示
- 字符字面量:字符串数据类型包含一些字符字面量(用于表示非打印字符或其他用途的字符)
- 转义字符表示一个字符,所以只算一个字符,字符串中有双字节字符,那么返回的length可能不准确
- 字符串的特点 一旦创建 值就不能变了 要修改变量中某个字符串值,必须要先销毁原始字符串,再将新修改的字符串赋值给该变量(拼接字符串会比较慢的原因)
- 可用toString()将其他类型值转为字符串。
- 模板字面量
ECMAScript6新增使用模板字面量定义字符串的能力。
`用来定义HTML模板特别好用
-
字符串插值 `常量${变量}`
所有插入的值都会使用toString()强制转型为字符串 -
模板字面量也支持定义标签函数,这个感兴趣可以搜一下看
-
Symbol类型
ECMAScript6新增类型。符号是原始值,且符号实例唯一、不可变的,用于确保对象属性使用唯一标识符,不会发生属性冲突
let genericSymbol = Symbol();
let otherGenericSymbol = Symbol();
let fooSymbol = Symbol('foo');
let otherFooSymbol = Symbol('foo');
console.log(genericSymbol == otherGenericSymbol); // false
console.log(fooSymbol == otherFooSymbol); // false
Symbol()函数不能与new关键词一起构造函数使用,避免创建符号包装对象。
Symbol还有很多深入的学习点,比如Symbol.asyncIterator等等,目前没想到使用场景,难理解一点,耗时多,暂放后面一点深入学习。(目前水平难以支撑 呜呜)
- Symbol.match用法 匹配字符串中是否含有某子串
- Symbol.replace用法 替换字符串中的子串
效果一样 有个小疑惑 为什么不直接用第二句 - 更多内容:Symbol.search 、Symbol.species 、Symbol.split 、Symbol.toPrimitive 、 Symbol.toStringTag 、 Symbol.unscopables(这个不推荐使用)
- Object类型
以前不太清楚toLocaleString()和toString()的区别,现在总算懂了一些
1、超过4位数字时toLocaleString()会增加逗号间隔,适合金额之类的数值
2、对时间的表示
对了别忘记了valueOf()
valueOf()对时间的处理等同于时间的getTime()
-
操作符
-
一元操作符(只操作一个值)
递增/递减操作符
++a (或a++)等价于 a = a + 1
–a (或a–)等价于 a = a - 1
(前缀优先级高,如–a + 2语句会先处理完–a再进行+2,而a-- + 2 会先处理a+2) -
一元加和减
-
位操作符(操作内存中表示数据的比特(位))
由于位操作是在数值的底层表示上完成的,所以速度快得多,有按位 非、按位与、按位或、按位异或、左移、有符号右移、无符号右移等。 -
布尔操作符
1、逻辑非(!)
先将操作数转换成布尔值,再取反。
2、逻辑与(&&)
3、逻辑或(||) -
乘法操作符(*)
-
除法操作符(/)
-
取余操作符(%)
-
指数操作符(**)(es7新增 等价于 Math.pow())
-
加法操作符(+)不仅仅能处理数值的加,也可用于字符串拼接。
-
关系操作符(< 、>、<=、>=)
-
相等操作符
- == 等于 (强类型转换后对比)
- !== 不等于 (强类型转换后对比)
- === 全等 (不转换直接对比)
- !== 不全等 (不转换直接对比)
推荐使用全等和不全等
-
条件操作符(?)
let value = 1 > 2 ? true : false // false 三目运算
- 赋值操作符(=)
- 逗号操作符(,)声明多个变量
-
-
if语句
if(条件){符合条件}else{不符合条件} -
do-while语句
do{循环体}while(退出循环条件) -
while语句
while(满足循环条件){循环体} -
for语句
for(let i = 0; i < 10; i++) {循环体} -
for-in语句(适用于对象)
for(const a in b){枚举b所有的属性}
-
for-of语句(适合用于取值)
for(const a of b) {枚举b所有的属性}
区别:
-
ES2018还增加了for-await-of语句
-
break和continue语句
-
with语句(不推荐使用,严格模式下该语句会抛出错误)
针对一个对象反复操作,可缩减代码量
-
switch语句(如果表达式等于后面的值,则执行下面的语句)
switch(判断的值){
case 值1:
break;
case 值2:
break;
default: 默认走
break
} -
函数
function关键词声明
function aFun(参数) {执行语句} 那么aFun就是一个方法 通过函数名来调用方法 -
小结
- ECMAScript中的基本数据类型包括Undefined、Null、Boolean、Number、String和Symbol。