博客
zyzcos.gitee.io
第三章:语言基础
3.1 语法
ECMAScript语法很大程度上借鉴了C以及其他类C语言
3.1.1 区分大小写
ECMAScript严格区分大小写
3.1.2 标识符
什么是标识符?
标识符:变量、 函数、 属性或函数参数的名称,可以由一个或多个
下列字符组成:
- 第一个必须是字母、下划线或美元符号
- 剩下其他字符可以是字母、下划线、美元符号或数字
注意:关键字、保留字、true、false、null不能作为标识符
3.1.3 注释
- // 单行注释
- /* 多行注释 */
3.1.4 严格模式
什么是严格模式?
严格模式:一种不同的JavaScrtip
解析和执行模型。对不安全的活动将抛出错误
。
如何使用严格模式?
在脚本开头加上:"use strict"
,表示至此之下的所有代码遵循严格模式,也可以用于块级代码
中
注意事项:
一般在很多框架中都不推荐使用严格模式,因为会损耗性能
。
3.1.5 语句
ECMAScript中的语句以分号结尾。 省略分号意味着由解析器确定语句在哪里结尾:
let sum = a + b // 没有分号也有效, 但不推荐
let diff = a - b; // 加分号有效, 推荐
3.2 关键字与保留字
ECMA-262描述了一组保留的关键字, 这些关键字有特殊用途.
ECMA-262第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
未来的保留字
,保留字就是未来将会作为关键字
,目前先保留,不予以使用:
以下是ECMA-262第6版为将来保留的所有词汇。
始终保留:
enum
严格模式下保留:
implements package public
interface protected static
let private
模块代码中保留:
await
3.3 变量
ECMAScript中的变量与其他语言的变量有什么不同?
ECMAScript中的变量是松散类型的
,即:变量可以保存任何类型的数据
【可以理解为:变量就是一个命名占位符
】
有哪些声明变量的方法?
3.3.1 var
使用方法
var message = 'hello world';
有什么特点?
-
具有声明作用域:
使用var
声明变量,会存在于包含它的函数的局部作用域。function sayHi(){ var message = 'hi'; // 局部变量 } console.log(message); //出错
function sayHello(){ message = 'hello'; // 全局变量 } console.log(message); // "Hello"
注意:尽量不要使用全局变量,因为不好维护!
-
声明提升:
使用var
声明变量,变量的声明
会自动提升
到该作用域的顶部
function show(){ console.log(message); var message = 'hi'; } show(); // 输出undefined
// 其实是这样的: function show(){ var message; // 这就是变量提升(hoist) console.log(message); message = 'hi'; } show(); // 输出undefined
3.3.2 let
使用方法与
var
相似
有什么特点?
-
let
声明的范围是块级作用域
,var
声明的范围是函数作用域
:if(true){ var name = 'zyzc'; console.log(name); // zyzc } console.log(name); // zyzc if(true){ let message = 'hi'; console.log(message); // hi } console.log(message); // 抛出异常:message未定义
-
不允许出现冗余【var可以】:
var name; var name; //不会报错 let age; let age; // 抛出异常,age已经声明了。
-
暂时性死区:
let与var的另一个重要的区别, 就是let声明的变量不会在作用域中被提升。// name会被提升 console.log(name); // undefined var name = 'Matt'; // age不会被提升 console.log(age); // ReferenceError: age没有定义 let age = 26;
在let声明之前的执行瞬间被称为
“暂时性死区”(temporal dead zone)
,在此阶段引用任何后面才声明的变量都会抛出ReferenceError
。 -
全局声明:
与var关键字不同, 使用let在全局作用域中声明的变量不会成为window对象的属性【var
声明的变量则会】var name = 'Matt'; console.log(window.name); // 'Matt' let age = 26; console.log(window.age); // undefined
-
在
for
中使用let
声明:
使用let
声明循环变量,不会渗透到循环以外
。for(var j=0 ; j<5 ; j++){ setTimeout(() => console.log(j),0); } // 输出 5 5 5 5 5 for(let i=0 ; i<5 ; i++){ setTimeout(() => console.log(i),0); } // 输出 0 1 2 3 4
3.3.3 const
使用方法与
let
相似
const
的行为与let
基本相似,区别在于const
声明的时候必须初始化变量
,且后续不可修改
。
3.3.4 注意
- 不推荐使用var
- const优先、let次之。
3.4 数据类型
有哪些数据类型?
- 6种简单数据类型(原始类型):Undefined、Null、Boolean、Number、String、Symbol
- 1种复杂数据类型:Object【无序名值对的集合】
3.4.1 typeof 操作符
有什么作用?
用来确定
任意变量的数据类型
:
如何使用?
console.log(typeof name);
操作符会返回下列字符串之一:
- ni"undefined"表示值未定义;
- "boolean"表示值为布尔值;
- "string"表示值为字符串;
- "number"表示值为数值;
- "object"表示值为对象(而不是函数) 或null;
- "function"表示值为函数;
- "symbol"表示值为符号。
注意:null是一个指向空对象的引用。
3.4.2 Undefined类型
Undefined类型只有一个特殊值
undefined
。当var、let声明未赋值的时候,就会自动赋值undefined
注意:
- 未定义与undefined的区别
let message; console.log(message); // undefined console.log(name); // 报错
- 关于某些操作的问题
let message; console.log(typeof message); // undefined console.log(typeof name); // undefined
综上可看出,某些操作【typeof delete】会
混淆
,不