javascript API

92 阅读9分钟

1、数组的基础

1.1 创建数组

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

第二个方法有一个坑:new Array(num);//这句话的意思是:创建了一个长度为num的空数组,里面没有任何东西,只有无数的undefined

1.2 按值传递

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

传递的如果是引用类型:因为引用类型很大,比原始类型大得多,不可能保存在变量本地,只是保存了一个地址值而已,其实是赋值了自己的地址值给对方,两者用的是同一个地址值,一个修改另一个也会变化

1.3 释放引用类型

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

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

2、hash数组

2.1 创建hash数组(2步)

    ①创建空数组:var arr=[];
    ②为数组添加自定义下标并且赋值:arr["自定义下标"]=新值;

2.2 访问hash数组

    arr["自定义下标"];

2.3 遍历hash数组

遍历hash数组:不能再使用for循环,必须使用for in循环,纯自动化的,专门为了遍历hash数组存在的

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

2.4 hash数组的原理

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

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

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

3、数组的API

3.1 数组转字符串

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

    1.数组里面的内容拼接

    2.将数组拼接为DOM页面元素
    

3.2 数组拼接

    var newArr=arr.concat(新值1,arr1,...)

3.3 截取子数组

    var subArr=arr.slice(starti,endi+1) 

总结:以上三种API不修改原数组

3.4 删插替

3.4.1 删除:

    var dels=arr.splice(starti,n)

3.4.2 插入:

    arr.splice(starti,0,新值,...)

3.4.3 替换:

    var dels=arr.splice(starti,n,新值,...)

3.5 翻转数组(不重要,今后不会用到)

    arr.reverse()     

3.6 数组排序

3.6.1 冒泡排序

    var arr=[31,21,54,4376,69,8,8,65,643,52,3];
    for(var j=1;j<arr.length;j++){
            for(var i=0;i<arr.length-j;i++){
                    if(arr[i]>arr[i+1]){
                            var m=arr[i];
                            arr[i]=arr[i+1];
                            arr[i+1]=m
                    }
            }
    }
    console.log(arr);

3.6.2 arr.sort()

①数字升序排列 arr.sort(function(a,b){ return a-b }) console.log(arr)
②数字降序排列 arr.sort(function(a,b){ return b-a }) console.log(arr)

3.7 栈和队列(添加元素的新方式)

3.7.1 栈(一端封闭,另一端进出)

开头进:arr.unshift(新值,...);//添加元素的新方式,向前添加,缺点:导致其余元素的下标都发生变化
开头出:var first=arr.shift();//删除元素的新方式,向前删除,一次只能删除一个,缺点:导致其余元素的下标都发生变化

结尾进:arr.push(新值,...);//添加元素的新方式,向后添加。
结尾出:var last=arr.pop();//删除元素的新方式,向后删除。

3.7.2 队列(一端进,另一端出)

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

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

注意:ES5还提供了3组6个API(都要用到匿名回调函数,都是在简化我们的for循环操作)

3.8 判断(2个)

1.every(每一个,要求所有元素都满足条件才会为true,只要有一个不满足则为false,非常类似于&&)

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

2.some(有一些,要求只要有一个元素都满足条件会为true,所有元素都不满足则为false,非常类似于||)

var bool=arr.some(function(val,i,arr){
	return 判断条件;
})
    

3.9 遍历(2个)

1.forEach(直接修改原数组)

arr.forEach(function(val,i,arr){
	直接做你想要的操作;
})
    

2.map(不修改原数组,返回一个新数组)

var newArr=arr.map(function(val,i,arr){
	return 直接做你想要的操作;
})
    

3.10 过滤和汇总(2个)

1.过滤

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

2.汇总

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

ES6提供了箭头函数:简化一切匿名回调函数 固定公式:function去掉,()和{}之间添加=>,如果形参只有一个,那么()可以省略,如果函数体只有一句话,那么{}也可以省略,如果函数体只有一句话并且是return,那么return和{}都可以省略

以下是ES5提供的6个API

3.11 判断(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 判断条件;
    })

3.12 遍历(拿到数组中的每个元素做相同 或 相似的操作)

forEach - 直接修改原数组

    arr.forEach(function(val,i,arr){
        直接做你想要的操作;
    })

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

    var newArr=arr.map(function(val,i,arr){
        return 直接做你想要的操作;
    })

3.13 过滤和汇总

过滤:筛选出你需要的部分,但是原数组并不会发生变化

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

汇总:

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

3.14 箭头函数(简化一切匿名回调函数)

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

3.15 二维数组:数组的元素,又引用着另一个数组

3.11.1 创建

    var arr=[[],[],[]...];

3.11.2 访问

    arr[行下标][列下标]

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

3.11.3 遍历(外层循环控制行,内层循环控制列)

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

4、字符串的基础

4.1 string的概念:多个字符组成的【只读】字符【数组】

4.2 字符串与数组的相同点和不同点

相同点:

1、字符串中的个数:str.length;

2、获取字符串中的某个字符:str[i];

3、遍历字符串

4、所有数组不修改原数组的API,字符串也可以使用(concat、slice)

不同点:

所有数组的直接修改原数组的API,字符串都不可以使用,比如排序只有数组可以使用

4.3 大小写转换(将字符串中的每个字符统一的转为大写 或 小写 )

    大写:var upper=str.toUpperCase();
    小写:var upper=str.toLowerCase();

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

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

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

    var ascii=str.charCodeAt(i);

4.6 通过ASCII码转回原文

    var 原文=String.fromCharCode(ascii);

4.7 检索字符串、检查索引、检查下标、获取关键字的下标

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

从starti位置开始,查找右侧第一个关键字的第一个字符的位置,starti可以省略,默认从0位置开始查找

返回值:找到了,返回第一个关键字的第一个字符的下标位置

没找到,返回-1,其实我们根本不关心下标为多少,我们只关心下标为不为-1

作用:判断有没有!

强调:数组也能使用此方法,数组这个方法是后期才添加上的,原本此方法只有字符串可用,比如老IE的数组就没此方法。

4.8 拼接字符串

    var newStr=str.concat("新字符串",...)

4.9 截取字符串(3个)

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

4.10 替换字符串

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

4.11 切割/分割/分隔字符串

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

注意:

1、切割后,切割符就不存在了

2、如果你的切割符写的是"",切散每一个字符

3.切割后,字符串将转为数组

4.12 去掉空白字符

    str.trim/trimStart/trimEnd()

扩展:js如何创建元素 1、创建空标签

    var elem=document.createElement("标签名");

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

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

3、挂载上树/渲染页面

    父元素.appendChild(elem);

5、Math对象基础(专门提供了数学计算的API,不需要创建,直接使用)

5.1 取整(3种)

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

    var num=Math.ceil(num);//小数位数不能超过15位,否则此方法只能取整,不能上取整

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

    var num=Math.floor(num);

3、四舍五入取整:

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

5.2 乘方和开方

5.2.1 乘方:Math.pow(底数,幂); -> 更简化:底数**幂

5.2.2 开方:Math.sqrt(num); - 仅仅只能开平方

5.3 最大值和最小值

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

问题:本身不支持数组参数

解决:固定用法:Math.max/min.apply(Math,arr);//apply具有打散数组的功能

5.4 绝对值:把负数转为正数

    Math.abs(-1);//1

5.5 随机数

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

搭配上parseInt,只能取到0,但是不可能取到1,意味着取不到最大值

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

强调:只要以后网页中某一块有随机的功能,他的底层一定用到了随机数

6、Date对象基础(日期对象,提供了操作日期和时间的API)

6.1 创建方式(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);

6.2 使用方式(2类)

1、两个日期对象之间,可以相减(大-小),得到一个毫秒差,换算出自己想要的任何一部分 - 日期的本质其实就是保存了一个毫秒数 - 做倒计时的关键

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(); 具有兼容性问题,我们一般会选择自己创建一个格式化方法来格式日期

6.3 定时器

1、周期性定时器(每过一段时间就会执行一次,先等后做)

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

停止:clearInterval(timer);

2、一次性定时器(等待一段时间,只会做一次就结束了)

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

停止:clearTimeout(timer);

同步技术:定时器是我们第一次见到的异步技术:无论我这一块代码多么的耗时,也不会卡住后续代码

7、BOM:Browser Object Model - 浏览器对象模型

7.1 获取浏览器的完整大小

    outerWidth/outerHeight

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

    innerWidth/innerHeight

7.3 获取屏幕的完整大小

    screen.width/height

7.4 打开链接的新方式

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

    HTML:<a href="url">内容</a>
    JSopen("url","_self");

2、当前窗口打开,禁止后退:使用场景:比如电商网站,结账后不允许后退

history:当前【窗口的历史记录】,他其实可以做的事儿就是前进后退

location:当前【窗口正在打开的url】,有一个API

    location.replace("新url");//叫做替换,不叫做跳转,不会产生历史记录,自然也不能后退了,但是网址替换了,网页必然会发生变化

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

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

4、新窗口打开,只能打开一个:使用场景:比如电商网站,只允许用户打开一个结账页面

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

7.5 a标签的其他用途

1 下载按钮

    <a href="xx.exe/rar/zip/7z">下载</a>

2 打开图片和txt文档

    <a href="xx.png/jpg/jpeg/gif/txt">打开图片和txt</a>

3 直接书写js-不需要绑定点击事件

    <a href="javascript:js代码;">打开图片和txt</a>
			       

7.6 打开新窗口/新链接

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

特殊

1、如果没有加第三个参数,那么窗口会和浏览器融为一体

2、如果你加了第三个参数,那么窗口会脱离浏览器独立存在

7.7 关闭窗口

    window/newW.close();

7.8 改变新窗口的大小

    newW.resizeTo(新宽,新高);

7.9 改变新窗口的位置

    newW.moveTo(新X,新Y);

7.10 window提供了三个框

警告框

    alert("警告文字");

输入框

    var user=prompt("提示文字");

确认框

    var bool=confirm("提示文字");