JS基础:循环,对象,数组

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(;;)为死循环
  1. Uncaught SyntaxError: Unexpected token ‘<’(40th)
    可能是路径问题

  2. 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“

  1. cntinue关键字跳过当次循环
    立即终止离它最近的循环语句
  2. 开启计时器: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 对象.属性名

  1. 向对象中添加属性,名字没有规范要求

    若要使用特殊的属性名,不能使用“.”,而是[],可直接传递一个变量
     语法:对象["属性名"] = "属性值"
     读取时一样
     属性值可以是任意类型,也可以是一个对象
    

in 运算符
检查一个对象中是否含有指定的属性
有则true,无则false
语法:
“属性名” in 对象
11. 基本数据类型
String Number Null Undefined Boolean
Y引用数据类型
Object

		JS中的变量都是保存到栈内存
		    类型的值直接在栈内存中存储
		    间独立存在,修改时不会互相影响

对象是保存到堆内存中的,每创建一个新的对象,就会在堆内存中开辟出一个新的空间
而变量保存的内存地址(对象的引用),如果两个变量保存的是同一个对象引用,当一个通过变量修改时,另外一个也会改变.

比较两个基本数据类型值时,就是比较值;
比较两个引用数据类型时,它是比较对象的内存地址,值和地址有一个不同就不等

  1. 使用对象字面量,可以创建对象时,直接指定对象中的属性
    语法:{属性名:属性值,属性名:属性值……}

    对象字面量的属性名可以加引号也可以不加,建议不加,
    如果要使用一些特殊的名字,则必须加引号

    属性名和属性值是一组一组的名值对结构,
    名和值之间使用:连接,多个名值对之间使用,隔开
    如果一个属性之后没有其他的属性了,就不要写
    

函数funciton
函数也是一个对象
函数可以封装一些功能(代码),在需要时可以执行
函数中可以保存一些代码在需要的时候调用
使用typeof检查一个函数对象时,会返回function
创建一个函数对象
可以将要封禁的代码字符串的形式传递给构造函数
开发时极少使用此构造函数来创建一个函数对象
封装到函数中的代码不会立即执行
函数中的代码会在函数调用的时候执行
调用函数语法:
函数对象()

调用函数时,函数中封装的代码会按照顺序执行
使用函数声明创建一个函数
语法:
function 函数名([形参一,形参二……形参N]){
语句……
}
使用函数表达式创建一个函数
语法:
var 函数名 = function([形参一,形参二……形参N]){
语句……
}
14,定义一个用来求两个数和的函数
可以在函数()中来指定一个或多个形参(形式参数)
多个形参之间使用","隔开,声明形参就相当于在函数内部声明了对应的变量
但是并不赋值

在调用函数时,可以在()中指定实参
实参将赋值给函数中对应的形参
调用函数时解析器不会检查实参的类型,
所以要注意,是否有可能会接收到非法的参数,如果有可能则需要对参数进行类型的检查
函数的实参可以是任意的数据类型

调用函数时,解析器也不会检查实参的数量
多余实参不会被赋值
如果实参的数量少于形参的数量,则没有对应实参的形参将是undefined

  1. 可以使用 return 来设置函数的返回值
    语法:
    return 值
    return后的值将会会作为函数的执行结果返回,
    可以定义一个变量,来接收该结果

    在函数中return后的语句都不会执行
    如果return语句后不跟任何值就相当于返回一个undefined,
    如果函数中不写return,则也会返回undefined

    return后可以跟任意类型的值

  2. 枚举对象中的属性
    for…in语句:有几个属性,执行几次。
    每次执行时,会将对象中的一个属性的名字赋值给变量
    语法:
    for(var 变量 in 对象){

    		 }
    
  3. 函数也可以作为对象的属性
    如果一个函数作为一个对象的属性保存,则称这个函数是这个对象的方法
    调用函数就是调用方法(method)

  4. 枚举对象中的属性
    for…in语句:有几个属性,执行几次。
    每次执行时,会将对象中的一个属性的名字赋值给变量
    语法:
    for(var 变量 in 对象){

      				 }
    
  5. 作用域:变量的范围
    在JS中有两种作用域:
    1.全局作用域:
    直接编写在script标签中的JS代码,都是全局作用域
    在页面打开时创建,在页面关闭时销毁
    在全局作用域中有一个全局对象window,即浏览器的窗口,可以直接使用
    在全局作用域中创建的变量都作为window变量保存,且都是全局变量
    在全局作用域中创建的函数都作为window方法保存

    2.函数作用域:
       调用函数时创建函数作用域,函数执行完毕以后,函数作用域销毁
    	每调用一次函数就会创建一个新的函数作用域,他们直接相互独立
    	在函数作用域中可以访问到全局作用域的变量
    	
    	在函数中,不使用var声明的变量都会变成全局变量
    	定义形参相当于在函数中声明了变量
    
  6. 变量的声明提前:
    使用var关键字声明的变量,会在所有的代码执行之前被声明(但不会被赋值)
    如果声明变量时不使用var关键字,则变量不会被声明提前

    函数的声明提前:
    使用函数声明形式创建的函数function 函数(){}
    它会在所有的代码执行之前就被创建,所以我们可以在函数声明前调用函数
    使用函数表达式创建的函数,不会被声明提前,所以不能在声明前调用

  7. 解析器在调用函数时,每次都会向函数内部传递一个隐含的参数
    这个隐含的参数就是this,指向的是一个对象
    这个对象称为函数执行的上下文对象
    调用方式不同,指向的对象不同
    1.以函数的形式调用,this是window
    2.以方法的形式调用时,this是调用方法的那个对象

  8. 使用工厂方法创建的对象,使用的构造函数都是Object
    所以创建的对象都是Object这个类型,
    就导致我们无法区分出多种不同类型的对象
    
  9. 创建构造函数,专门用来创建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__方问该属性
将对象中共有的内容,统一设置到原型对象中

访问对象的一个属性或方法时,会在对象自身中寻找,有则直接使用
没有则去原型对象中寻找,找到则直接使用

创建构造函数时,可以将这些对象共有的属性和方法,统一添加到构造函数的原型对象中
既不用分别为每一个对象添加,也不会影响到全局作用域,就使每个对象都具有这些属性和方法

  1. 修改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
  1.    **call()和apply()**
    	这两个方法都是函数对象的方法,需要通过函数对象调用
    	调用其一都会调用函数执行
    	在调用其一时可以将一个对象指定为第一个参数
    	   这个对象会变成函数执行的this
    	区别:
    	   call()将实参在对象之后依次传递
    	   apply()将实参封装到一个数组中统一传递
    	   
    	   this:
    	         1.以函数形式调用时,this永远都是window
    	         2.以方法的形式调用时,this是调用方法的对象
    	         3.以构造函数的形式调用时,this是新创建的那个对象
    			 4.使用call和apply调用时,this是指定的那个对象
    
  2. 在调用函数时,浏览器,此都会传递两个隐含的参数
    1.函数的上下文对象this
    2.封装实参的对象arguements
    arguements是一类数组对象,通过索引来操作数据,也可以获取长度
    调用函数时,传递的实参都会在arguements中
    即使不定义形参,也可以使用实参
    arguements有一个属性是callee,对于一个函数对象,就是当前正在指向的函数的对象

  3. 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开方
    
  4. 基本数据类型
    	 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,"");

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值