前言
很长时间没去回顾JavaScript基础知识了,现在回想起感觉懵懵懂懂的,是时候需要来进行回顾和总结一些了…
一、ECMAScript部分
1. 实用注解方法
我们先来回顾一下注解~
1.单行注释
// 这是单行注释
2.多行注释
/*
这是多行注释
*/
3.文档注释
/**
* @param {string} name 姓名
* @param {int} age 年龄
*/
function say(name,age){
}
say()
这样在调用函数时候会提示形参类型和内容提示。
2. 变量和数据类型
2.1 注意事项
如果我们直接使用未定义的变量程序会报错
。
如果我们使用声明未赋值的变量,变量值会为undefined
2.2 数据类型
下面我来复习一下变量的类型,划分为基本类型和引用类型。
String
: 字符串Number
: 数值,包括整数,浮点数Boolean
: true或falseundefined
: 在定义变量,未赋值时,变量默认值。不建议作为变量初始值null
: 表示为空,不会开辟内存空间,建议作为变量的初始值。Object
: 复杂数据类型 以 {name : “ ikun”} 键值对形式,赋初始值不建议用{ } ,使用nullBigInt
:比number类型支持更大范围的整数Symbol
: 本质为一种唯一的标识符。
2.3 typeof的使用
前面回顾了数据类型,下面我们来回顾怎么检测类型。使用
typeof 变量
。
- 对
字符串
会返回String
- 对
数值
会返回Number
- 对
布尔值
会返回Boolean
- 对
值未定义
会返回undefined
- 对
对象(非函数)
或者null
会返回Object
- 对
函数
会返回function
- 对
符号
会返回Symbol
注意:有时候看到
typeof(xx)
这里并不是说typeof
就是一个函数方法了,它只是操作符,且这里()
表示后面内容是一个整体。
2.4 数据类型的转换
我们在来回顾数据类型的转换,将数据转换为我们需要的类型。
-
转换为
String
类型:隐式转换: 其他类型
+
一个字符串,比如' '
显式转换:String()
或toString()
二者都是返回转换后的字符串类型 -
转换为
Number
类型:隐式转换: 将需要转换的类型进行
非加的四则运算
即可。其他类型和string类型相加会转换为string类型
显式转换:Number()
返回转换后的数值类型 -
转换为
Boolean
类型:隐式转换:
" " / null / undefined / 0 / NaN
在判断时,这些都会转为false
其他会转为true
,还可以通过!!
将变量转为布尔值
显式转换:Boolean()
返回转换后的布尔类型
3. 基础运算符
3.1 算数运算符
我们开始回顾算数运算啦。我们看一下下面图片就可以了。
3.2 赋值运算符
赋值运算符
=
,我们可以使用给变量赋值,重要的是赋值同时还可以进行运算,我们看一下下面图片。
3.3 自增和自减
这里我们回顾一个容易混淆的知识点,也就是
++
和--
我们可以直接在number
变量后 ++
或--
让变量能自增加或减少。注意运用于非数值变量
时,会尝试将变量转换为数值,如果转换失败会是NaN
。
如果放在变量前面
: 在表达式里会先
将变量自增或自减后,后
在进行其他运算。
如果放在变量后面
: 在表达式里会先
进行其他运算,后
将变量自增或自减。
3.4 运算符优先级
我们在回顾一下运算符号的优先级,优先级在一些时候对我们帮助不小。
下面的图片里是从高到低
的优先级进行排序的。
这里放一下MDN的地址,有疑问的查看MDN会最为权威标准。
运算符优先级 - JavaScript | MDN
3.5 比较运算符
我们时常会对数值进行比较,我们来回顾一下比较运算符。
注意:==
和 ===
前者会将比较的类型转换后进行比较,不会进行类型比较。后者会比较类型和值。
4. 分支语句
前面我们说完了运算符号,现在我们回顾一下分支语句,进行变量的对比。
4.1 if语句
if(条件){
代码块
}
4.2 if…else语句
if(条件){
条件为真,代码块
}else{
条件为假,代码块
}
4.3 if…else if … else语句
和
if...else
语句类似,区别就是可以写多个else if
进行条件分支。
if(条件1){
满足条件1,代码块
}else if(条件2){
满足条件2,代码块
}else if(条件3){
满足条件3,代码块
}else{
条件都不满足,代码块
}
4.4 三元运算符
我们经常会用到三元运算符,比
if
语句更简洁。
条件?为真时执行 :为假时执行
a>1?b=2:b=3
4.5 逻辑运算符
数学中有
且或非
等逻辑语句,js中也有符号对应。
||
或:
等式二边任意一个为真既为真。 遇到true就会返回当前结果,后面不执行。都为 false返回最后一个值
&&
与:
等式二边都为真既为真。遇到false就会返回当前结果,后面不执行。都为true返回最后一个值
!
非:
将值取反操作。 对变量使用 !!a 可以将a转化为布尔值
4.6 switch语句
和
if
语句一样,进行条件判断,但在一些情况会更方便。
switch(表达式){
case 表达式的值1:
代码块
break;
case 表达式的值2:
代码块
break;
default:
默认代码块
}
注意不要掉
break
语句,不然程序会进入下一个case
。
5. 循环语句
循环
在我们程序中很重要,是进行数据处理必备的手段之一,下面我们回顾一下循环语句。
5.1 while循环
条件为真时候执行循环代码块,条件为假时候跳出循环。 注意避免死循环。
while(条件){
代码块
}
我们可以在while循环中使用
break
语句跳出循环。
5.2 do…while循环
和
while
循环的区别就是,不管条件是否满足,都会执行一次循环体代码。
do{
代码块
}while(条件)
5.3 for循环:
这是我们最常用的循环方式。
for (begin; conditon; step) {
代码块
}
这里几个参数来详细介绍一下。
for (let i; i < 3; i++) {
console.log(i)
}
5.4 循环控制
前面说过
break
语句可以跳出while
循环,我们回顾一下循环控制语句。
break
:跳出循环,不在执行循环体代码
continue
:跳出当前循环,接着执行后续循环体代码
6. 函数
函数在js中非常的重要,我们根本离不开函数的使用,我们来回顾一下函数基础知识。
6.1 函数的声明和调用
函数声明使用
function
关键字
function 函数名(形参){
函数封装的代码……
}
函数调用:
函数名(实参 )
函数内部有一个arguments
对象,我们可以通过遍历该对象获取到用户传递的所有实参
6.2 函数的递归
在处理数据时候,我们可能需要使用到函数递归。
function a(b){
if(b==1)return
a(b-1)
}
a(10)
在函数中,我们可以调用其它函数,如果我们自己调用自己,那么就叫函数的递归调用。
注意
:一定要有结束条件,不然就会一直死循环。
6.3 局部和全局变量
函数有自己的作用域,这就需要我们分辨局部和全局作用域的变量。
var str = '1' //全局函数变量
function a(){
var str = '1' //对于b函数来说,外部函数变量
b()
}
function b(){
var str = '1' //局部变量
}
a()
- 局部变量就是在函数内部定义的变量,外部其他函数无法使用
- 全部变量就是在函数外部定义的变量,所有函数都可以使用
- 函数中变量的访问顺序是:先当前函数内部,然后外部函数,最后到全局函数
6.4 函数表达式
我们有时候不用
函数声明方式
定义函数,而是使用函数表达式
。
var foo = function(){
console.log("函数表达式")
}
函数表达式
定义方式就是将匿名函数当值赋值给一个变量函数表达式
是在代码执行到达时被创建,并且仅从那一刻起可用函数声明方式
在函数声明被定义之前,它就可以被调用。
6.5 立即执行函数
有时候我们需要马上调用一个匿名函数,就可以使用立即执行函数。
(function(){
console.log("立即执行函数")
})()
- 立即执行函数就是在创建完成的同时也进行调用
- 将函数体定义在第一个()类,第二个()即调用函数
- 会创建一个独立的执行上下文环境,可以避免外界访问或修改内部的变量,也避免了对内部变量的修改
7. 面向对象
回顾完函数,就到js中另外一个
对象
,对象的使用是我们必须掌握的知识点。
7.1 对象类型的使用
- 创建对象的方式:
var obj = { } var obj = new Object() new 其它类
- 使用对象的方法:
访问对象的属性:对象.属性名
obj.name
或者obj["name"]
修改对象的属性:对象.属性名
=值
obj.name
="新修改值"
添加对象的属性:对象.新增属性名
=值
obj.age
=22
删除对象的属性:delete 对象.属性名
delete obj.age
7.2 值类型和引用类型
- 值类型就是基本数据类型,会被存储在栈内存中
- 引用类型就是对象类型,会在堆内存中开辟一个空间,然后将内存地址存储到栈内存中
7.3 函数的this指向
- 在函数内可以使用this,会指向调用该函数的对象
- 如果函数不是定义在一个对象内,在全局作用域内定义的话,this执行Window对象
var obj = {
fn:function(){
//this 指向obj对象
}
}
fn:function(){
//this 指向Window对象
}
7.4 工厂方法创建对象
创建大量的对象时候我们可以使用工厂方法来创建对象。
我们通过工厂函数,在函数内部定义对象,并赋予初始值,再将该对象返回即可。
7.5 构造函数和类
工厂函数的方法需要我们在函数内申明一个对象,我们可以使用更简洁的方式。
- 构造函数就是我们不用在函数内申明一个对象,直接使用this代替新对象
- 在要构造新对象时候,只需要new 构造函数即可返回一个对象
- 类可以理解为很多种对象的统一,但是这些对象都有相同的地方。比如猫类,里面会有很多不同种类的具体的猫
8. 常见内置类
js中定义了一些常见的内置类,比如Date类型,帮助我们处理时间。
8.1 数字类型 Number
- 常用方法:
toString(base)
:将数字转换为字符串,并且按照base方法进行转换,默认为10
toFixed(digits)
:格式化数字,保留digits位小数
parseInt(string)
:将字符串转换为整型
parseFloat(string)
: 将字符串转换为浮点型var foo = 10; alert(foo .toString(16));//"a" //其它方法类似 ...
8.2 Math对象
Math是一个内置数学对象,拥有一些数学属性和方法。
- 常用方法:
Math.PI
:圆周率
Math.floor()
:向下舍入取整
Math.ceil()
: 向上取整
Math.round()
:四舍五入
Math.random()
: 生成0~1的随机数
Math.pow(x, y)
:返回x的y次幂
8.3 字符串类型 String
我们定义的字符串变量就是一个字符串类型的内置类的实例,有很多的方法。
-
常见方法:
str.length
: 获取字符串的长度的属性str.toLowerCase()
: 返回将 str 字符串全部小写后的新字符串str.toUpperCase()
: 返回将 str 字符串全部大写后的新字符串str.indexOf( value [,formIndex] )
: 从str字符串formIndex位置开始查找value的索引,如果有返回索引,没有返回-1str.includes( value [ , position ])
:从 str字符串position位置开始查找是否包含value,返回true或falsestr.startsWith( value [ , position ])
: 从 str字符串position位置开始判断是否以value开头,返回true或falsestr.endsWith( value [ , position ])
: 从 str字符串position位置开始判断是否以value结尾,返回true或falsestr.replace(regexp/substr,replacement)
: 可以传入一个要替换的字符串或者正则,然后会在str中用replacement进行替换,返回修改后的新字符串str.slice(start,end)
:返回str字符串从start位置开始到end的子字符串str.concat(str2,[,...strN])
: 返回str和str2连接后的新字符串str.trim()
: 删除str的首位空格后返回新字符串str.split([separator[, limit]])
: 将字符串进行处理后返回一个数组。 sparator:以什么字符串进行分割,也可以是正则表达式;limit:限制返回片段的数量
8.4 数组 Array
js中也给数组类型内置了一个类,拥有很多的方法对数组对象进行处理。
-
数组就是一组多种类型的数据集合
-
可以直接使用
var arr = [ ]
或var arr = new Array( )
创建数组 -
length
获取数组的长度 -
数组的索引从0开始,访问数组通过
arr[0]
或arr.at(0)
方法访问 -
修改数组 直接
arr[1] = "新修改的值"
-
常用的方法:
push()
: 在数组末端添加数据 pop() 删除数组最后一个数据unshift()
:在数组开头添加数据 shift() 删除数组开头的数据splice()
: 修改原数组的内容,可以进行添加,删除,和替换
for...in
:循环数组,获取到的是数组索引
for...of
:循环数组,获取到的是每一个元素
arr.slice ()
:用于对数组进行截取
arr.concat()
:创建一个新数组,其中包含来自于其他数组和其他项的值
arr.concat()
:创建一个新数组,其中包含来自于其他数组和其他项的值
arr.join()
: 将一个数组的所有元素连接成一个字符串并返回这个字符串,可以传入一个连接的标志符号
arr.indexOf()
: 查找某个元素的索引
arr.includes()
:判断数组是否包含某个元素
arr.sort()
: 用于对数组进行排序,并且生成一个排序后的新数组:
reverse()
: 将数组中元素的位置颠倒,并返回该数组
arr.forEach()
: 遍历数组,并且让数组中每一个元素都执行一次对应的方法
arr.map()
: 创建一个新数组,这个新数组由原数组中的每个元素都调用一次提供的函数后的返回值组成
arr.filter()
: 创建一个新数组,新数组中只包含每个元素调用函数返回为true的元素
arr.reduce()
: 对数组中的每个元素按序执行一个由您提供的 reducer 函数,每一次运行 reducer 会将先前元素的计算结果作为参数传入,最后将其结果汇总为单个返回值
8.5 Date类型
js中内置的一种处理时间的内置类,在我们进行实例化后就可以调用方法来处理时间数据。
- 实例化Date类型对象的方法:
- 实例对象常用的方法:
- 设置Date的方法:
- 获取时间戳方法:
- Date.parse(str) :可以从一个字符串中读取日期,并且输出对应的Unix时间戳
小结
到这里我们就将JavaScript基础知识的ECMAScript部分回顾完毕,可能还有缺少地方,在后面还会在此基础上继续修改,下篇就将对JavaScript基础知识的DOM和BOM部分进行总结回顾。