1.switch语句:
语法:
switch(条件表达式){
case 表达式:
break;
case 表达式:
break;
……
default:
语句
break;
}
执行流程:
switch…case…语句
在执行时会依次将case后的表达式和switch后的条件表达式的值进行全等比较
若结果为true,则从当前case处开始执行代码
当前case后的所有代码都会执行,可在气候加break关键字
则只执行当前case语句,而不会执行其他的代码
若结果为false,则向下比较
若结果全为false,则只执行default后的语句
2.关掉编译器内部的死循环:回车+ 点击×
3. for语句,也是一个循环语句,也成为for循环
1.初始化表达式
2.条件表达式
3.更新表达式
for循环的语法:
for(初始化表达式;条件表达式;更新表达式){
语句…
}
for循环中的三个部分都可以省略,也可以写在外部
for(;;)为死循环
-
Uncaught SyntaxError: Unexpected token ‘<’(40th)
可能是路径问题 -
break关键字立即终止离它最近的循环语句
可以为循环语句创建一个label,标识当前的循环
label:循环语句
使用break语句时,可以在break后跟着一个label
这样break将会结束指定的循环,而不是最近的outer: for(var i=0;i<5;i++){ console.log("外层循环"+i); for(var j=0;j<5;j++){ break outer; console.log("内层循环"+j); } }
结果:”外层循环0“
- cntinue关键字跳过当次循环
立即终止离它最近的循环语句 - 开启计时器:console.time(“计算器的名字”)
终止计算器:console.timeEnd(“计算器的名字”)
8.修改插入模式:insert.
9.对象!!
JS数据类型:
基本数据类型:String,Number,Boolean,Null,Undefined,
Object对象
对象属于一种复合的数据类型,在对象中可以保存多个不同的数据类型的属性
对象的分类:
1.**内建对象**:ES标准中定义的对象,在任何的ES的实现中都可以使用
2.**宿主对象**:由JS的运行环境提供的对象,目前主要由浏览器提供
3.**自定义对象**:由开发人员创建
创建对象
使用关键字new调用的函数,是构造函数constructor
构造函数是专门用来创建对象的函数
使用typeof检查一个对象时,会返回Object
在对象中保存的值称为属性
向对象中添加属性:
语法:对象.属性名=属性值
读取对象中的属性:
语法:对象.属性名
如果读取对象中没有的属性,不会报错而是会返回underfined
修改对象的属性名:
语法:对象.属性名=新值
删除对象的属性:
语法:delete 对象.属性名
-
向对象中添加属性,名字没有规范要求
若要使用特殊的属性名,不能使用“.”,而是[],可直接传递一个变量 语法:对象["属性名"] = "属性值" 读取时一样 属性值可以是任意类型,也可以是一个对象
in 运算符
检查一个对象中是否含有指定的属性
有则true,无则false
语法:
“属性名” in 对象
11. 基本数据类型
String Number Null Undefined Boolean
Y引用数据类型
Object
JS中的变量都是保存到栈内存
类型的值直接在栈内存中存储
间独立存在,修改时不会互相影响
对象是保存到堆内存中的,每创建一个新的对象,就会在堆内存中开辟出一个新的空间
而变量保存的内存地址(对象的引用),如果两个变量保存的是同一个对象引用,当一个通过变量修改时,另外一个也会改变.
比较两个基本数据类型值时,就是比较值;
比较两个引用数据类型时,它是比较对象的内存地址,值和地址有一个不同就不等
-
使用对象字面量,可以创建对象时,直接指定对象中的属性
语法:{属性名:属性值,属性名:属性值……}对象字面量的属性名可以加引号也可以不加,建议不加,
如果要使用一些特殊的名字,则必须加引号属性名和属性值是一组一组的名值对结构, 名和值之间使用:连接,多个名值对之间使用,隔开 如果一个属性之后没有其他的属性了,就不要写
函数funciton:
函数也是一个对象
函数可以封装一些功能(代码),在需要时可以执行
函数中可以保存一些代码在需要的时候调用
使用typeof检查一个函数对象时,会返回function
创建一个函数对象
可以将要封禁的代码字符串的形式传递给构造函数
开发时极少使用此构造函数来创建一个函数对象
封装到函数中的代码不会立即执行
函数中的代码会在函数调用的时候执行
调用函数语法:
函数对象()
调用函数时,函数中封装的代码会按照顺序执行
使用函数声明创建一个函数
语法:
function 函数名([形参一,形参二……形参N]){
语句……
}
使用函数表达式创建一个函数
语法:
var 函数名 = function([形参一,形参二……形参N]){
语句……
}
14,定义一个用来求两个数和的函数
可以在函数()中来指定一个或多个形参(形式参数)
多个形参之间使用","隔开,声明形参就相当于在函数内部声明了对应的变量
但是并不赋值
在调用函数时,可以在()中指定实参
实参将赋值给函数中对应的形参
调用函数时解析器不会检查实参的类型,
所以要注意,是否有可能会接收到非法的参数,如果有可能则需要对参数进行类型的检查
函数的实参可以是任意的数据类型
调用函数时,解析器也不会检查实参的数量
多余实参不会被赋值
如果实参的数量少于形参的数量,则没有对应实参的形参将是undefined
-
可以使用 return 来设置函数的返回值
语法:
return 值
return后的值将会会作为函数的执行结果返回,
可以定义一个变量,来接收该结果在函数中return后的语句都不会执行
如果return语句后不跟任何值就相当于返回一个undefined,
如果函数中不写return,则也会返回undefinedreturn后可以跟任意类型的值
-
枚举对象中的属性
for…in语句:有几个属性,执行几次。
每次执行时,会将对象中的一个属性的名字赋值给变量
语法:
for(var 变量 in 对象){}
-
函数也可以作为对象的属性
如果一个函数作为一个对象的属性保存,则称这个函数是这个对象的方法
调用函数就是调用方法(method) -
枚举对象中的属性
for…in语句:有几个属性,执行几次。
每次执行时,会将对象中的一个属性的名字赋值给变量
语法:
for(var 变量 in 对象){}
-
作用域:变量的范围
在JS中有两种作用域:
1.全局作用域:
直接编写在script标签中的JS代码,都是全局作用域
在页面打开时创建,在页面关闭时销毁
在全局作用域中有一个全局对象window,即浏览器的窗口,可以直接使用
在全局作用域中创建的变量都作为window变量保存,且都是全局变量
在全局作用域中创建的函数都作为window方法保存2.函数作用域: 调用函数时创建函数作用域,函数执行完毕以后,函数作用域销毁 每调用一次函数就会创建一个新的函数作用域,他们直接相互独立 在函数作用域中可以访问到全局作用域的变量 在函数中,不使用var声明的变量都会变成全局变量 定义形参相当于在函数中声明了变量
-
变量的声明提前:
使用var关键字声明的变量,会在所有的代码执行之前被声明(但不会被赋值)
如果声明变量时不使用var关键字,则变量不会被声明提前函数的声明提前:
使用函数声明形式创建的函数function 函数(){}
它会在所有的代码执行之前就被创建,所以我们可以在函数声明前调用函数
使用函数表达式创建的函数,不会被声明提前,所以不能在声明前调用 -
解析器在调用函数时,每次都会向函数内部传递一个隐含的参数
这个隐含的参数就是this,指向的是一个对象
这个对象称为函数执行的上下文对象
调用方式不同,指向的对象不同
1.以函数的形式调用,this是window
2.以方法的形式调用时,this是调用方法的那个对象 -
使用工厂方法创建的对象,使用的构造函数都是Object 所以创建的对象都是Object这个类型, 就导致我们无法区分出多种不同类型的对象
-
创建构造函数,专门用来创建Person对象
构造函数是一个普通的函数,创建方式与普通函数一样
不同的是构造函数一般首字母大写构造函数与普通函数的区别:调用方式不同 普通函数直接调用 构造函数需要关键字new调用 构造函数的执行流程: 1.立即创建一个新的对象 2.将新的对象设置为函数中this,在构造函数中可以使用this来引用新建的对象 3.逐行执行函数中的代码 4.将新建对象作为返回值返回
使用同一个构造函数创建的对象,称为一类对象,也将一个构造函数称为一个类
通过一个构造函数创建的对象,称为该类的实例this的三种情况: 1.当以函数的形式调用时,this就是window 2.当以方法的形式调用时,this就是调用的 3.当以构造函数的形式调用时,this就是新创建的对象
使用instanceof可以检查一个对象是否是一个类的实例
语法:
对象:
对象instanceof 构造函数
是则true 否则false
所有的对象都是Object的后代
所以任何对象和Object在instanceof检查时都会返回true
24. 创建一个构造函数:
在Person构造函数中,为每一个对象都添加了一个sayName方法
如果方法在构造函数内部创建,则构造函数每执行一次就会创建一个新的sayName方法
即所有的实例的sayName都是唯一的
所以需要使所有对象共享同一个方法
25. 原型prototype
解析器会向 创建的每一个函数中添加一个属性prototype
这个属性对应着一个对象,即原型对象
如果函数作为普通函数调用prototype没有任何作用
当函数以构造函数的形式调用时,它创建的对象中都会有一个隐含的属性
指向该构造函数的原型对象,可以通过__proto__方问该属性
将对象中共有的内容,统一设置到原型对象中
访问对象的一个属性或方法时,会在对象自身中寻找,有则直接使用
没有则去原型对象中寻找,找到则直接使用
创建构造函数时,可以将这些对象共有的属性和方法,统一添加到构造函数的原型对象中
既不用分别为每一个对象添加,也不会影响到全局作用域,就使每个对象都具有这些属性和方法
-
修改Person原型的toString
Person.prototype.toString = function(){
return “Person[name=”+this.name+",age="+this.age+",gender="+this.gender+"]";
};//创建一个Person实例 var per = new Person("孙悟空",18,"男"); var per2 = new Person("猪八戒",28,"男"); //当我们直接在页面中打印一个对象时,事件上是输出的对象的toString()方法的返回值 //如果我们希望在输出对象时不输出[object Object],可以为对象添加一个toString()方法 //Person[name=孙悟空,age=18,gender=男] /*per.toString = function(){ return "Person[name="+this.name+",age="+this.age+",gender="+this.gender+"]"; };*/
27.垃圾回收:将不再使用的对象设****置null即可
28.数组的方法:
slice()
从数组提取某元素
该方法不会改变元素数组,而是将截取到的元素封装到一个数组中返回
参数:
1.截取开始的位置索引,包含开始索引
2.截取结束的位置索引,不包含结束索引
第二个参数可以省略不写,此时会截取从开始索引以后的所有元素
splice()
删除数组中指定的元素,并将被删除的元素作为返回值返回
参数:
1.表示开始索引的位置
2.表示删除的位置
3.第三个及以后:可以传递新元素,将自动插入到开始索引位置前边
concat()
连接两个或更多的数组,并返回结果
不会对原数组产生影响
join()
将数组转换一个字符串
不会对原数组产生影响,将转换后的字符串作为结果返回
在join()中可以指定一个字符串作为参数,这个字符串将会成为数组中元素的连接符
默认为","
reverse()
反转数组
直接修改原数组
sort()
对数组排序
直接修改原数组
默认按照Unicode编码
对数字也是,可通过回调函数指定排序规则
回调函数需要定义两个实参
浏览器会根据回调函数的返回值决定元素的顺序
返回大于0的值,则交换
小于0,则不变
等于0,则认为相等,不变
升序排列:a-b
降序排列:b-a
-
**call()和apply()** 这两个方法都是函数对象的方法,需要通过函数对象调用 调用其一都会调用函数执行 在调用其一时可以将一个对象指定为第一个参数 这个对象会变成函数执行的this 区别: call()将实参在对象之后依次传递 apply()将实参封装到一个数组中统一传递 this: 1.以函数形式调用时,this永远都是window 2.以方法的形式调用时,this是调用方法的对象 3.以构造函数的形式调用时,this是新创建的那个对象 4.使用call和apply调用时,this是指定的那个对象
-
在调用函数时,浏览器,此都会传递两个隐含的参数
1.函数的上下文对象this
2.封装实参的对象arguements
arguements是一类数组对象,通过索引来操作数据,也可以获取长度
调用函数时,传递的实参都会在arguements中
即使不定义形参,也可以使用实参
arguements有一个属性是callee,对于一个函数对象,就是当前正在指向的函数的对象 -
Math
不是一个构造函数
属于一个工具类不用创建对象
可以嵌套使用Math.PI圆周率 Math.ceil()向上取整 Math.floor向下取整 Math.abs绝对值 Math.round四舍五入取整 Math.randow生成0~1之间的随机数 生成0~X之间的随机数 Math.round( Math.randow()*10) 生成0~10之间的随机数 Math.round( Math.randow()*9)+1; 生成x~y之间的随机数 Math.round( Math.randow()*(y-x))+x; Math.Max Math.Min Math.pow(x,y)返回x的y次幂 Math.sqrt开方
-
基本数据类型 String Boolean Number Null Undefined 引用数据类型 Object JS中有三个包装类,可以让基本数据类型的数据转换为对象 String() Boolean() Number() 但是注意:我们在实际应用中不会使用基本数据类型的对象, 如果使用基本数据类型的对象,在做一些比较时可能会带来一些不可预期的结果
方法和属性之能添加给对象,不能添加给基本数据类型
当我们对一些基本数据类型的值去调用属性和方法时,
浏览器会临时使用包装类将其转换为对象,然后在调用对象的属性和方法
调用完以后,在将其转换为基本数据类型
33.字符串的相关方法
在底层字符串是以字符串数组的形式保存
[“h”,“e”,“l”,“l”,“o”]
charAt()
返回字符串中指定位置字符
根据索引获取字符
charCodeAt()
返回中指定位置字符的字符编码
根据索引获取字符
String.formcharCodeAt()
根据字符编码获取字符
indexOf()
从左至右检索一个字符串中是否有指定内容
若有则返回该字符的第一次索引
没有则返回-1
indexOf()
从右至左检索
slice()
- 可以从字符串中截取指定的内容
- 不会影响原字符串,而是将截取到内容返回
- 参数:
第一个,开始位置的索引(包括开始位置)
第二个,结束位置的索引(不包括结束位置)
- 如果省略第二个参数,则会截取到后边所有的
- 也可以传递一个负数作为参数,负数的话将会从后边计算
substring()
- 可以用来截取一个字符串,可以slice()类似
- 参数:
- 第一个:开始截取位置的索引(包括开始位置)
- 第二个:结束位置的索引(不包括结束位置)
- 不同的是这个方法不能接受负值作为参数,
如果传递了一个负值,则默认使用0
- 而且他还自动调整参数的位置,如果第二个参数小于第一个,则自动交换
substr()
- 用来截取字符串
- 参数:
1.截取开始位置的索引
2.截取的长度
split()
- 可以将一个字符串拆分为一个数组
- 参数:
-需要一个字符串作为参数,将会根据该字符串去拆分数组
如果传递一个空串作为参数,则会将每个字符都拆分为数组中的一个元素
toUpperCase()
- 将一个字符串转换为大写并返回
toLowerCase()
-将一个字符串转换为小写并返回
34. 正则表达式
-admin@atguigu.com
-admin@.com admintguigu.com
-邮件的规则:
xxx@xxx.com
正则表达式用于定义一些字符串的规则
计算机根据正则表达式检查一个字符串是否符合规则
获取字符串中符合规则的内容被提取出来
正则表达式的对象:
语法:
var 变量2 = new RegExp(“正则表达式”,“匹配模式”);
使用typeof检查正则对象,会返回object
var reg = new RegExp(“a”);这个正则表达式可以检查一个字符串中是否有a
匹配模式:
i忽略大小写
g全局匹配模式
正则表达式的方法
test()
使用这个方法可以检查一个字符串是否符合正则表达式的规则
严格区别大小写,
符合则true,不符合则false
35.
使用字面量创建正则表达式
语法:
var 变量 = /正则表达式/匹配模式
更加简单,但构造函数更灵活
创建一个正则表达式检查一个字符串中是否有a或b
1.使用"|"
2.使用[]
创建一个正则表达式检查一个字符串中是否有字母
/[a-z]/小写字母
/[A-Z]/大写字母
/[A-z]/所有字母
[0-9]所有数字
^ 除了
36. 字符串与正则相关的方法
split()
可将一个字符串拆分为一个数组
方法中可以传递一个正则表达式作为参数,这样方法将会根据正则表达式去拆分字符串
这个方法即使不指定全局匹配,也会全都插分
search()
- 可以搜索字符串中是否含有指定内容
- 如果搜索到指定内容,则会返回第一次出现的索引,如果没有搜索到返回-1
- 它可以接受一个正则表达式作为参数,然后会根据正则表达式去检索字符串
- serach()只会查找第一个,即使设置全局匹配也没用
match()
- 可以根据正则表达式,从一个字符串中将符合条件的内容提取出来
- 默认情况下我们的match只会找到第一个符合要求的内容,找到以后就停止检索
我们可以设置正则表达式为全局匹配模式,这样就会匹配到所有的内容
可以为一个正则表达式设置多个匹配模式,且顺序无所谓
- match()会将匹配到的内容封装到一个数组中返回,即使只查询到一个结果
replace()
可以将字符串中指定内容替换为新的内容
- 参数:
1.被替换的内容,可以接受一个正则表达式作为参数
2.新的内容
- 默认只会替换第一个
37. 量词
- 通过量词可以设置一个内容出现的次数
- 量词只对它前边的一个内容起作用
- {n} 正好出现n次
- {m,n} 出现m-n次
- {m,} m次以上
- + 至少一个,相当于{1,}
- * 0个或多个,相当于{0,}
- ? 0个或1个,相当于{0,1}
检查一个字符串中是否以a开头
^ 表示开头
$ 表示结尾
如果在正则表达式中同时使用^ $则要求字符串必须完全符合正则表达式
reg = /^a$/;
console.log(reg.test("a"));
去除空格就是使用""来替换空格
去除开头的空格
str = str.replace(/^\s*/, “”);
去除结尾的空格
str = str.replace(/\s*$/, “”);
匹配开头和结尾的空格
str = str.replace(/^\s*|\s*$/g,"");