第一周学习点

99 阅读11分钟

day01


1、JavaScript:是一个运行在浏览器端的解释型弱类型面向对象脚本语言。
1、浏览器端自带JavaScript解释器,能够识别我们的js代码(环境)

2、解释型:直接运行代码,碰到错误就停止允许后续代码

3、弱类型:变量可以保存一切数据类型,由数据决定了数据类型是什么

2、js的两种书写方式:

1、再HTML写入一个script标签,里面写js代码
	<script>
		//js代码
	</script>

2、创建xx.js,使用script标签的src属性外部引入
	<script src="xx.js"></script>

3、打桩输出:

1、在控制台输出:console.log();
2、在页面上输出:document.write();
3、在警告框输出:alert();
	扩展:用户输入框:var 保存=prompt("提示文字");

4、变量:创建后可以修改

var 变量名=值;

5、常量:创建后不能修改

const 常量名=值;

6、数据类型:

1、原始/基本/值类型:5Number/String/Boolean/Undefined/Null

2、引用/对象类型:11个对象有很多很多的属性方法等待我们以后学习。
	xx.xx;
	xx.xx();

7、运算符:

1、算数:+ - * / %
	几乎和小时候学习的一模一样
	特殊:1、%:取余,俗称模,5%2 -> 1
	          2、隐式转换:默认运算符左右两边都转为数字,在运算
			true->1
			false->0
			undefined->NaN
			null->0
			"1000"->1000
			"1000px"->NaN
	         3、+运算如果碰上一个字符串,两边都会悄悄转为字符串,拼接操作
	         4NaNNot A Number,不是一个数字,他确实是数字类型,不在三界之中,不是一个有效的数字
			全是缺点:
				1、参与任何算术运算结果仍为NaN
				2、参与任何比较运算结果都是false

2、比较/关系:> < >= <= == != === !==
	结果:一定是一个布尔值
	特殊:
		1、隐式转换:默认左右两边转为数字,再比较,如果参与比较的左右两边都是字符串的时候,按位PK每个字符串unicode号(ascii码)
			数字<大写<小写<汉字
			汉字的第一个字:一 - 4e0019968)
				           龥 - 9fa5(408692、参与任何比较运算结果都是false,我们不能使用普通的比较运算去判断x是不是NaN,解决:
			var bool=!isNaN(x);
			true=>是一个有效数字
			false=>是一个NaN

		3undefined==null;//true
		     解决:undefined===null
			===:全等:数值相同并且数据类型也要相同,不在带有隐式转换了
		
3、赋值运算:
	=:赋值符号:会将等号右边的东西保存到等号的左边
	+= -= *= /= %=; 一句话完成了两件事,先计算后赋值
	i+=1; ===> i=i+1;	

4、逻辑运算:
	结果:一定也是一个布尔值
	&&:全部满足才满足,只要一个不满足,就不满足

	||:全部不满足才不满足,只要一个满足,就满足

	!:颠倒布尔值

5、自增和自减
	++ --
	特殊:
		单独使用,前++和后++没有区别
		但是如果参与了别的表达式,变量中的值都会+1,返回不同
			前++,返回的是新值
			后++,返回的是旧值

6、位运算:
	左移:m<<n,m*2的n次方
	右移:m>>n,m/2的n次方
	缺点:底数只能是2

day02


1、分支结构:通过条件的判断,条件的不同,选择对应的代码去执行
1、if分支:3种写法
	1、一个条件一件事,满足就做,不满足就不做
		if(条件){操作}

	2、一个条件2件事,满足就做第一件,不满足就做第二件
		if(条件){操作}else{默认操作}

	3、多个条件多件事,满足谁就做谁
		if(条件){操作}else if(条件){操作}else{默认操作}

2、switch分支
	switch(变量/表达式){
		case 值1:
		操作1;
		break;
		case 值2:
		操作2;
		break;
		default:
		默认操作;
	}

3、三目运算:简化简单的(操作只能有一句话)分支
	条件?操作:默认操作

	条件?操作:套娃

2、强制类型转换:隐式转换出来的东西不是我们想要的,先强制转换,再运算

1、转字符串:
	x.toString();//x不能是undefined和null,undefined和null不能使用.去做任何操作
	String(x);//万能的,完全等效于隐式转换,还不如+""
	页面一切东西都是字符串类型

2、转数字:
	var num=parseInt/Float(str);
	执行原理:从左向右依次读取每个字符,碰到非数字字符则停止转化,如果一来就不认识则为NaNInt不认识小数点,Float认识第一个小数点

	Number(x);//万能的,完全等效于隐式转换,还不如-0 *1 /1

3、转布尔:
	Boolean(x);//万能的,完全等效于隐式转换,还不如 !!x
	只有6个人会为false0,"",undefined,null,NaN,false,其余都为true
	以后我们不管在分支或循环中的条件怎么写都所谓,只需要判断是不是这6

day03


1、循环:反复执行 相同 或 相似的操作。从宏观上来看几乎是一瞬间就能完成,微观上看还是一次一次执行的执行原理:先判断条件满不满足,如果满足则做一次循环体操作,继续判断条件满不满足,如果还是满足则再做一次循环体操作.......直到条件不满足才会结束循环去做后续操作
3种:
	1while循环:
		var 循环变量=几;
		while(循环条件){
			循环体;
			循环变量变化;
		}

	2for循环:
		for(var 循环变量=几;循环条件;循环变量变化){
			循环体;
		}

	3do...while循环:
		var 循环变量=几;
		do{
			循环体;
			循环变量变化;
		}while(循环条件);

		和while的区别:只看第一次
			如果都满足,两者没区别
			如果不满足,while一次都不做,do...while至少执行一次

特殊点:
	1、死循环:
		while(true){操作}
		for(;;){操作}
		do{操作}while(true)

	2、退出循环语句:break(退出整个循环)、continue(退出本次循环)

2、函数的基础:Function - 函数也称之为方法,需要先预定义好的,以后可以反复使用的代码段。何时使用:不希望打开页面立刻执行,而是用户去触发或者程序员调用,函数是第一等公民地位,尽量每个独立的功能都要封装为一个函数

如何使用:2步
	1、创建函数
		function 函数名(形参列表,...){
			操作
		}

	2、调用函数:
		函数名(实参列表,...);

		<elem onclick="函数名(实参列表,...);"></elem>

day04


1、Function:函数也叫方法,需要提前预定义好,以后可以反复使用的代码段
1、创建:21、声明方式:
		function 函数名(形参列表){
			函数体;
			return 返回值;
		}

	2、直接量方式:
		var 函数名=function(形参列表){
			函数体;
			return 返回值;
		}
		函数名和变量名是同一个东西,尽量不要重复

2、调用:
	var 接住返回的值=函数名(实参列表);

3、作用域:
	全局作用域:成员,在任何地方都可以使用
	函数作用域:成员,只能调用时内部可用
	带来了变量的使用规则:优先使用局部的,局部没有找全局,全局没有就报错
		缺点:
			1、千万不要对着未声明的变量直接赋值,这会导致全局污染
			2、函数内的东西外面用不到,但是return可以解决,return的退出函数,如果后面跟着一个数据,就会返回到我们的全局作用域

4、声明提前:
	规则:在程序正式执行之前,会悄悄的将var声明的变量(轻)和function声明的函数(重)集中提前到当前作用域的顶部,但是赋值留在原地

5、重载:同一个函数,根据传入的实参的不同,自动选择对应的函数执行,但是在js中不支持同名函数的存在
	解决:函数中有一个类数组对象arguments,和数组有相同点:
		1、都可使用下标访问某个元素
		2、都可使用length获取长度
		3、都可使用遍历得到每一个元素
	作用:哪怕没有形参,也能接住所有的实参,通过在函数内部判断实参的不同去执行不同的分支,相当于变相实现了重载
		function 函数名(){
			if(arguments.length==?){

			}...
		}

2、数组:一个变量可以保存住多个数据

1、创建:2种
	1、直接量:var arr=[数据,...];
	2、构造函数:var arr=new Array(数据,...);

2、获取数组的元素:arr[i];//下标i是从0开始的,到arr.length-1结束的

3、添加/替换:arr[i]=新数据;

4、数组的三大不限制:
	1、不限制类型
	2、不限制长度
	3、不限制下标越界 - 不是好事
			获取元素,下标越界,得到undefined
			添加元素,下标越界,得到是一个稀疏数组,如果搭配上遍历,那你会得到更多的undefined

5、数组的唯一的一个属性:arr.length - 获取到数组的长度,但是长度是从1开始数的
	固定套路:
		1、向末尾添加元素:arr[arr.length]=新数据;
		2、获取倒数第n个元素:arr[arr.length-n];
		3、缩容:arr.length-=n

6、遍历数组:拿出每一个元素 执行 相同 或 相似的操作
	for(var i=0;i<arr.length;i++){
		arr[i];//当前次元素
	}

day05


1、**************DOM:Document Object Model:文档对象模型:专门用于操作HTML文档的,提供了一些方法给你。

2、DOM树概念:DOM将我们的HTML看作了是一个倒挂的树状结构,但是树根不是html标签,而是document的对象

            document对象:不需要我们程序员创建,由浏览器的js解释器自动创建,一个页面只有一个document树根
            作用:可以通过树根找到我们想要的任何一个DOM元素/节点/对象(属性和方法)
            DOM会将页面上的每个元素、属性、文本、注释等等都会被视为一个DOM元素/节点/对象

3、查找元素:两大方面:

1、直接通过HTML的特点去查找元素
	1、通过 ID 查找元素:
		var elem=document.getElementById("id值");
		特殊:
			1、返回值,找到了返回当前找到DOM元素,没找到返回的一个null
			2、如果出现多个相同id,只会找到第一个
			3、记住控制台输出的样子,这个样子才叫做一个DOM元素/节点/对象,才可以下午去做操作
			4、忘记此方法,不允许使用,id不好用,一次只能找一个元素。id留给后端用
			5、其实根本不用查找,id直接可用

	2、*通过 标签名 查找元素:
		var elems=document/已经找到的父元素.getElementsByTagName("标签名");
		特殊:
			1、返回值,找到了返回一个类数组DOM集合,没找到得到空集合
			2、js只能直接操作DOM元素,不能直接操作DOM集合,解决:要么下标拿到某一个,要么遍历拿到每一个。
			3、不一定非要从document开始查找,如果从document去找,会找到所有的元素,可以换成我们已经找到的某个父元素

	3、*通过 class 查找元素:
		var elems=document/已经找到的父元素.getElementsByClassName("class名");
		特殊:
			1、返回值,找到了返回一个类数组DOM集合,没找到得到空集合
			2、js只能直接操作DOM元素,不能直接操作DOM集合,解决:要么下标拿到某一个,要么遍历拿到每一个。
			3、不一定非要从document开始查找,如果从document去找,会找到所有的元素,可以换成我们已经找到的某个父元素

2、*通过关系去获取元素:前提条件:必须先找到一个元素才可以使用关系
	父元素:elem.parentNode; - 单个元素
	子元素:elem.children; - 集合
	第一个子元素:elem.firstElementChild; - 单个元素
	最后一个子元素:elem.lastElementChild; - 单个元素 
	前一个兄弟:elem.previousElementSibling; - 单个元素 
	后一个兄弟:elem.nextElementSibling; - 单个元素

	为什么要通过关系去找元素呢?不希望影响到别人,只希望影响到自己的关系网

4、操作元素:前提:先找到元素,才能操作元素,3方面

1、内容:
	1、*elem.innerHTML - 获取和设置开始标签到结束标签之间的内容,支持识别标签的
		获取:elem.innerHTML;
		设置:elem.innerHTML="新内容";

	2、elem.innerText - 获取和设置开始标签到结束标签之间的纯文本,不识别标签的
		获取:elem.innerText;
		设置:elem.innerText="新内容";

	以上两个属性都是专门为双标签准备,而有一个单标签也是可以写内容,叫做<input />,我们如何获取?
	3、input.value - 专门获取/设置input里的内容
		获取:input.value;
		设置:input.value="新内容";

2、属性:
	获取属性值:elem.getAttribute("属性名");
	设置属性值:elem.setAttribute("属性名","属性值");

	简化版:
		获取属性值:elem.属性名;
		设置属性值:elem.属性名="属性值";
		简化版的缺点:
			1、class必须写为className - ES6(2015年)class变成了一个关键字
			2、不能操作自定义属性

3、样式:
	使用样式的方式:3种
		1、*内联样式
		2、内部样式表
		3、外部样式表 - 一阶段做开发用的都是外部样式表
	
	二阶段我们就要用js来操作【内联样式】
		1、不会牵一发动全身
		2、优先级最高

	获取样式:elem.style.css属性名;
	设置样式:elem.style.css属性名="css属性值";
	特殊点:
		1、css属性名,有横线的地方,去掉横线,变为小驼峰命名法
			border-radius     -----  borderRadius
		2、小缺陷:获取时,我们只能获取到内联样式,因为我们目前学的就是内联样式的操作

4、绑定事件:
	elem.on事件名=function(){
		操作;
		*****关键字this - 这个
			如果单个元素绑定事件,this->这个元素
			如果多个元素绑定事件,this->当前触发事件元素
	}

一切的获取,往往都是为了判断
一切的设置,可以说是添加也可以说是修改