WEEK4总结

74 阅读5分钟

1.*****object面向对象 *****继承:父对象的成员(属性和方法),子对象可以直接使用; JS的面向对象是基于原型(爸爸): 获取原型对象:2种 1.对象名.proto; 前提必须先创建一个对象,才可以使用此属性找到原型对象; 2.构造函数名.prototype; 哪怕没有创建过任何对象也能找到原型 2**********两链一包: 作用域链:以函数EC的scope chain属性为起点,经过AO逐级引用,形成的一条链式结构,作用:查找变量的,带来了变量的使用规则:优先使用自己的,自己没有找全局,全局没有则报错 闭包:保护了一个可以反复使用的局部变量的词法结构 原型链:每个对象都有一个.__proto__的属性,可以不断的连续.找到爸爸-爷爷-祖祖...形成的一条链式结构 经过尝试,发现最顶层:Object.prototype是对象的原型,所有也就有了一句话:万物皆对象 作用:查找属性和方法,自己没有的属性和方法,可以自动顺着原型链进行查找,所以我们知道为什么人人都可以使用toString,因为toString在最顶层的 笔试题 如何判断自有和共有? 判断自有:obj.hasOwnProperty("属性名"); 返回一个布尔值:true说明是自有,false可能是共有也可能是没有?

if(obj.hasOwnProperty("属性名")){console.log("自有");}
else{	if("属性名" in 对象名){console.log("共有")	}else{console.log("没有")}}

3.修改或删除属性1、修改和删除自有属性修改:obj.属性名=新值;删除:delete obj.属性名; 4.****为老IE的数组添加indexOf方法 - 这道题不是固定的:为某一类人设置一个方法

				Array.prototype.indexOf=function(key,starti){//indexOf的执行原理
					starti===undefined&&(starti=0);//说明用户没有传入开始位置,我们就给用户设置为从下标0开始查找
					for(var i=starti;i<this.length;i++){//从开始位置处,循环数组后面的每一个文字和用户输入的关键字进行匹配
						if(this[i]==key){
							return i;//匹配到了返回对应的下标
						}
					}
					//没匹配到,返回-1
					return -1;
				}
			}
5.*****判断x是不是数组?4种方法
				1、判断x是不是继承自Array.prototype
					Array.prototype.isPrototypeOf(x);
					如果返回true,说明是数组,否则不是数组
				
				2、判断x是否是由构造函数Array创建的
					x instanceof Array

				3、ES5提供了一个API:Array.isArray(x); - 此方法不是人人都有,而且ES5以上的东西,老IE都不支持(别怕,现在的开发流行趋势,不是PC端,而是移动端,IOS(safari)和andriod(chrome))
				
				4、***输出对象的字符串形式:
					在Object的prototype原型上放着最原始的toString
					原始的toString,默认输出[object 构造函数名]
					***多态(override)/重写:子对象绝对父对象的成员不好用,可以在本地定义同名成员,覆盖父对象之中的成员
							不专业的理解:同一个函数,不同的人来使用,效果是不同的,其实根本不是同一个函数
					我希望借用到函数:跳过爸爸,直接去找爷爷拿toString
					Object.prototype.toString.apply(x)==="[object Array]";
 5.*实现自定义继承:
				1、实现两个对象之间的继承
					子对象.__proto__=父对象;

				2、直接匹配设置继承
					构造函数名.prototype=父对象;
					 时机:先设置好父对象,再创建子对象
6.ES5&ES6:就是在ES3的基础添加了一些新特性、新语法、新API - 简化ES3
ES5:提供了新特性、新API 保护对象:保护对象的属性和方法
	1、四大特性:每个属性都有四大特性	{
    				"value": 3500, //实际保存属性值的地方
    				"writable": true,//开关:控制着是否可以被修改
    				"enumerable": true,//开关:控制着是否可以被for in循环遍历到
    				"configurable": true//开关:控制着是否可以被删除,总开关,一旦设置fasle不可逆,也不可修改其他特性;
					
			}
修改四大特性:
				Object.defineProperties(obj,{
					"属性名":{四大特性}
				})
                                	2、三个级别:
			1、防扩展:禁止给对象添加任何新属性
				Object.preventExtensions(obj);

			2、密封:禁止给对象添加任何新属性,也不能删除属性
				Object.seal(obj);

			3、冻结:禁止给对象添加任何新属性,也不能删除属性,也不能修改属性
				Object.freeze(obj);
不重要的原因:1、如果你不用面向对象,你保护个屁2、前辈们都没有保护,你保护个屁

*****数组的新的API:3组6个:
、判断:判断数组中的元素是否符合要求
		every - 每一个:判断数组中的每个元素【都】要符合要求最后结果才为true,类似于&&,只要有一个不满足,结果则为false
			语法:var bool=arr.every(function(val,i,arr){
//				console.log(val);//当前元素
//				console.log(i);//当前元素的下标
//				console.log(arr);//数组本身
				return 判断条件;
			           })

		some - 有一些:判断数组中的是否【包含】符合要求的元素,只要有一个最后结果则为true,类似||,只要有一个满足,则为true,只有全都不满足,结果才为false
			语法:var bool=arr.some(function(val,i,arr){
				return 判断条件;
			           })

	2、*遍历:对每个元素执行相同 或 相似的操作
		forEach:直接修改原数组
			语法:arr.forEach(function(val,i,arr){
				操作;
			           })

		map:不修改原数组,返回新数组
			语法:var newArr=arr.map(function(val,i,arr){
				return 操作;
			           })

	3、过滤和汇总:
		过滤:筛选出原数组之中符合条件的元素组成一个新数组!原数组不变!
			语法:var newArr=arr.filter(function(val,i,arr){
				return 判断条件;
			           })

		汇总:讲数组中每一个元素,取出来整合为一个最终结果
			语法:var sum=arr.reduce(function(prev,val,i,arr){
				return prev+val;
			           },基础值)
                                   *****call、apply、bind:不是自己的方法,也可以用到
	1、call、apply:【临时替换函数中的this】,借用
		差别:call,要求传入函数的实参必须单独参入
		           aplly,要求传入函数的实参必须是一个数组
		语法:要借用的函数.call(借用的对象,实参1,...);
		           要借用的函数.apply(借用的对象,arr); - apply除了有借用的功能,还会悄悄的打散我们的数组

	2、bind:【永久替换函数中的this】,买
		语法:var 新函数=老函数.bind(指定的对象)
		3件事:
			1、创建了一个和原函数功能完全一样的新函数
			2、将新函数中的this永久绑定为你指定的对象
			3、将新函数中的部分参数永久固定
		强调:bind绑定在新函数中的this,无法被call、apply再次替换借走

	总结:如果临时调用一个函数,立刻执行时 -- call/apply
	           如果创建一个函数提前绑定this,不一定希望立刻执行 - bind
ES6:新语法:  
   0 常量也是ES6提供的  
   1.*模板字符串:简化字符串拼接,支持在模板字符串之中书写变量 语法:`我的名字叫${name}`
		在字符串中实现了一个简单的js环境
    2.*let关键字:创建变量以后优先使用let,再考虑var   
    优点:
			1、解决了声明提前
			2、添加了块级作用域,一个{}就是一个块
			3、如果绑定事件时,用到了let来遍历,那么let会记录住你当前元素的下标 - 你以后再也不需要自定义下标了
    3. *箭头函数:简化一切的回调函数
    去掉function,()和{}之间添加=>,形参只有一个可以省略() 
    函数体只有一句话,省略{}  	函数体只有一句话,并且是return,省略{}和return
     4.for...of:垃圾
		for(var v of arr){
			v -   直接拿到值
		}

		1、不能修改原数组
		2、不能遍历hash数组和对象  
     	5、*解构赋值
	6、Set和Map类型
	7、*模块化开发
	8、*Promise
	9、*Class 
10.面试题 	HTML/XHTML/DHTML/XML 分别是什么?
		1、HTML - 网页
		2、XHTML - 更严格的HTML,HTML5->XHTML->HTML4.01
		3、DHTML - 动态的网页:D:Dynamic - 其实并不是新技术、新概念,是将现有技术的整合统称,让我们在离线时,网页也具有动态效果
				DHTML:html+css+js(dom)
		4、XML - 未知的标记语言,一切的标记由自己定义,数据格式
 11.1DOM:原本是可以操作一切结构化文档的 HTML 和 XML,后来为了方便各类开发者分为了3部分:
		1、*核心DOM:【无敌】,既可以操作HTML  又 可以操作XML
			          缺陷:API比较繁琐

		2、*HTML DOM:只能操作HTML,API简单,缺陷:比如属性部分,只能访问标准属性,不能访问自定义属性	

		3、XML DOM:只能操作XML,XML已经淘汰了 - 现在最流行的数据格式是JSON
*通过 关系 获取元素:
	父:xx.parentNode
	子:xx.children - 集合:只能找到儿子
	第一个儿子:xx.firstElementChild
	最后一个儿子:xx.lastElementChild
	前一个兄弟:xx.previousElementSling
	后一个兄弟:xx.nextElementSibling
 11.*****递归:简单来说就是函数中,又一次调用了函数自己,迟早有一天会停下来
	 何时使用:遍历DOM树,专门用于【遍历层级不明确】的情况,既可以遍历层级不明确的DOM树,也可以遍历层级不明确的数据!
         function 函数名(root){
			1、第一层要做什么直接做!

			2、判断他有没有下一级,如果有下一级,再次调用此函数,但是传入的实参是他的下一级
		}
		函数名(实际的根)
   12.	getXXX 和 querySelectorAll 有什么区别?
		返回结果不同的:
			1、getXXX:返回的是要给动态集合HTMLCollection
				优点:数据始终和DOM树实时挂钩
				缺点:每次DOM树进行修改,都会悄悄的再次查找元素,效率相对较低   2、querySelectorAll:返回的是要给静态集合NodeList
				优点:每次不会悄悄重新查找,效率较高,而且还支持使用forEach!
13.***多个元素:
			var elem=document.querySelectorAll("任意的css选择器");
			强调:找到了返回集合,没找到返回空集合
14.删除元素:elem.remove();
HTML DOM常用对象:简化【核心DOM】
	1、image对象:仅仅只是简化了创建语句
		创建:var img=new Image()  ===  var elem=document.createElement("img");
		注意:不是人人都有构造函数创建方式
form对象:简化了查找元素
		查找form元素:var form=document.forms[i];
		查找form元素中的表单控件:var inp=form.elements[i];
		*专属事件:form.onsubmit=function(){//提交事件:只会再提交的一瞬间执行
				return false;//阻止提交
			   }
3、*select对象:
		属性:1、select.options;//得到select下面所有的option,完全等效于xx.children;
		          2、*select.selectedIndex;//得到当前选中项的下标,当时做二级(多级)联动就用到了他

		方法:1、*select.add(option);//完全等效于appendChild
		           2、select.remove(i);//删除下标为i的option

		专属事件:select.onchange=function(){//只有选中项发生变化了才会触发}

	4、*option对象:仅仅只是简化了创建语句,但是非常牛逼
		创建:var opt=new Option("innerHTML","value");