二、原生JS入门(零基础)

1.js基础

1.1 注释

单行注释 //

多行注释/**/

1.2 变量及命名规则

变量的声明,定义、

var a=10

var是关键字 a是变量名 =是赋值号 10 是值 var后边需要有空格

变量的命名规则 变量是由数字、字母、下划线(_)和美元符号($)的一种或者几种组成,且不能以数字开头,严格区分大小写。不能用保留字和关键字。

1.3 变量的类型

数值(number)

字符串(string)

布尔(boolean)

undefined:区分一个变量是声明未赋值还是 未声明。声明一个变量未赋值,该变量默认取 underfined。

null:声明这个变量用来保存一个具体的对象,但是这个对象 目前还不存在。

对象(object)

1.4 算术、赋值、关系运算符

算术运算符+ - * / %

赋值运算符:当赋值号左右两边变量名一致时。

= += -= *= /= %=

关系运算符:结果为ture/false

< > >= <= == != === !==

1.5 逻辑运算符

&& 与 ||或 !非

运算结果可以是布尔值也可以是其他类型的值

规律
逻辑与
如果第一个操作数为true或者能隐式转换为true,则运算结果为第二个操作数
如果第一个操作数为false或者能隐式转换为false,则运算结果为第一个操作数

例:

console.log(2&&6,2&&-10,0&&10,false&&20,true&&0);

逻辑或
如果第一个操作数为true或者能隐式转换为true,则运算结果为第一个操作数
如果第一个操作数为false或者能隐式转换为false,则运算结果为第二个操作数

例:

console.log(undefined || 10, false || 0, 10 || true, true || 10);

1.6 类型转换

javaScript类型转换

显式/强制转换(转型函数):Number() String()() Boolean() parseInt()从第一个为数字的字符串开始到非字符串结束parseFloat()可以取到小数后边的字符 。

隐式转换:

算数运算符:+有一个类型为字符串,内容进行拼接。-  *  /  不管为什么类型都 转换为数值。

关系运算符:两个字符串进行比较,不转换,按位比较。单个字母的字符串比较,按各自的ascll码比较。

数值直接 比大小。

只有一个字符串或者没有字符串,其他类型转换成数值。

NaN和任何数值比较都为false。

null>0  false

null<0  false

null=0  false

null>=0 ture

null<=0 ture

null!=0 ture

例如:

console.log( number("") , number(" ") , number(true) , number(false) , number(underfined) , number(null) , )

  0   0   1   0   NaN    0



console.log( string(1) , string(0) , string(true) , string(false) , string(underfined) , string(null),)

    1        0        true      false         undefined          null   

             

console.log(boolean(1) , boolean(0) , boolean("") , boolean(" ") , boolean(underfined) , boolean(null) , )

   true       false          false            true            false           false  

有就是true 没有就是false

1.7 自增,自减

a++:先赋值,再加一;

++a:先加一,再赋值;

例:

var i = 10;
			console.log(i++ + i + ++i - i + ++i + i++ + i);
			//10 + 11 + 12 - 12 + 13 + 13 + 14

1.8 进制

二进制 0 1 逢2进1

八进制 0-7 逢8进1

十进制 0-9 逢10进1

十六进制 0-9 A-F

八进制 ES5里以0开头 后面跟0-7之间的数字

	var num1 = 011;//1*8的0次方 + 1*8的一次方
			num1 = 017;//7*8的0次方 + 1*8的一次方
			console.log(num1);

1.9 程序结构

1.9.1 顺序结构

代码从上到下依次执行

1.9.2 分支结构

(1)、单分支:

if(条件){
		可执行语句  在条件为真(true或者能转换为true)时执行
		}

例:

	   var temp = 18;
			if(temp>=26){
				document.write("脱衣服");
			}
			if(temp<20){
				document.write("加衣服");
			}

(2)、双分支:

	if(条件){
				条件为真时执行的代码
			}else{
				条件为假时执行的代码
			}

例:

	if(temp>=26){
				document.write("a");
			}else{
				document.write("b");
			}

(3)、多分支:

	if(条件){

		}else if(条件){
			
		}else{
			
		}

1.9.3 循环结构和break、continue

循环:重复执行相同的代码,得到相同或者不同的结果,减少冗余

循环结构的几种写法:目前三种,while(){} ; do while() ; for(;{}

循环的嵌套:一个循环里({}里)套循环

结束循环的关键字:continue break

continue :结束当此循环,继续执行后续的循环

break: 直接结束整个循环,就近结束(如果是嵌套,里边break直接结束,然后外面的循环继续执行)

for循环:

		表达式1:循环变量的初始化
		表达式2:循环条件
		表达式3:循环变量的变化

先执行表达式1,再执行表达式2,然后执行花括号里的代码,最后执行表达式3
先执行表达式2,再执行花括号里的代码,最后执行表达式3

for循环的嵌套:

for(var i = 1; i <= 5; i++){
				for(var j = 1; j <= 3; j++){
					console.log("a");
				}
			}

死循环:

循环条件恒假
			for(var i = 1; i >= 10; i++){
				console.log(i);
			}
恒真
			for(var i = 11; i >= 10; i++){
				console.log(i);
			}

switch

值是有限的,并且是确定的

switch(变量或者表达式){
				case 值1:
					statements;//如果变量的值和值1相等,则执行
					break;
				case 值2:
					statements;//如果变量的值和值2相等,则执行
					break;
				……
				

		case 值n:
			statements;
			break;
		default:
			statements;
	}

switch后小括号里的变量和case后的值是一个全等比较(===)

switch(week){
				//case 穿透
				case 1:
				case 2:
				case 3:
				case 4:
				case 5:
					document.write("好好学习");
					break;
				case 6:
					document.write("好好自习");
					break;
				case 0:
					document.write("好好休息");
			}

案例

12、求1+2!+3!+…+20!的值

方法一:

13、篮球从5米高的地方掉下来,每次弹起的高度是原来的30%,经过几次弹起,篮球的弹起高度小于0.1米。

14、有一个棋盘,有64个方格,在第一个方格里面放1粒芝麻重量是0.00001kg,第二个里面放2粒,第三个里面放4,棋盘上放的所有芝麻的重量

2.函数

2.1 函数的概念

函数是由事件驱动或者被调用是可重复执行的代码块(放于代码块里{})

好处:减少代码冗余,增加灵活性,便于维护,提高可扩展性(维护)。

2.2 函数的创建方式

1;函数声明

function 函数名(){

		//具体语句

}

2;函数表达式

var 函数名= function (){

	//具体语句

}

3;借助内置一个方法(Function),构造函数方式

var 函数名 = new Function();

2.3 函数的参数

求两个参数的和,借助参数

形参和实参

形参:当定义一个函数时,在小括号里写的变量

实参:在调用一个函数时,小括号里面写的值或变量

形参和实参是一 一对应的

形参比实参,多余的形参默认会取到undefiend

实参比形参多,多余的实参无效

//打印一个表格

	/*function createTable(m,n){
		var str = "";		
		for(var i = 1; i <= m; i++){
			str += "";
			for(var j = 1; j <= n; j++){
				str += "";
			}
			str+="";
		}		
		str += "
1
"; box.innerHTML = str; } createTable(100,50);*/

2.4 js执行及声明提升

js引擎在执行js代码时的两步操作:

1.先扫描环境中所有的声明(变量声明,函数声明),将这些声明提升至对应环境的最顶端

2.具体的代码执行,在对应的地方进行执行

3.通常情况下,所有的局部变量在函数执行完毕后立即销毁

/*console.log(a);//undefined  声明提升
			var a = 10;
			console.log(a);//10*/
			

		/*foo();
		function foo(){  //声明提升  整体提升
			console.log("a");
		}*/
		
		//console.log(foo);
		/*foo(); //报错  foo is not a function  , is undefined
		var foo = function(){ //提升 提升的是函数名
			console.log("a");
		}*/

2.5 argument和return

arguments:在函数内使用,表示传给该函数的所有的实参的集合
在无法确认形参的个数,有需要传递实参时

function foo(){
				console.log(arguments)
				console.log(arguments[0]);//取到第一个实参
				console.log(arguments[3]);//取到第4个实参
				console.log(arguments.length);//实参的个数
				console.log(arguments[arguments.length-1]);//取最后一个实参
				//取到所有的实参,将实参打印出来
				for(var i = 0; i < arguments.length; i++){
					console.log(arguments[i]);
				}
			}
			foo(1,2,3,5,6,7,8);

return :

1.结束函数执行

2.函数的返回值 函数运行之后的结果

如果一个函数没有return或者return后面没有具体的值,则函数的返回值为undefined

function bar(){
				return 10;
			}
			var a = bar();

		console.log(a);

		function doAdd(a,b){
			var sum = a+b;
			return sum;
		}	
		var a = doAdd(1,2);
		
		console.log(a);
		alert(a);

案例

1、编写一个函数,计算两个数字的和、差、积、商
要求:使用传参的形式

2、 编写一个函数,计算三个数字的大小,按从小到大顺序输出

2.6 作用域

变量或者函数能够被访问到的范围-----全局作用域、局部作用域

全局作用域:

1、最外层函数外通过var来声明的变量或者声明的函数具有全局作用域

var a = 10;//全局变量
		function foo(){//全局函数
			console.log(a);
			}
			foo();

2、在函数内不通过var来定义的变量

function foo(){
			var a = 10;
			b = 20;//全局变量  通常不推荐这种写法
			}
			foo();
			//console.log(a);
			console.log(b);

3、window对象的属性和方法具有全局作用域(当环境中未定义,而直接可以使用的一些变量或者函数)

		foo();
			//alert("hello")
			//console.log(name);
			//console.log(window);

局部作用域:

1、在函数内部通过var来声明的变量

function foo(){
			var a = 10;//局部变量
		console.log(a);
		function bar(){ //局部函数	
			}
		}
		foo();

2、函数的形参具有局部作用域,局部变量

function foo(x){
				console.log(x);
			}
			foo();
			console.log(x)

;

**ES5中,函数是区分全局和局部唯一的代码块

2.7 递归函数

递归函数:在一个函数内部调用自身,称该函数为递归函数

unction foo(){ //foo就是递归函数
				foo();
			}
			foo();

例:

1、

2、利用递归求斐波那契数列
1、1、2、3、5、8、13、21、34、55……
F(0)=0,F(1)=1, F(n)=F(n-1)+F(n-2)(n>=2,n∈N*)

方法一:
function feiBo(n){
				if(n==0){
					return 0;
				}
				if(n==1){
					return 1;
				}
				return feiBo(n-1)+feiBo(n-2)
			}
		var num = feiBo(50);
		console.log(num);
		
		//todo 借助循环 取第n项

方法二:

		function feiBo(n){
			var a1 = 1;
			var a2 = 1;
			if(n==1){
				return a1;
			}
			if(n==2){
				return a2;
			}
			
			for(var i = 3; i <= n; i++){
				var a = a1+a2;
				a1 = a2;
				a2 = a;
			}
			return a;
		}
		
		console.log(feiBo(50));

2.8 构造函数

构造函数:一个普通函数,当它和new运算符一起使用时,该函数称为构造函数,通常会将构造函数的首字母大写

function Person(){		
		}
		//可以看成是一个类
		var liuxin = new Person();
		var wangyue = new Person();

对象类型:
var obj = {};

是一个对象,但是这个对象没有属性和方法

person有两个属性:name和age,有一个方法:sayHello
键值对(名值对)

	var person = {
				name: "john",
				age: 20,
				sayHello: function(a){
					console.log("hello"+a);
				}
			}

如果来取到属性值,如果来调用方法 对象名.属性名 对象名.方法名()
如果一个对象没有某个属性或者方法,那么取值时会得到undefined

console.log("我叫"+person.name+"今年"+person.age+"岁啦");
			person.sayHello("world");

添加属性 如果对象里已经有某个属性,会覆盖

person.sexy = "male";
person.sexy = "female";

删除:

	delete person.sexy;

案例:

1、利用递归求两个数的最大公约数

function getMaxDivision(m,n){
				var r = m % n;
				m = n;
				n = r;
			if(r==0){
				return m;
			}else{
				return getMaxDivision(m,n);
			}
					}		console.log(getMaxDivision(56,42));

2、求某个数的阶乘

function jc(n){
				//临界条件
				if(n==1){
					return 1;
				}
				return n*jc(n-1);
			}
			var result = jc(5); // 5*jc(4)->5*4*jc(3)->5*4*3*jc(2)->5*4*3*2*jc(1)->5 4 3 2 1
			console.log(result)

3、随机的四位数字验证码

function getRandCode(){
				var str = "";
				for(var i = 0; i < 4; i++){
					var num = parseInt(Math.random()*10);
					str += num;
				}
				return str;
			}
		code.innerHTML = getRandCode();

4、编写任意个数字的求和、差、积、商的函数

function exec(){
				var he = arguments[0],
				    cha = arguments[0];

			//var he = cha = ji = shang = arguments[0];			
			for(var i = 1; i <= arguments.length; i++){
				he += arguments[i];
				cha -= arguments[i];
			}
			
			document.write(he,cha);
			
		}
		exec(1,2,3,4,5,6);

5、编写一个函数,计算任意两个数字之间所能组成的奇数个数,数字必须是个位数
比如: 计算0-3之间能组成的奇数个是01、21、03、13、23、31

function getOdd(m,n){
				if(m>=10 || n >= 10){
					return;
				}
				if(m>n){
					var temp = m;
					m = n;
					n = temp;
				}
				for(var i = m,count=0; i <= n; i++){
					for(var j = m; j <= n; j++){
						if(i!=j&&j%2!=0){
							count++;
							console.log(""+i+j);
						}
				}
			}
			document.write(count);
		}
		getOdd(0,3);

6、某个公司采用公用电话传递数据,数据是四位的整数,在传递过程中是加密的,加密规则如下:每位数字都加上5,然后用除以10的余数代替该数字,再将第一位和第四位交换,第二位和第三位交换,请编写一个函数,传入原文,输出密文

function mi(a){
				var yi=(parseInt(a/1000)+5)%10;
				var er=(parseInt(a%1000/100)+5)%10;
				var san=(parseInt(a%100/10)+5)%10;
				var si=(a%10+5)%10;
				var i=yi;
				yi=si;
				si=i;
				var j=er;
				er=san;
				san=j;
				document.write(yi,er,san,si)	

		}
		mi(1567);

7、编写一个函数,输入n为偶数时,调用函数求1/2+1/4+…+1/n,当输入n为奇数时,调用函数求1+1/3+…+1/n

function foo(n){
				var sum=0;
				if(n%2==0){
					for(var i=2;i<=n;i+=2){
						sum+=1/i
					}
				}else{
					for(var i=1;i<=n;i+=2){
						sum+=1/i;
					}
				}
				document.write(sum)
			}
			foo(4)

3.数组

3.1数组的概念和创建

数组的概念:有序的值的集合,表现在索引上。通过索引(下标)来取值,索引从0开始,到arr.lenght-1结束。

对象的概念:无序的值的集合,由属性和方法组成,通过属性名和方法名取值。

数组的创建方式:字面量[]、构造函数

字面量:

var arr = [1,2,3];

arguments 伪数组或者类数组对象

取数组中的值,通过索引或者下标

console.log(arr[0]);//数组中第一个元素
console.log(arr.length);//数组中元素的个数
console.log(arr[arr.length-1]);//数组中的最后一个元素

添加一个元素:
arr = [1,2,3,4];
或者:arr[3]=4;

console.log(arr[5]);//undefined  如果一个数组没有那么多元素,但是通过索引取到超出范围的值,这个值为undefined

构造函数:

var arr2 = new Array(1,2,3);//参数表示数组中的元素

var arr3 = new Array(3);//表示数组中元素的个数 arr3.length为3

3.2数组中常用的方法

方法是相对于对象而言

数组也是对象,如下:

var arr = [];
console.log(typeof arr); //object

方法的功能,传递的参数,返回值,对原数组是否有影响

(1)、push() 向数组尾部追加元素(push的参数),返回数组中元素的个数,原数组发生改变

	var arr = [1,2,33,44];
		var a = arr.push(1,2,3);		
		console.log(a,arr);
		输出:7 (7) [1, 2, 33, 44, 1, 2, 3]

(2)、pop() 从数组的尾部删除一个元素,返回这个删除的元素,原数组发生改变

var arr = [1,2,33,44];
var a = arr.pop();
		console.log(a,arr);
		输出:44 (3) [1, 2, 33]

(3)、unshift() 向数组的头部追加元素,返回数组中元素的个数,原数组发生改变

var arr = [1,2,33,44];

var a = arr.unshift(1,2);		

		console.log(a,arr);
		输出:6 (6) [1, 2, 1, 2, 33, 44]

(4)、shift() 从数组的头部删除一个元素,返回这个删除的元素,原数组发生改变

var arr = [1,2,33,44];

var a = arr.shift();	

		console.log(a,arr);
		输出:1 (3) [2, 33, 44]

(5)、slice 截取数组 如果0参数,返回原数组,1个参数,从该参数对应的索引开始截取,直至数组结束,返回截取的数组,如果两个参数,从第一个参数对应的索引开始截取,到第二参数对应的索引结束,不包括第二个索引对应的元素,反回截取的数组,原数组不发生改变。最多两个参数

var arr = [11, 22, 33, 55];

var a = arr.slice(1,3);

console.log(a, arr);
输出:(2) [22, 33] (4) [11, 22, 33, 44]

(6)、splice 截取数组 如果0参数,返回空数组,1个参数,从该参数对应的索引开始截取,直至数组结束,返回截取的数组,如果两个参数,从第一个参数对应的索引开始截取,第二个参数表示截取的长度,反回截取的数组,三个及以上的参数,第三个及后续参数会从截取的位置添加到原数组中。原数组发生改变

var arr = [11, 22, 33, 55];

var a = arr.splice(1, 2, 77, 88);

console.log(a, arr);

输出:(2) [22, 33] (4) [11, 77, 88, 55]

(7)、reverse 数组翻转,原数组发生改变

var arr = [1,2,3,4];
			arr.reverse();
			console.log(arr);
   输出:[4,3,2,1]

(8)、sort() 排序按位排序,原数组发生改变

var arr = [5,8,2,6,7];
			arr.sort();
			console.log(arr);
输出:[2,5,6,7,8]

(9)、join() 将数组转换成字符串,数组元素之间以参数来拼接,原数组不发生改变

var arr = [1,2,3,4];

var str = arr.join("++++++");

console.log(str);

输出:1++++++2++++++3++++++4

(10)、concat() 合并数组,原数组不发生改变

var arr = [1,2,3,4];

var a = arr.concat([5,6]);

console.log(a,arr);

输出:(6) [1, 2, 3, 4, 5, 6] (4) [1, 2, 3, 4]

3.3数组的遍历

概念:从头到尾对数组中的元素访问了一遍

3.4数组排序

1、冒泡排序:数组中的元素两两进行比较,如果第一个数比第二个数大,交换位置,第一轮结束后,最大值排在最后边;进行第二轮的两两比较,第二大的值也能拍出来;以此类推

function bubbleSort(arr){
				for(var i = 0; i < arr.length-1; i++){ //轮数比长度少一
					for(var j = 0; j < arr.length-1-i;j++){//每轮比较的次数
						if(arr[j]>arr[j+1]){
							var temp = arr[j];
							arr[j] = arr[j+1];
							arr[j+1] = temp;
						}
					}
				}
				return arr;
			}
		console.log(arr);

2、选择排序:假设第一个值为最小值,设一个变量minIndex指向这个最小值对应的索引,然后让minIndex对应的值和剩余所有的值进行比较,有比minIndex对应的值小的,改变minIndex的指向,最终确定一个最小值,让minIndex对应的这个最小值和第一个值交换位置;假设第二个值为最小值,minIndex指向这个所用,让第二个值和剩余所有值进行比较,就可以找到minIndex对应的第二个小值索引,让第二小的值和第二个值交换位置,以此类推

function selectSort(arr){
				for(var i = 0; i < arr.length-1; i++){
					//假设第i个值为最小值
					var minIndex = i;
					for(var j = i+1; j < arr.length; j++){
						if(arr[minIndex]>arr[j]){
							minIndex = j;
						}
					}

				var temp = arr[i];
				arr[i] = arr[minIndex];
				arr[minIndex] = temp;
				
			}
			
			return arr;
		}
		var arr1 = [6,9,4,11,5,8];
		console.log(selectSort(arr1));

案例:

1、定义一个含有30个整型元素的数组,按顺序分别赋予从2开始的偶数;然后按顺序每五个数求出一个平均值,放在另一个数组中并输出。试编程。

//var arr = [2,4,6,8,10]
			var arr = [];
			var newArr = [];
			var sum = 0;
			for(var i = 0; i < 30; i++){
				arr[i] = (i+1)*2; //arr[0] = 2  arr[1] = 4
				//arr.push((i+1)*2)

			sum += arr[i];//求和
			
			if((i+1)%5==0){ //每5个求平均值
				newArr.push(sum/5);
				sum = 0;
			}
			
		}
		console.log(newArr);

2、编写函数has(arr , 60) 判断数组中是否存在60这个元素,返回布尔类型

function has(arr,num){
				for(var i = 0; i < arr.length; i++){
					if(arr[i]===num){
						return true;
					}					
				}
				return false;
			}
			var arr1 = [10,20,30,40];
					console.log(has(arr1,200));

3、有一个从小到大排好序的数组。现输入一个数,要求按原来的规律将它插入数组中。

function sort(arr,num){
				for(var i = 0; i < arr.length; i++){
					if(num<=arr[i]){
						arr.splice(i,0,num);
						break;
					}
					

			}
			if(num>arr[arr.length-1]){
				arr.push(num);
			}
			return arr;
		}
		console.log(sort(arr,10000));

4、密码强度 强 中 弱 大写字母 小写字母 数字

方法一:txt.onchange = function(){
				var flag1 = false,
				flag2 = false,
				flag3 = false;
				var val = this.value;
				for(var i = 0; i < val.length; i++){
					if(str1.indexOf(val[i])!=-1){
						flag1 = true;
					}
					if(str2.indexOf(val[i])!=-1){
						flag2 = true;
					}
					if(str3.indexOf(val[i])!=-1){
						flag3 = true;
					}
				}
				//判断
				if(flag1&&flag2&&flag3){
					alert("强");
				}else if(flag1&&flag2 || flag1&&flag3 || flag2&&flag3){
					alert("中");
				}else{
					alert("弱");
				}
			}

方法二:txt.onchange = function(){
				var flag1 = 0,
				flag2 = 0,
				flag3 = 0;
				var val = this.value;
				for(var i = 0; i < val.length; i++){
					var code = val[i].charCodeAt(0);

				//65-90
				
				if(code>=65&&code<=90){
					flag1 = 1;
				}
				
				//97-122
				
				if(code>=97&&code<=122){
					flag2 = 1;
				}
				
				//48-57
				
				if(code>=48&&code<=57){
					flag3 = 1;
				}
			}
			
			var sum = flag1 + flag2 + flag3;
			
			if(sum==3){
				alert("强");
			}else if(sum==2){
				alert("中");
			}else{
				alert("弱");
			}
			
		}

3.5 严格模式与普通模式的区别

严格模式:
1、变量声明
2、禁止使用with
3、设立eval作用域
4、函数中的this指向问题
5、删除变量
6、函数参数不能重名
7、八进制字面量表示法
8、arguments不追踪参数变化

3.6 ES5新增的数组方法

1、indexOf 返回某个值在数组中的索引,如果数组中没有这个值,返回-1

通常会用这个方法去判断一个数组中是否含有某个元素

2、forEach:相当于遍历,第一个值是属性值,第二个值是索引

3、filter 根据条件过滤出符合要求的数组元素

var arr = [10,20,30,40];

var a = arr.filter(function(item){
				return item > 20;
			});
			console.log(a);
		输出:
			0: 30
			1: 40
			length: 2

4、some 只要有一个符合条件 every每一个都要符合条件 返回值为布尔值

var a = arr.some(function(item){
				return item > 20;
			});
			var b = arr.every(function(item){
				return item > 2;
			});
			console.log(a,b);

输出:true true

5、reduce(对数组中的所有元素调用指定的回调函数。该回调函数的返回值为累积结果,并且此返回值在下一次调用该回调函数时作为参数提供。

3.7字符串的创建方式和常用方法

字符串的创建方式:字面量,构造函数

字面量:

var str = "abc",str1 = '123';

构造函数:

var str2 = new String("abc");

方法:

1、charAt(n) 返回索引位为n的字符

2、indexOf() 返回索引值或者-1

3、slice(m,n) 如果m>n 取值为空字符串 substring(m,n)如果m>n 交换m,n的值

4、split 用于把一个字符串分割成字符串数组。

5、trim 去除首尾空格

3.8 Math对象常见API

abs(x):返回绝对值

ceil:对数进行上舍人

floor:对数进行下舍入

sqrt:返回数的平方跟

random:返回0-1之间的随机数

round:把数四舍五入为最接近的整数

案例

敏感字过滤

btn.onclick = function(){
				var str = "tmd";
				var val = txt.value;
				val = val.replace(str,"***");
				box.innerHTML += "

"+val+"

"; }

随机生成一个五位以内的数,然后输出该数共有多少位,每位分别是什么

var num=parseInt(Math.random()*10000);
			var str=num.toString();
			var len=str.length;
			document.write("数为:"+str+"
"+"位数为:"+len+"
"+"
"); for(var i=0;i") }

编写一个函数,获得一个十六进制的随机颜色的字符串(例如:#20CD4F)

var str="0123456789ABCDEF"
			var randstr = "#";
			for(var i = 0; i < 6; i++){
				var randIndex = Math.floor(Math.random()*str.length);
				var randCode = str[randIndex];
				randstr+=randCode;
			}
			document.write(randstr);

四位的混合验证码

方法一:var str = "ABCDEFG0123456789";	

		var randstr = "";
		for(var i = 0; i < 4; i++){
			var randIndex = parseInt(Math.random()*str.length);
			var randCode = str[randIndex];
			randstr+=randCode;
		}
		console.log(randstr);

方法二:var chars = "";
			while(chars.length<4){
				var randCode = Math.floor(Math.random()*43)+48;
				if(randCode>=48&&randCode<=57 || randCode>=65&&randCode<=90){
					chars += String.fromCharCode(randCode);
				}
			}
			console.log(chars);

3.9日期对象创建

日期对象的创建

当前日期

var oDate = new Date();

指定日期

var oDate1 = new Date("2019-10-1 12:00:00");
oDate1 = new Date("2019/5/1 12:12:12");

1970年1月1日 0时0分0秒所有经历毫秒数

var oDate3 = new Date(1000);

1、日期处理

oDate.getDate()      返回一个月中的某一天 (1 ~ 31)
oDate.getDay()       返回一周中的某一天 (0 ~ 6)
 oDate.getMonth()  返回月份 (0 ~ 11)
 oDate.getFullYear() 以四位数字返回年份
oDate.getHours()    返回当前小时(0-23)
oDate.getMinutes() 返回当前分钟 (0 ~ 59)
oDate.getSeconds()       返回当前秒(0 ~ 59)
oDate.getMilliseconds()  返回当前毫秒(0 ~ 999)
oDate.getTime()       返回1970年1月1日至今的毫秒数


oDate.setDate()      设置月中的某一天 (1 ~ 31)
 oDate.setMonth()  设置月份 (0 ~ 11)
 例:oDate.setMonth(9);   alert(oDate.getMonth())
oDate.setFullYear()设置年份(四位数)
oDate.setHours()             设置小时(0-23)
oDate.setMinutes()          设置分钟 (0 ~ 59)
oDate.setSeconds()          设置秒(0 ~ 59)
oDate.setMillisenconds()  设置毫秒(0 ~ 999)
oDate.setTime()                 设置1970年1月1日至今的毫秒数

2、日期操作

(1)、获取年份:

var year = oDate.getFullYear();

(2)、0-11 0表示一月

var month = oDate.getMonth();

(3)、当天日期

var date = oDate.getDate();

(4)、0-6 0表示周日

var week = oDate.getDay();

(5)、当前小时

var hours = oDate.getHours();

(6)、返回1970年1月1日至今的毫秒数

var times = oDate.getTime();

(7)、设置日期,某个方面

oDate.setDate(50);

(8)、设置20天之后的日期

oDate.setDate(oDate.getDate()+20);

(9)、月份

oDate.setMonth(10);

(10)、小时

oDate.setHours(12);

3、封装日期函数

判断某年份是否为闰年

function isLeapYear(year){
				if(year%4==0&&year%100!=0 ||year%400==0){
					return true;
				}
					return false;
			}

将日期格式化输出 “2015|08|24”

function format(s){
				var oDate = new Date();
				var year = oDate.getFullYear();
				var month = oDate.getMonth()+1;
				var date = oDate.getDate();

			if(month < 10){
				month = "0" + month;
			}
			
			if(date < 10){
				date = "0" + date;
			}
			
			return year+s+month+s+date;
		}

获得某个月份的天数

function getDays(year,month){
				switch(month){
					case 2:
						if(isLeapYear(year)){
							return 29;
						}
						return 28;
					case 4:
					case 6:
					case 9:
					case 11:
						return 30;
					default:
						return 31;
				}
		}

判断两个日期相差的多少天多少时多少分多少秒

function getNDay(date1,date2){
				var ms = Math.abs(date2-date1);
				var ss = ms/1000;

			var day = Math.floor(ss/3600/24);
			var hour = Math.floor(ss/3600%24);
			var minute = Math.floor(ss/60%60);
			var second = Math.floor(ss%60);
			
			return "剩余"+day+"天"+hour+"小时"+minute+"分"+second+"秒";
			
		}
		
		var date1 = new Date();
		var date2 = new Date("2019-7-19 12:00:00");
		
		document.write(getNDay(date1,date2))

获得N天以后的日期

function getNDate(n){
				var oDate = new Date();
				oDate.setDate(oDate.getDate()+n);
				return oDate;
			}

4、清除定时器

定时器:setInterval(fn,time); 每隔一个time(毫秒)时间间隔,就执行一次fn



var timer = setInterval(function(){
				console.log("aa");
			},1000);

		clearInterval(timer);

setTimeout延时器

clearTimeout清除延时器

5、倒计时

var count = 5

		var a = setInterval(function(){
			count--;
			box.innerHTML = count;
			if(count==0){
				clearInterval(a);
				box.innerHTML = "倒计时结束";
			}
		},1000);

6、三元运算符

操作数1?操作数2:操作数3

操作数1是条件 操作数2是满足条件时输出的 操作数3是不满足条件输出的

和if else相同

   			if(n < 10){
					n = "0" + n;
				}else{
					return n;
				}

return n<10?"0"+n:n;

4.BOM、DOM及相关对象

BOM的概念:浏览器对象模型 提供了独立于页面和浏览器相关的一些操作方法和属性

浏览器代理检测: navigator.userAgent

判断浏览器类型、判断是移动端还是PC

"Android", "iPhone", "SymbianOS", "Windows Phone", "iPad", "iPod" 

4.1判断移动端还是PC端

var agent = navigator.userAgent;

var arr = ["Android", "iPhone", "SymbianOS", "Windows Phone", "iPad", "iPod" ];				操作系统和手机型号

arr.forEach(function(item){				//列出数组的每个元素。
				if(agent.indexOf(item)!=-1){		
					location.href = "Mobile.html";
				}
			})

4.2判断当前浏览器是什么类型的

属性名navigator

Trident IE浏览器 Chrome谷歌浏览器 FireFox 火狐浏览器

console.log(navigator); 打印window属性名
console.log(navigator.userAgent); 判断浏览器浏览器(内核)

使用方法:

var agent = navigator.userAgent;
if	(agent.indexOf	("Trident")	!=	-1	){
			alert("IE");
		}

4.3location对象

属性:

protocol、获取当前的协议 http:

host或hostName 获取当前主机 放到服务器 8020端口号

pathname、 获取服务器对应的硬盘 获取路径

search 设置或返回从问号 (?) 开始的 URL(查询部分)。

port、 获取端口号

href、 获取页面完整的路径 可读写的属性

hash、 设置或返回从井号 (#) 开始的 URL(锚)。

方法:

assign(url), 跳转,有历史记录,能返回

replace(url) , 无历史记录

reload()本页面重新加载

location.href = “http://www.baidu.com”;//页面跳转到执行的url*/
btn.onclick = function(){
//location. (“location1.html”)//有历史记录,能返回
//location. (“location1.html”);//无历史记录
location. (“location1.html”);//本文档重新加载

		//一个页面 学员信息   添加学员信息按钮 添加信息之后   通常需要刷新  才会显示最新添加的数据  调用reload方法,让其自动刷新

window.open(); 开启一个新窗口**

window.close(); 关闭窗口**

1.1prompt 没样式要求的话可以用这个

1.2confirm 确认框

1.3alert(arg1)/prompt

var val = prompt(“请输入年龄”);//返回输入值
console.log(val);

1.4(arg1,arg2)/confirm(arg1)

var flag = confirm(“你确定要离开?”) //返回布尔值
console.log(flag)

4.4 history对象

history对象保存着用户上网的历史记录,从窗口被 打开的那一刻算起

历史记录 back 后退 go 转到 forwaed前进

history文件 写个小案例

scrollTop:可视区域顶部距离页面局部的距离 竖直方向 滚东条(滚动距离)

用逻辑或处理 兼容性的问题。 可读可写

var st =  document.documentElement.scrollTop  ||   document.body.scrollTop;

scrollLeft:可视区域水平距离页面局部的距离 水平方向滚动条

var st =  document.documentElement.scrollLeft  ||   document.body.scrollLeft;

clientWidth: 可视区域的宽度 var 变量名 = 。。。

 例:document.documentElement.clientWidth

clientHeight: 可视区域的高度 var 变量名 = 。。。

 例:document.documentElement.clientHeight

BOM 两个方法

window.onscroll事件 滚动条滚动时间 只要滚动条动就出发时间处理函数执行

window.onresize事件 窗户尺寸改变

定时器

var 变量名 = setinterval( fn,time);开启定时器

clearInterval(变量名);清除定时器

定时器时一个异步函数

浏览器单线程的 先运行 主体 在运行定时器;

延时器 setTimeout(fn,time) 隔time这个时间,fn执行一次

4.5DOM的增删改查

div box

p test

div test
div name

1、增加 先创建再增加

元素节点

var oDiv = document.createElement("div");
var oSpan = document.createElement("span");

文本节点

var oTxt = document.createTextNode("文本节点");

oSpan.appendChild(oTxt);把文本放在oSpan里



oDiv.appendChild(oSpan);//把oSpan放到oDiv里面	

document.body.appendChild(oDiv);//把oDiv放到body尾部

2、查询 获取DOM对象

6种 4种 通过id className tagName name 2种 选择器

(1)、id 是唯一的 无兼容性

var oDiv = document.getElementById("box");

console.log(box);//通过id名直接取DOM对象的方式没有标准支撑 后续代码 测试的话可以使用id

(2)、tagName 集合 无兼容性

var aDiv = document.getElementsByTagName("div");
		console.log(aDiv);
		aDiv[0].style.backgroundColor = "red";

(3)、className 集合

var aTest = document.getElementsByClassName("test");
		console.log(aTest);//集合  类数组对象  伪数组
		aTest[0].innerHTML = "hello";
		aTest[1].innerHTML = "world";

(4)、标签的name属性值

var aName = document.getElementsByName("name1");
		console.log(aName);
		aName[0].style.width = "100px";

(5)、querySelector 只取第一个dom对象

var oDiv = document.querySelector("#box");
		var oDiv1 = document.querySelector(".test");
		console.log(oDiv);
		console.log(oDiv1);

(6)、querySelectorAll

var aTest = document.querySelectorAll(".test");
		console.log(aTest);

3、替换

var oBody = document.getElementsByTagName("body")[0];
//var oSpan = document.createElement("span");
	    //var oSpan = document.getElementsByTagName("span")[0];//挪位置
		//var oDiv = document.getElementById("box");

保留加替换

//var cloneNode = oSpan.cloneNode(true);
//document.body.replaceChild(cloneNode,oDiv);
//document.body.replaceChild(oSpan,oDiv);
replaceChild(newNode,oldNode)

4、删除 removeChild

var oDiv = document.getElementById("box");
document.body.removeChild(oDiv);

4.6DOM的属性节点

attributes:获取某个DOM对象的所有的属性节点

var oBox = document.getElementById("box");
	console.log(oBox.attributes);

getAttribute():获取某一个属性节点的值

var oBox = document.getElementById("box");
console.log(oBox.getAttribute("id"));
	console.log(oBox.getAttribute("class"));

setAttribute():给某个DOM对象添加属性节点

var oBox = document.getElementById("box");
oBox.setAttribute("id","box1");修改
	oBox.setAttribute("class","test1");修改
	oBox.setAttribute("name","application-name");增加

removeAttribute():删除某一个属性节点

oBox.removeAttribute("name");
oBox.removeAttribute("id");

默认属性和自定义属性:
			console.log(oBox.id,oBox.abc);
			console.log(oBox.getAttribute("id"),oBox.getAttribute("abc"));

class

		console.log(oBox.className);

获取行内样式:

4.7 节点类型

nodeType 元素节点1 属性节点2 文本节点3

test
var oBox = document.getElementById("box");
			console.log(oBox.nodeType,oBox.nodeName,oBox.nodeValue);
			var oTxt = document.createTextNode("test");
			console.log(oTxt.nodeType,oTxt.nodeName,oTxt.nodeValue);
			console.log(oBox.attributes[0].nodeType,oBox.attributes[0].nodeName,oBox.attributes[0].nodeValue);

子节点:

innerTest:纯文本,可读可写

innerHTML:编译标签。可读可写

outHTML:本身及内部

高级选取:

firstChild\firstElementChild 第一个子节点

选取第一个子节点。有顺序要求。兼容谷歌和IE低版本

oFirst=oUl.firstElementChild || oUl.firstChild 

lastChild\lastElementChild 最后一个子节点

oLast=oUl.lastElementChild || oUl.lastChild 

兄弟节点(有兼容性问题)

 nextSibling\nextElementSibling  下一个节点   

oNext=oUl. nextElementSibling || oUl.nextSibling

previousSibling\previousElementSibling  上一个节点    

oPrevious=oUl. previousElementSibling || oUl. previousSibling

box.insertBefore(newNode, existNode):在一个已知的节点前面插入一个新的节点

     var oDiv = document.getElementsByTagName("div")[0];
			var oSpan = document.createElement("span");
			var oP = oDiv.children[0];
			//oDiv.appendChild(oSpan);
			oDiv.insertBefore(oSpan,oP);

文档碎片节点:优化代码,提高速度

var oList = document.getElementById("list");
var oFragment = document.createDocumentFragment();	
		for(var i = 0; i < 10; i++){
			var oLi = document.createElement("li");
			oFragment.appendChild(oLi);
		}	
		oList.appendChild(oFragment);

关于取值
offsetWidth/offsetHeight:

oDiv.style.width   样式中width这个属性的属性值
clientWidth  width + padding
offsetWidth  width + padding + border 
offsetLeft/offsetTop:

5.事件Event

5.1事件基础

JavaScript 事件是由访问 Web 页面的用户引起的一系列操作。
当用户执行某些操作的时候,再去执行一系列代码。或者用来获取事件的详细信息,如鼠标位置、键盘按键等。

事件处理函数

javaScript可以处理的事件类型为:鼠标事件、键盘事件、HTML事件所有的事件处理函数都会都有两个部分组成,on + 事件名称,函数体

5.2鼠标事件

onclick:用户单击鼠标按钮或按下回车键时触发
ondblclick:当用户双击主鼠标按钮时触发
onmousedown:当用户按下鼠标还未弹起时触发
onmouseup:当用户释放鼠标按钮时触发
onmouseover:当鼠标移到某个元素上方时触发
onmouseout:当鼠标移出某个元素上方时触发
onmousemove:当鼠标指针在元素上移动时触发
onmouseenter onmouseleave

5.3HTML事件

onload:当页面或者资源完全加载后在 window 上面触发,或当框架集加载完毕后在框架集上触发。
onselect:当用户选择文本框(input 或 textarea)中的一个或多个字符触发
onchange:当文本框(input 或 textarea)内容改变且失去焦点后触发
onfocus:当页面或者元素获得焦点时在 window 及相关元素上面触发
onblur:当页面或元素失去焦点时在 window 及相关元素上触发
onsubmit:当用户点击提交按钮在元素上触发
onreset:当用户点击重置按钮在元素上触发
onresize:当窗口或框架的大小变化时在 window 或框架上触发
onscroll:当用户滚动带滚动条的元素时触发

5.4事件对象

当触发某个事件时,会产生一个事件对象,这个对象包含着所有与事件有关的信息 。包括导致事件的元素、事件的类型、以及其它与特定事件相关的信息。

通过事件绑定的执行函数是可以得到一个隐藏参数的 。说明,浏览器会自动分配一个参数,这个参数其实就是 event 对象。

Event对象获取方式

事件对象:每一个事件触发时,都会产生一个事件对象

在事件处理函数里,有一个隐藏的参数,这个参数是系统自动分配的,它就是一个事件对象,对象里包含和事件相关信息

var evt = e || event;

event.button属性
当前事件触发时哪个鼠标按键被点击

clientX、clientY属性
鼠标在可视区X坐标和Y坐标,即距离左边框和上边框的距离

screenX、screenY属性
鼠标在屏幕区X坐标和Y坐标,即距离左屏幕和上屏幕的距离

offsetX、offsetY属性
鼠标相对于事件源的X坐标和Y坐标

pageX、pageY
鼠标相对于文档的X坐标和Y坐标

target 事件属性可返回事件的目标节点(触发该事件的节点),如生成事件的元素、文档或窗口。

e.target

5.5事件流

三部分 捕获 事件源 冒泡

事件冒泡 : 事件由内向外进行传播,需要在不同的DOM对象上添加相同事件

事件源: 直接触发事件产生那个DOM对象,跟在哪个事件处理函数无关,

阻止事件冒泡:evt.stopPropagation();

阻止冒泡的兼容性写法

if(evt.stopPropagation){
					evt.stopPropagation();
				}else{
					evt.cancelBubble = true;
				}

键盘事件keyup、keydown、keypress
onkeydown:当用户按下键盘上任意键触发,如果按住不放,会重复触发
onkeypress:当用户按下键盘上的字符键触发,如果按住不放,会重复触发
onkeyup:当用户释放键盘上的键触发
组合键ctrlkey、altkey、shiftkey
altKey属性,bool类型,表示发生事件的时候alt键是否被按下
ctrlKey属性,bool类型,表示发生事件的时候ctrl键是否被按下
shiftKey属性,bool类型,表示发生事件的时候shift键是否被按下
keyCode/which兼容
获取用户按下键盘的哪个键
键盘控制div移动

console.log(evt.keyCode,evt.which); //得到键盘码,可以用来判断用户是否按下了某个键

5.6事件默认行为及阻止方式

浏览器的默认行为

JavaScript事件本身所具有的属性,例如a标签的跳转,Submit按钮的提交,右键菜单,文本框的输入等

阻止默认行为的方式

event.preventDefault();//现代浏览器
event.returnValue = false;//IE低版本及部分现代浏览器
return false;//兼容性比较好,最好用到代码最后面

阻止a标签的默认:





	

阻止submit的默认:


		

文本框:

oInput.oninput = function(){
				//console.log(this.value);
				this.value = this.value.substr(0,10);从0开始截取,截取10位数
			}

自定义右键菜单 oncontextmenu

	

	
  • 菜单1

5.7DOM2级事件处理程序


5.8事件委托机制

转换大小写

console.log(“aAa”.toUpperCase());//大写转换
console.log(“aAa”.toLowerCase());//小写转换

利用事件冒泡的原理把本应给dom对象的属性,委托给他的父级

5.9九宫格


6.正则表达式

6.1正则表达式的创建:

正则表达式:是由普通字符及特殊字符(元字符)组成的对字符串进行过滤的逻辑公式

字面量:var reg = /abc/ i

构造函数:var reg = new RegExp(“abc”,“i”)

var reg = /study1/i;

6.2方法

字符i表示不区分大小写

test()是正则表达式的方法

alert(reg。test(“sTuDy111")) 返回一个布尔值,假如要检测的是字符串(test)中含有某个子字符串(正则定义),返回true

变量名.exec("")返回的类数组对象中index表示匹配的子字符串在字符中的位置

字符g表示在匹配内容是,搜索所有

exec方法返回一个伪数组,将匹配成功的内容,返回给你,如果没有匹配,返回null。

在使用exec方法时,正则表达式不是全局匹配,每次从0索引开始

replace是字符串方法

alert(str.replace(reg,”*“));用星号去替换正则表达式匹配到的内容(子串)

字符串的match方法

var 变量名 = 字符串。match(pattern) 将匹配到的结果都放入数组当中,并返回

search方法

用于查找符合正则的子串的位置,只返回第一个匹配的位置

split方法

字符串的split方法,同样可以使用正则 (从某个字符到某个字符之中有几个.中间有几个的选择到)

6.3正则表达式字符

.元字符

代替除了换行之外的所有单个字符

*号 元字符

出现任意次(0-n次) 重复*前的单个字符的多次匹配

+号 元字符

出现(至少1次到n次) 出现+号前边的单个字符至少出现一次

?号 元字符 贪婪匹配

表示0-1次 \表示转义,就是将特殊字符变成普通字符看待

[]表示字符可以出现的范围

【0-9】【a-z】【A-Z】

\w \W

小w 等价于字母数字下划线 大W非字母数字下划线

\d

代表数字 等价于 【0-9】

\D{7,}匹配到至少七个非数字 相当于【^0-9】{7,} {3} {3,5}至少三至多5

/^ $/ 从/^后的第一位开始 $/结束

\s 匹配空格

\b

可以匹配是否到了边界,把字符串当成一个单词来搜索

|

代表或者的意思,匹配齐总的一种字符

()

加上小括号 强内容进行分组,可以作为一个整体进行多次匹配

var pattern = /8(.*)8/g;        //获取 8..8 之间的任意字符
		var str = 'This is 8google8';
	  console.log(str.match(pattern));
		console.log(RegExp.$1);             //得到第一个分组里的字符串内容

var pattern = /(.*)\s(.*)/;			//括号里任意字符任意位数	\s表示空格
		var str = "baidu taobao";
		alert(str.replace(pattern, "$2 $1"));

//exec 方法将匹配到的内容  返回,并将()分组的内容也放入数组  返回
		var pattern = /^([a-z]+)\s([0-9]{4})$/gi; //使用分组
		var str = 'google 2012';
		console.log(pattern.test(str));
		console.log(pattern.exec(str));

常用正则表达式
	
	检查邮政编码//共 6 位数字,第一位不能为 0
	/^[1-9]\d{5}$/
	检查文件压缩包  //xxx.zip\xxx.gz\xxx.rar
	/^\w+\.(zip|gz|rar)$/ 
	删除多余空格  //
	str.replace(/\s/g,'');
	删除首尾空格
	str.replace(/^\s+/,'');
	str.replace(/\s+$/,'');
	电子邮件( xxxxx @ xxxx(.xxxx)+) [email protected]
	/^\w+@\w+(\.\w+)+$/
	手机号
	/^1(3|4|5|6|7|8|9)\d{9}$/
	身份证
	/^\d{17}(\d|X)$/
	日期  (xxxx-xx-xx| xxxx/xx/xx | xxxx.xx.xx)
	/^\d{2}|\d{4}[-\/\.]\d{2}[-\/\.]\d{2}$/
	只能输入中文
	str.replace(/[^\u4e00-\u9fa5]/g,'');
	账户名只能使用数字字母下划线,且不能以数字开头,长度在6-15之间
	/^[a-zA-Z_]\w{5,14}$/


	
	
                    
                    

你可能感兴趣的:(前端)