闭包
概念:函数使用了不属于自己的局部变量,这种结构叫闭包(函数套函数,且里面的函数用了外面函数的局部变量)
问题:变量放在全局不安全,容易被篡改
闭包作用:保护变量的/避免全局污染
性能问题:内存泄漏/溢出 作用域中的局部变量一直被使用着,导致该作用域释放不掉
//计数器
function add() {
var n = 0;
/*var fn = functopn(){return n++}*/
function fn() {
return n++;
}
return fn;
}
var c = add();
/*
1.var c = functopn(){return n++}
2.function c(){
return n++
}
*/
console.log(c());
console.log(c());
n = 100;
console.log(c());
console.log(c());
console.log(c());
循环语句
循环:程序反复执行一套相同的代码
循环三要素:
1.循环变量:循环中做判断的量 循环变量一定是向着循环退出的趋势去变化
2.循环条件:保证循环继续运行的条件
3.循环体:循环中每次要做的事
while循环:
/*
while(循环条件){
要做的事
}
*/
var n = 0;
while(n<5){
console.log("循环一次");
n++;
}
for循环 (和while作用相同但比while更优雅)
用途:用作数组遍历
/*
for(var i=0;i<10;i++){
要做的事
}
*/
for(var i=0;i<10;i++){
console.log("循环一次");
}
循环嵌套
/*循环嵌套*/
for(var n=0;n<5;n++){
for(var j=0;j<5;j++){
console.log("循环一次");//输出25次
}
/*九九乘法表*/
for()
数组
数组:多个变量的集合,批量存储多个同类数据,多个数据以逗号隔开
1.数组是没有任何数量限制
2.可以存不同类型的数据(但是在实际项目中没意义)
3.数组中的每一个数据都有一个索引(第一个索引默认为0)
/*
数组的访问:数组名[角标]
数组的更改 :数组名[角标]=新值
数组的属性:length 直接返回数组的长度
空数组: var arr=[];
*/
var arr=[1,2,3,4,5];
console.log(arr[1]);//2
arr[1] = 8;
console.log(arr.length);//5
两个关键字:break continue
break:直接退出循环
continue:跳过当前循环
对象
定义
对象:多个变量的集合 ,用来存储多个数据的 是由多个键值对组成的
1.对象的属性值是不限制数量的
2.对象的属性值是不限制数据类型的
3.对象的属性名一定是字符串,属性名可以省略引号,如果不加,js会自动帮你添加
操作
var car = {name:"benz",type:"g63"}
/*取值:对象.属性名*/
car.name;
/*
改值:对象.属性名=新值
如果本身存在这个属性就是更改,本身如果没有,那就是添加
*/
car.name="bmw";
/*删值:delete 对象.属性*/
delete car.name;
/*对象的属性名如果是变量的话,那么需要加 [ ]*/
var a = "type";
var car = {name:"benz",[a]:"g63"}//a是变量所以加[]
/*
对象的循环:
for(var 变量名 in 要遍历的对象){
变量名代表的是属性
}
*/
for(var key in car){
console.log(key);
}
分类
内置对象
面向对象:通过操作对象去实现需求,不关心其中的过程
面向过程:
内置对象:js中已经存在的,有着现成的属性和方法供我们使用
js中一共26个内置对象
自定义对象:我们自己创建的对象
基本包装类型:为了便于操作“基本类型值”,JS 提供了 三个 特殊的引用类型:Boolean、Number、String。这些类型和其他引用类型相似,但同时 也具备 与各自基本类型相应的特殊行为。 实际上:每当读取一个基本类型值的时候, “后台就会创建一个 对应的基本包装类型的对象”,从能能够调用一些方法来操作这些数据。
String对象(字符串是不容更改的)
stirng属性:
length
stirng方法:
/*
toUpperCase(转大写)
toLowerCase(转小写)
*/
var str="hello";
str=str.toUpperCase();
console.log(str);
/*
substring/slice(截取子字符串) 含头不含尾
如果只给一个参数,代表从哪一位开始截取,截到最后
substring和slice区别:substring截取字符串,slice截取数组
*/
var str="hello";
var a=str.substring(1,2);
console.log(a);//e [含头不含尾]
/*
indexOf(查找关键字) 返回 关键字符的角标
找到就结束 找不到返回-1
*/
var str ="hello"
console.log(str.indexOf("o"));//4
console.log(str.indexOf("l"));//2 默认找第一个,找到就结束
var str ="where are you from";
console.log(str.indexOf("are"));//6 空格也是字符
/*
split(切割符) 可以把字符串切割成数组
把字符串一切为二,分成两个数组
*/
var str="hello";
var arr=str.split("e")
console.log(arr);//['h','llo']
/*.
toString(转成字符串)(显式类型转换)
number bool 也有toString方法
*/
array对象(数组可以更改)
array属性:
length
array方法:
//不能直接修改原数组的方法
/*
toString(转成字符串)
length
indexOf() 查找关键字
slice()截取子数组
var arr=["h","e","l","l","o"];
var narr=arr.slice(1,3);
console.log(narr);
join(连接符) 把数组连接成字符串 结果一定是字符串
var arr=["h","e","l","l","o"];
var narr=arr.join("");
console.log(narr);
map() 对数组进行处理,返回一个全新的数组
filter()返回一个符合指定条件的数组
*/
//可以直接修改原数组的方法
/*
push()向数组的结尾追加元素
var arr=[1,2,3]
arr.push(4);
unshift()向数组开头追加元素
pop()删除数组最后一位元素
shift()删除数组第一位元素
var arr=[1,2,3]
arr.pop();//返回值是被删除那项
console.log(arr);
splice(从哪一位开始删除,删几个,新值) 在任意位置添加,删除,替换元素
var arr=[1,2,3,4];
arr.splice(1,1);//从第一位开始删,删一个
console.log(arr);
reverse()数组反转
var arr=[1,2,3,4]
arr.reverse();
console.log(arr);
sort()数组排序,按照编码排序
*/
冒泡排序
/*冒泡排序*/
var arr=[12,78,123,9,65,36];
for (var j = 0; j < arr.length-1; j++) {
for (var i = 0; i < arr.length-1-j; i++) {
if (arr[i] > arr[i + 1]) {
var box = arr[i]
arr[i] = arr[i + 1];
arr[i + 1] = box
}
}
}
console.log(arr);
数组去重
var arr=[1,"hello","我",true,12,9,7,9,1,1,1,0,"我",11];
for(var i=0;i<arr.length;i++){
for(var j=i+1;j<arr.length;j++){
if(arr[i]==arr[j]){
arr.splice(j,1);
j--;
}
}
}
console.log(arr);