一、语言基础
1、语法
-
区分大小写
-
标识符——就是变量、函数、属性或函数参数的名称。标识符第一个字符必须是一个字母、下划线(_)或美元符号($)
-
注释:
//单行注释
/* 多行注释*/
-
语句: JavaScript语句以分号结尾,省略分号意味着由解析器确定语句在哪里结尾
2、关键字与保留字
ECMA-262描述了一组保留的关键字,这些关键字有特殊用途,比如表示控制语句的开始和结束,或者执行特定的操作。
按照规定,保留的关键字不能用作标识符或属性名。
3、变量
ECMAScript变量是松散类型的,变量可以用于保存任何类型的数据。每个变量只不过是一个用于保存任意值的命名占位符。
有3个关键字可以声明变量:var
、const
和let
。
var
-
作用域:声明作用域是函数作用域
-
声明提升——字声明的变量会自动提升到函数作用域顶部
let
-
作用域:声明作用域是块级作用域
-
不会变量提升
-
for
循环中使用let
声明可以解决之前使用var
循环带来的变量渗透到循环体外部的问题
const
const
的行为与let
基本相同,唯一一个重要的区别是用它声明变量时必须同时初始化变量,且尝试修改const
声明的变量会导致运行时错误。
- 作用域: 块级作用域
const
变量引用的是一个对象的话,可以修改对象内部的属性
声明风格和最佳实践
-
不使用var
限制自己只使用
let
和const
有助于提升代码质量,因为变量有了明确的作用域、声明位置,以及不变的值。 -
const优先,let次之
使用
const
声明可以让浏览器运行时强制保持变量不变,也可以让静态代码分析工具提前发现不合法的赋值操作。使用const声明可以让开发者更有信心地推断某些变量的值永远不会变,同时也能迅速发现因意外赋值导致的非预期行为。
4、数据类型
ECMAScript
有6种简单数据类型(也称为原始类型),和一种复杂数据类型。在ECMAScript中不能定义自己的数据类型,所有值都可以用上述7种数据类型之一来表示。
- 简单数据类型:
Undefined
、Null
、Boolean
、Number
、String
和Symbol
。 - 复杂数据类型:
Object(对象)
。Object是一种无序名值对的集合。
typeof操作符
typeof
操作符用于确定任意变量的数据类型。
对一个值使用typeof
操作符会返回下列字符串之一:
- "
undefined
"表示值未定义; - "
boolean
"表示值为布尔值; - "
string
"表示值为字符串; - "
number
"表示值为数值; - "
object
"表示值为对象(而不是函数)或null; - "
function
"表示值为函数; - "
symbol
"表示值为符号
Undefined类型
Undefined
类型只有一个值,就是特殊值undefined
。当使用var
或let
声明了变量但没有初始化时,就相当于给变量赋予了undefined
值:
Null类型
Null
类型同样只有一个值,即特殊值null
。
逻辑上讲,null
值表示一个空对象指针,这也是给typeof
传一个null
会返回object
的原因。
在定义将来要保存对象值的变量时,建议使用null来初始化,不要使用其他值。这样,只要检查这个变量的值是不是null就可以知道这个变量是否在后来被重新赋予了一个对象的引用,
Boolean类型
Boolean
(布尔值)类型是ECMAScript
中使用最频繁的类型之一,有两个字面值:true
和false
。
虽然布尔值只有两个,但所有其他ECMAScript
类型的值都有相应布尔值的等价形式:
理解以上转换非常重要,因为像if等流控制语句会自动执行其他类型值到布尔值的转换:
let message = "Hello world!";
if (message) {
console.log("Value is true");
}
// Value is true
Number类型
Number
类型使用IEEE 754格式表示整数和浮点值(在某些语言中也叫双精度值)。
1) NaN
有一个特殊的数值叫NaN
,意思是“不是数值”,用于表示本来要返回数值的操作失败了(而不是抛出错误)
isNaN()
函数,该函数接收一个参数,可以是任意数据类型,该函数会对传入的参数进行转换,任何不能转换为数值的值将导致这个函数返回true。
2)数值转换
Number()
转型函数,可用于任何数据类型。parseInt()
和parseFloat()
两个函数主要用于将字符串转换为数值。
Number()
的转换规则有些复杂,实际使用时建议采用parseInt()
和parseFloat()
String类型
String
(字符串)数据类型表示零或多个16位Unicode
字符序列。字符串可以使用双引号(")、单引号(') 或反引号(`)标示 。
模板字面量
-
ES6新增了模板字面量,使用反引号(`)。
- 字符串差值,与之前使用单引号和+拼接不同,模板字符串可以使用包含
${expression}
表示占位符。
const people = { name: 'Johnson', job: 'Front-end' } const project = { name: 'Dyniva' } // 之前拼接方式 let message = people.name + '(' + people.job + ')' + ' follow this project ' + project.name; //ES6 模板字面量 let message = `${people.name}(${people.job}) follow this project ${project.name}`
- 字符串差值,与之前使用单引号和+拼接不同,模板字符串可以使用包含
-
所有插入的值都会使用
toString()
强制转型为字符串,而且任何JavaScript
表达式都可以用于插值。 -
在插值表达式中可以调用函数和方法:
-
function capitalize(word) { return `${ word[0].toUpperCase() }${ word.slice(1) }`; } console.log(`${ capitalize('hello') }, ${ capitalize('world') }!`); // Hello, World!
-
模板字面量可以保留换行字符,可以跨行定义字符串:
Symbol类型
Object类型
ECMAScript
中的对象其实就是一组数据和功能的集合。
类似Java中的java.lang.Object,ECMAScript中的Object也是派生其他对象的基类。Object类型的所有属性和方法在派生的对象上同样存在。
每个Object
实例都有如下属性和方法。
-
constructor:用于创建当前对象的函数。在前面的例子中,这个属性的值就是
Object()函数
。 -
hasOwnProperty(propertyName):用于判断当前对象实例(不是原型)上是否存在给定的属性。
-
isPrototypeOf(object):用于判断当前对象是否为另一个对象的原型。
-
propertyIsEnumerable(propertyName):用于判断给定的属性是否可以使用for-in语句枚举。与hasOwnProperty()一样,属性名必须是字符串。
-
toLocaleString():返回对象的字符串表示,该字符串反映对象所在的本地化执行环境。
-
toString():返回对象的字符串表示。
-
valueOf():返回对象对应的字符串、数值或布尔值表示。通常与toString()的返回值相同。
操作符
-
一元操作符:
-
递增/递减操作符(
++i
--i
)、一元加减乘除操作符、位操作符、 -
布尔操作符(逻辑非
!
、逻辑与&&
、和逻辑或||
) -
关系操作符(小于、大于、小于等于和大于等于)、
-
相等操作符
- 等于(
==
)和不等于(!=
): 这两个操作符都会先进行类型转换(通常称为强制类型转换)再确定操作数是否相等。 - 全等(
===
)和不全等 (!==
):只有两个操作数在不转换的前提下判断是否相等。
- 等于(
-
下边是一些特殊情况及比较的结果:
-
条件操作符 是ECMAScript中用途最为广泛的操作符之一,语法跟Java中一样
variable = boolean_expression ? true_value : false_value;
-
逗号操作符 可以用来在一条语句中执行多个操作
5、语句
IF语句
if
语句是使用最频繁的语句之一,语法如下:
if (condition) statement1 else statement2
这里的条件(condition)可以是任何表达式,并且求值结果不一定是布尔值。ECMAScript会自动调用Boolean()函数将这个表达式的值转换为布尔值。
do-while语句
while语句
while
语句是一种先测试循环语句,即先检测退出条件,再执行循环体内的代码。
while(expression) statement
for语句
for
语句也是先测试语句,只不过增加了进入循环之前的初始化代码,以及循环执行后要执行的表达式
for (initialization; expression; post-loop-expression) statement
for -in语句
for-in
语句是一种严格的迭代语句,用于枚举对象中的非符号键属性
for-in总是得到对象的key或数组、字符串的下标。
for (property in expression) statement
// 循环显示了BOM对象window的所有属性
let arr = ['d', 's', 'r', 'c'];
for (const key in arr) {// 确保这个局部变量不被修改,推荐使用const
if (arr.hasOwnProperty(key)) {
console.log(key);
}
}
// 0
// 1
// 2
// 3
for -of语句
for-of
语句是一种严格的迭代语句,用于**遍历可迭代对象的元素*
for-of总是得到对象的value或数组、字符串的值
//语法
for (property of expression) statement
//示例
for (const el of ['d', 's', 'r', 'c']) { // 确保这个局部变量不被修改,推荐使用const
console.log(el);
}
// d
// s
// r
// c
标签语句
break和continue语句
break
用于退出于立即退出循环,强制执行循环后的下一条语句。而continue
语句也用于立即退出循环,但会再次从循环顶部开始执行。
switch 语句
语法:
switch (expression) {
case value1:
statement
break;
// ....
default:
statement
}
6、函数
ECMAScript
中的函数使用function
关键字声明,后跟一组参数,然后是函数体。
function functionName(arg0, arg1,...,argN) {
statements
}