js第二周

126 阅读5分钟

数组的基础

创建数组

  • 直接量: var arr=[值1,...];
  • 构造函数: var arr=new Array(值1,...);

浅拷贝:如果传递的是原始类型,其实就是复制了一个副本给对方,两者互不影响

hash(关联)数组

下标可以自定义

创建

1、先创建空数组: var arr=[];

2、为数组添加自定义下标并且赋值: arr["自定义下标"]=新值;

访问

arr["自定义下标"];

强调

hash数组的length会失效,永远为0

遍历hash数组,不能再使用for 循环,必须使用for in 循环,不需要设置开始和结束,纯自动化,专门为了遍历hash数组而存在。

语法

for (var i in arr){
i->下标
arr[i]->当前次元素;
}

hash数组的原理

hash算法:将字符串,计算出一个尽量不重复的数字(地址值) 字符串内容相同,则计算出来的数字也一定相同

添加元素:js解释器会将自定义下标交给hash算法,得到一个数字(地址值),直接将你要保存的数据放到此地址之中保存

获取元素:js解释器会将指定的下标再次交给hash算法,得到了一个和当初保存时完全一样的数字(地址值),通过此地址值就可以找到你当初保存的数据了,取出来使用了

数组API

数组转字符串

arr to str

var str=arr.join("自定义链接符");

join方法用于把数组中所有元素放入一个字符串。

固定套路 2个

1、单词无缝拼接

  var arr=["h","e","l","l","o"," ","w","o","r","l","d"];
  console.log(arr.join(""));
  

2、将数组拼接成DOM页面元素(数据渲染页面)

var arr=["-请选择-","重庆","北京""成都","贵州","湖南"];
var str="<option>"+arr.join("<option></option>")+"</option>";
sel1.innerHTML=str;

拼接数组:添加元素的新方式

语法: var newArr=arr.concat(新值1,arr1,。。);

截取子数组

语法: var subArr=arr.slice(starti ,endi);

特殊:

  • 不会修改原数组,只会返回一个新数组;
  • 含头不含尾;
  • 支持负数参数,-1代表倒数第一个;
  • endi可以省略不写,如果不写,则从starti截取到末尾
  • (深拷贝)starti和endi都可以省略不写,那么从头到尾完整的赋值一份,两者不会相互影响

以上三个数组API都是不修改原数组,只会返回一个新数组

以下所有API都会直接修改原数组

删插替

删除:var dels=arr.splice(starti,n);//n代表删除几个

插入:var dels=arr.splice(starti,0,新值1,...);

替换: var dels=arr.splice(starti,n,新值1,...);

翻转数组

语法:arr.reverse();

数组的排序

语法: arr.sort(); 默认:将数组中的元素转为字符串,然后再按位pk每一个字符的unicode号(ascii码);

匿名回调函数

arr.sort(function(a,b){
return a-b;//数组升序排列
return b-a;//数组降序排列
})

栈和队列

栈:其实就是数组,只不过是一端封闭,只能从另一端进出

开头进: arr.unshift(新值1,...);//向前添加,导致其他元素下标都会改变

开头出: var first=arr.shift();//向前删除

结尾进: arr.push(新值1,..);//添加元素的新方式

结尾出: var last=arr.pop();//删除元素的新方式

队列:其实就是数组,只不过只能从一端浸入,从另一端出去

开头进: arr.unshift(新值1,...);//向前添加,导致其他元素下标都会改变

结尾出: var last=arr.pop();//删除元素的新方式,一次只能删除一个,返回的是删除那个元素

结尾进: arr.push(新值1,。。。); //添加元素的新方式,向后添加

开头出: var first=arr.shift();//删除元素的新方式,向前删除,一次只能删除一个,有返回值,返回的是删除的值,缺点:导致其他元素下标都会发生改变。

ES5(2014年)为数组提供了3组6个API:

判断:2个;判断的结果一定是一个布尔值

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

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

some:有一些,只要有一个元素满足,则为ttrue,全部不满足则为flase;非常类似于||;

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

遍历

拿到数组中的每一个元做相同或相似的操作

forEach //直接修改原数组

arr.forEach(function(var,i,arr){
    操作;
})

map //不修改原数组,返回一个新数组

var newArr=arr.map(function(var,i,arr){
    return 操作;
})

过滤和汇总

过滤:

var subArr=arr.filter(function(var,i,arr){
    return 判断条件;
})

汇总

var sum=arr.reduce(function(prev,val,i,arr){
    return prev+val;
})

以上6个API都是为了简化for循环

ES6箭头函数 、、专门简化一切的匿名函数

公式:function去掉,()和{}之间添加一个=>,如果形参只有一个,那么()可以省略,如果函数体只有一句话,那么{}可以省略,如果函数体只有一句话并且是return,那么return和{}一起省略;

二维数组

创建: var=[ [],[],[],[] ]

访问:arr[行下标][列下标];

遍历二维数组:

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

String 字符串

概念:多个字符组成的字符数组;

String API

转义字符: \

包含特殊功能的符号:

换行
制表符: \t

输出unicode编码的字符

大小写转换

语法: var 大写=str.toUpporCase();

var 小写=str.toLowerCase();

获取字符串中指定位置的字符

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

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

var ascii=str.charCodeAt(i);

通过ASCII码转回原文:

var 原文=string.fromCharCode(ascii);

检索字符串

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

拼接字符串

var newStr=str.concat(新字符串,...)===还不如+运算符

截取字符串

var newStr=str/arr.slice(starti,endi+1);//和数组的用法一模一样 str.substring(starti,endi+1);//几乎和slice一样,但是不支持负数参数 str.substr(starti,n);//n代表截取的个数,不必考虑含头不含尾

替换字符串

var newStr=str.replace("固定关键字"/RegExp,"新内容")

去掉开头结尾的空白字符

str.trim();

str.trimStart();

str.trimEnd();

切割/分割字符串

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

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

取整 :3种

1、上取整:超过一点点,就会取下一个整数

Math.ceil(num);//小数点位数不能超过15位,否则会失效

2、下取整:无论超过多少,都会省略小数点部分

Math.floor(num);

3、四舍五入取整:

Math.round(num);//只看第一位小数

乘方和开方

乘方:Math.pow(底数,幂)

开方:Math.sqrt(num);//只能开平方

最大值和最小值

var max/min= Math.max/min(a,b,d,c,e...........); //自动在你传入的数字中找到最大值或最小值

绝对值:把负数变成整数

Math.abs(num)

随机数

Math.random(); - 在0~1之间取一个随机小数

公式:parseInt(Math.random()*(max-min+1)+min);

Date 对象:日期对象

创建:4种

1、创建当前时间: var now=new Date();

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

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

4、复制一个日期:var end=new Date(start);

##秒秒PI 年 月 日 星期:FullYear Month Date Day

时 分 秒 毫秒:Hours Minutes Seconds Miiliseconds

每一个分类都有一对儿getXXX/setXXX

其中getXXX负责获取一个分量的值

其中setXXX负责设置一个分量的值

定时器

周期定时器

开启:timer=setInterval(callback,间隔毫秒数);

停止:clearInterval(timer);

一次性定时器

开启:timer=setTimeout(callback,间隔毫秒数);

停止:clearTimeout(timer);

扩展:如何使用JS创建页面元素:3步 - 深入数据渲染

1、创建空标签:var elem=document.createElement("标签名");

2、为其设置必要的属性和事件:

elem.属性名="属性值"; elem.on事件名=function(){}

3、渲染到DOM树-上树

父元素.appendChild(elem);

BOM 浏览器对象模型

获取浏览器的文档显示区域的大小

innerWidth/innerHeight;

打开链接的新方式

当前窗口打开,可以后退

HTML:< a href="">内容

JS:open("url","_self");

当前窗口打开,禁止后退

history:当前窗口的历史记录

location.replace("新url");//叫做替换,不叫作跳转

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

HTML:< a href="" target="_blank">内容

JS:open("url","_blank");

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

HTML:< a href="" target="自定义name">内容

JS:open("url","自定义name");

打开新窗口/新链接

var newW=open("url","target","width=?,height=?,left=?,top=?");

window的专属事件

1、window.onload - load:加载

2、window.onresize - 创建如果大小发生了变化,就会触发

3、window.onscroll - 滚动事件,一旦滚动就会触发

本地/客户端存储技术

cookie:淘汰了,存储大小只有2kb,只有30天

webStorage:存储大小有8mb,永久保存

操作:

1、添加:xxxStorage.属性名="属性值";

2、读取:xxxStorage.属性名;

3、删除:xxxStorage.removeItem("属性名");

4、清空:xxxStorage.clear();