1.1、语法
JavaScript很大程度上借鉴了C语言和其他类C语言。
- 区分大小写
- 标识符:字母、数字、下划线、美元符号组成,不能以数字开头,不能将关键字、保留字
false、true、null作为标识符 - 注释:单行注释和多行注释
- 严格模式:整个脚本启用:在文件的开头写上:
"use script";,单独指定某个函数:只需将这个预处理器指令加到函数体的开头即可 - 语句以分号结尾(推荐),有助于在某些情况下提升性能
- 代码块
{},多条语句合并在一个代码块里
1.2 关键字和保留字
1.2.1 关键字:
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
1.2.2 保留字:
- 始终保留:
enum - 严格模式下保留:
implements package public interface protected static let private - 模块代码中保留:
await
1.3 变量
JavaScript使用3个关键字定义变量var\let\const
1.3.1 var关键字
-
格式:
var 变量名 -
未初始化时,变量会保存一个特殊值:
undefined -
函数作用域:使用var声明的范围是函数作用域
-
在函数内定义变量时省略
var操作符,可以创建一个全局变量 -
一条语句定义多个变量,用逗号隔开
-
var在全局作用域中声明的变量会成为window对象的属性 -
var声明提升:使用var声明的变量会自动提升到函数作用域顶部(将所有变量声明拉到函数作用域的顶部)function foo(){ console.log(age); var age = 18; } foo(); // undefined 等价于: function foo(){ var age; console.log(age); age = 18; } foo(); // undefined -
反复多次使用var声明同一个变量也没有问题
function foo(){ var age = 12; var age = 13; var age = 14; console.log(age); } foo(); // 14
1.3.2 let声明
let 和 var的作用差不多,最明显的区别时:let声明的是块作用域。块作用域是函数作用域的子集。
if (true) {
var name = 'codeyu';
console.log(name); // codeyu
}
console.log(name); // codeyu
if (true){
let name = 'codeyu';
console.log(name); // codeyu
}
console.log(name); // ReferenceError:age没有定义
-
let不允许在同一个代码块里出现冗余重复的声明
-
暂时性死区:
let和var的另一个重要区别是,let声明的变量不会在作用域中被提升。在let声明执行之前的执行瞬间被称为暂时性死区,在此阶段引用任何后面才声明的变量都会抛出
ReferenceError -
全局声明:使用let在全局作用域中声明的变量不会成为
window对象的属性 -
不能使用let进行条件式声明
1.3.3 const声明
const的行为和let基本一致,唯一一个重要区别是:const声明的时候必须同时初始化变量,且不能在后续中修改,尝试修改const声明的变量会导致运行时错误。
- 也不允许重复声明
- 声明的作用域也是块
const变量引用一个对象,那么修改这个对象内部的属性并不违反const的限制
1.3.4 声明风格及最佳实践
- 不使用
var const优先,let次之
1.4 数据类型
ECMAScript 有6中基本简单数据类型(也叫原始类型):Undefined Null Boolean Number String Symbol,以及一种复杂数据类型Object。
1.4.1 typeof操作符
用来确定任意变量的数据类型,是一个操作符而不是函数(不需要传参数,但可以使用参数),对于一个变量使用typeof操作符会返回以下字符串之一:
undefined:表示值未定义boolean:表示值为布尔值string:表示值为字符串number:表示值为数值object:表示值为对象(而不是函数)或者nullfunction:表示值为函数symbol:表示值为符号
let message = 'zzzzz';
console.log(typeof message); // string
console.log(typeof(message)); // string
console.log(typeof 99); // number
console.log(typeof null); // object,null被认为是一个空对象的引用
1.4.2 Undefined类型
Undefined 类型只有一个值:undefined,当使用var或者let声明变量但未初始化的时候,这个变量的值就是undefined。
let message;
console.log(message == undefined); // true
对未初始化的变量调用
typeof时,结果是undefined;对未声明的变量调用
typeof时,结果也是undefined;
undefined是一个假值。
1.4.3 Null类型
Null类型同样也只有一个值null;
逻辑上来说,null值表示一个空对象指针,这也是对null使用typeof返回object的原因;
let cat = null;
console.log(typeof car); // object
用途:用来初始化将来用到的变量;另外undefined值是有null派生而来的,所以console.log(undefined == null) // true。
null也是一个假值。
1.4.4 Boolean类型
Boolean类型有两个字面值:true false,是使用最频繁的类型之一;
要将一个其他类型的值转换为布尔值,可以调用Boolean()函数;
不同类型域布尔值之间的转换关系:
| 数据类型 | 转换未true的值 | 转换为false的值 |
|---|---|---|
| Boolean | true | false |
| String | 非空字符串 | ""(空字符串) |
| Number | 非零数值(包括无穷值) | 0,NaN |
| Object | 任意对象 | null |
| Undefined | N/A(无) | undefined |
1.4.5 Number类型
-
浮点数:
0.1 + 0.3 != 0.3 -
值的范围:
Number.MIN_VALUE(保存最小值) Number.MAX_VALUE(保存最大值) 无穷值:Infinity (可加正负号表示正负无穷大) -
NaN:意思是不是数值(Not a Number),用来表示本来要返回数值的操作失败了(而不是抛出错误)。eg:
0 +0 -0相除返回NaN任何设计
NaN的操作始终返回NaN;NaN不等于包含它自己在内的任何值:
console.log(NaN == NaN) // false;ECMAScript提供了
isNaN()函数来判断一个值是否是:“不是数值”;console.log(isNaN(NaN)) // true;任何不能转换为数值的值调用这个函数返回值都是true。 -
数值转换:有3个方法:
Number() parseInt() parseFloat()-
Number()是转型函数,可用于任何数据类型;Number(true) // 1 Number(false) // 0 Number(数值) // 直接返回 Number(null) // 0 Number(undefined) // NaN 字符串: Number(空字符串)//返回0 -
parseInt()parseFloat()用于将字符串转换为数值;
-