js第二周笔记总结

105 阅读9分钟

第6天

1.数组的基础

1.创建数组

1.直接变量

  var arr=[值,...];

2.构造函数

  var arr=newArr(num);

3.如何释放一个引用类型:一定要看清楚有几个变量引用着这个引用类型,每个变量都要释放后才能释放干净

在js底层有一个垃圾回收器,只有垃圾回收器的计数器(记录着这个数据有几个人引用着)为0的时候才会删除不要的数据

建议:我们的代码都要封装为一个函数,函数中的一切变量都会自动释放

索引数组:下标都是数字组成的数组

2.hash数组

1.创建:2步

1、创建空数组:

var arr=[];

2、为数组添加自定义下标并且赋值:

arr["自定义下标"]=新值;

2.访问元素:

arr["自定义下标"];

3.强调:hash数组的length失效了,永远为0!

遍历hash数组:不能再使用for循环,必须使用for in循环 - 其实for in代老师并不爱称呼他叫作一个循环,因为它不需要设置从哪里开始到哪里结束,纯自动化的,专门为了遍历hash数组存在的

for(var i in 数组名){
	i;//下标
	数组名[i];//当前次元素
		}

不止能遍历hash数组,也能遍历索引数组

个人建议:索引数组依然是for,hash数组再使用for in

4.hash数组的原理:

hash算法:将字符串,计算出一个尽量不重复的数字(地址值) 字符串内容相同,则计算出来的数字也一定是相同的 添加元素:将自定义下标交给hash算法,得到一个数字(地址值),直接将你要保存的数据放到此地址保存起来

获取元素:将指定的自定义下标交给hash算法,得到一个和当初保存时一样的数字(地址值),通过此地址找到你当初保存的数据,取出来使用

5.js里面一切的东西都是对象,万物皆对象,除了undefined和null,【一切对象的底层都是hash数组】 学习这一块最大的目的:是为了对象做准备工作

第7天

  1. 数组的API:

    1.栈和队列:添加元素和删除元素

    栈:一端封闭,只能另一端出

    开头进:arr.unshift(新值,...);
    
    开头出:var first=arr.shift();
    
    结尾进:arr.push(新值,...);
    
    结尾出:var last=arr.pop();
    

    队列:一端进,从另一端出

    开头进:arr.unshift(新值,...);                     
    
    结尾出:var last=arr.pop();
    
    结尾进:arr.push(新值,...);
    
    开头出:var first=arr.shift();
    

2.二维数组 何时:在一个数组,希望再次细分每个分类 创建:

var arr=[["预判",18,900],
["王刘振",19,1000],
["干湿唱",20,700]
];
访问:arr[行下标][列下标];

特殊:列下标越界,返回undefined行下标越界,得到是一个报错,因为行下标越界已经得到一个undefined,undefined没有资格在加[]做操作

遍历二维数组:必然两层循环,外层循环控制行,内层循环控制列

for(var r=0;r<arr.length;r++){
	for(var c=0;c<arr[r].length;c++){
	console.log(arr[r][c]);
	}
     }

3.ES5还提供了3组6个API:

1.判断:2个

every:每一个,要求所有元素都满足条件才会为true,只要有一个不满足则为false,非常类似于我们的&&

var bool=arr.every(function(val,i,arr){
	//val - 当前的值
	//i - 当前的值的下标
	//arr - 当前数组本身
	return 判断条件;
})

some:有一些,要求只要有一个元素都满足条件会为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 subArr=arr.filter(function(val,i,arr){
	return 判断条件;
})

汇总:

var result=arr.reduce(function(prev,val,i,arr){
	return prev+val;
},基础值)

以上6个API都是在简化我们的for循环操作,以后数组我们可能真的不会再写for循环

4.String的概念:

和数组有相同点:
	1.字符串中的个数:str.length;
	2.获取字符串中的某个字符:str[i];
	3.遍历字符串
	4.所有数组不修改原数组的API,字符串也可以使用(concat、slice)

引用/对象类型:11个
	*String Number Boolean -> 包装类型
	*Array *Function Date(日期) Math(数学) *RegExp(正则:验证)
	Error(错误)
	*Object(面向对象开发方式)
	Global(全局对象)- 只有在浏览器中被window对象代替了, 自然保存着全局变量和全局函数,只不过window可以省略不写,有一天我们会去学习node.js这个后端语言,而在node.js中全局对象就叫做global

为什么null和undefined不能使用. - 因为前辈们没有给他们俩提供包装类型

第8天

1.StringAPI

1.转义字符:\

作用:

1.将字符串中和程序冲突的字符转为原文
	"\""         '\''
2.包含特殊功能的符号:
	换行:\n
	制表符:\t	->	大空格,就跟你敲tab按键效果一样
3.输出unicode编码的字符:
	\u4e00    -   ascii码:19968
	\u9fa5     -   ascii码:40869

2.大小写转换

大写:var upper =str.toUppercase();
小写:var upper=str.tolowercase();

3.获取字符串指定位置的字符:

str.charAt(i)===str[i]

4.获取字符串中指定位置的字符的ASCII码

5.检索字符串

var i=str/arr.indexOF("关键字""starti");

6.拼接字符串

varnewStr=strconcat("新字符串",....);

7.截取字符串:

var substr = str/arr.slice(starti,end+1)

8.替换字符串

var newStr=str.replace("固定关键字/正则表达式""新内容");

9.切割/分割/分隔字符串

var arr=str.split("自定义切割符");

10.去掉空白字符

str.trim/trimstart/trimEnd();

扩展:JS如何创建元素:3步

1.创建空标签:var elem=document.createElement("标签名");
2.为其设置必要的属性和事件:
	elem.属性名="属性值";
	elem.on事件名=function(){操作}
3.挂载上树/渲染页面:父元素.appendChild(elem);

第9天

1.Math对象:专门提供了数学计算的API

API:

1.取整

1.上取整
var num=Math.ceil(num);
2.下取整
var num=Math.floor(num);
3.四舍五入取整
var num=Math.round(num);

2.乘方和开方

乘方:Math.pow(底数,幂);  -> 更简化:底数**幂
开方:Math.sqrt(num); - 仅仅只能开平方

3.最大值和最小值

Math.max/min.apply(Math,arr);

4.绝对值:把负数变为正数

5.随机数

parselnt(Math.randow()*(max-min+1)+min)

2.Date对象:日期对象,提供了操作日期和时间的API。

创建:4种

1.创建一个当前日期:
		var now=new Date();

2.创建一个自定义时间:
		var birth=new Date("yyyy/MM/dd hh:mm:ss");

3.创建一个自定义时间:
		var birth=new Date(yyyy,MM,dd,hh,mm,ss);//修改月份,从0~11,0代表1月

4.复制一个日期:
		为什么:日期的所有API都是直接修改原日期的,无法获得修改之前的日期
		所以,在执行API之前先进行复制,然后再操作复制后的日期
		var end=new Date(start);

使用:2类

1.两个日期对象之间,可以相减(大-小),得到一个毫秒差,换算出自己想要的任何一部分 - 日期的本质其实就是保存了一个毫秒数 - 做倒计时的关键
创建日期的最后一种方式,绝对没人用:var date=new Date(毫秒数);//计算机元年:1970年1月1日 8点整

2.API:

分量:时间的单位
年月日星期:FullYear Month Date Day
时分秒毫秒:Hours Minutes Seconds Milliseconds
每一个分量都有一对儿getXXX/setXXX的方法
	其中getXXX负责获取一个分量的值
	其中setXXX负责设置一个分量的值
特殊:
	1.取值范围:
		FullYear - 当前年份的数字
		Month - 0~11
		Date - 1~31
		Day - 0~60代表是星期天,外国人的眼里星期天才是一周的第一天的
		Hours - 0~23
		Minutes、Seconds:0~59
日期你知道了取值范围,如果你还故意设置超出范围,他很聪明,会自动进制
	  
          2.Day,没有set方法
          3.如果希望对某个分量进行加减操作:
            date.setXXX(date.getXXX()+/-n)
          4.格式化日期为本地字符串:
            date.toLocaleString(); - 垃圾:具有兼容性问题,我们一般会选择自己创建一个格式化方法来格式日期
            用了此方法会失去一些东西:日期的自动进制、日期的API
            但是你也会获得一些东西:字符串的API

3.定时器:

1.周期性定时器:每过一段时间就会执行一次,先等后做
	开启:timer=setInterval(callback,间隔毫秒数);
	停止:clearInterval(timer);

2.一次性定时器:等待一段时间,只会做一次就结束了
	开启:timer=setTimeout(callback,间隔毫秒数);
	停止:clearTimeout(timer);

第10天

1.BOM:Browser Object Model-浏览器对象模型;

属性:

1.获取浏览器的完整大小:outerWidth/outerHeight
2.获取浏览器的文档显示区域的大小:innerWidth/innerHeight - 获取每台电脑的浏览器的文档显示区的大小
3.获取屏幕的完整大小:跟window没关系:screen.width/height; - 我们目前学习的都是浏览器应用(网页),并不会去做桌面应用

2.window对象

打开链接的新方式:

1.当前窗口打开,可以后退:

HTML:<a href="url">内容</a>

jsopen("url","_self");

2.当前窗口打开,禁止后退

location.replace("新url");

3.新窗口打开,可以打开多个

HTML:<a href="url" target="_blank">内容</a>
js:open("url","_blank");

4.新窗口打开,只能打开一个

HTML:<a href="url" tanget="自定义一个name">内容</a>
js:open("url","自定义一个name")

学完这块,我们知道了两个点:

1.以后的跳转,任何标签都可以
2.提升用户的体验感
3.a标签的其他用途:	
    1.跳转	
    2.锚点
    3.下载按钮:<a href="xx.exe/rar/zip/7z">下载</a>
    4.打开图片和txt文档:<a href="xx.png/jpg/jpeg/gif/txt">打开图片和txt</a>
    5.直接书写js-不需要绑定点击事件:<a href="javascript:js代码;">打开图片和txt</a>
    

2.打开新窗口/新链接:

newW=open("url","target","width=?,height=?,left=?,top=?");
特殊:
1.如果没有加第三个参数,那么窗口会和浏览器融为一体
2.如果你加了第三个参数,那么窗口会脱离浏览器独立存在
3.关闭窗口:window/newW.close();
4.改变新窗口的大小:newW.resizeTo(新宽,新高);
5.改变新窗口的位置:newW.moveTo(新X,新Y);
6.window提供了三个框:
警告框:alert("警告文字");
输入框:var user=prompt("提示文字");
确认框:var bool=confirm("提示文字");
7.定时器也是window的
8.事件:

    1.window.onload事件 - load - 加载:等待其他所有的资源加载完毕后才会执行的代码,放在里面的代码其实要最后才会执行

    2.window.onresize事件 - 窗口如果大小发生了变化,就会触发,搭配上判断innerWidth可以理解为是js版本的css媒体查询

    3.window.onscroll事件 - 滚动事件,一旦滚动就会触发
	1、获取滚动条当前的位置:window.scrollY
	2、获取元素距离页面顶部有多远:elem.offsetTop/offsetLeft
9.本地/客户端存储技术:
	cookie:淘汰了,存储的大小只有2kb,而且操作极其麻烦,尤其要到处切割,只能最多保存30天
	webStorage:H5带来了一个新特性,存储的大小有8mb,永久保存,而且非常简单
分类2种:
	1.sessionStorage - 会话级,只要浏览器一旦关闭,数据就会死亡了
	2.localStorage - 本地即,只要你不清空,就会永久存在
两者的用法是一模一样的,不用创建,直接可用
操作:	
1.添加:xxxStorage.属性名="属性值";
2.读取:xxxStorage.属性名;
3.删除:xxxStorage.removeItem("属性名");
4.清空:xxxStorage.clear();