1-数组中的其他函数
// 对数组进行遍历
var arr = [1, 2, 3, 4, 5]
// forEach each: 每一个。需要传递函数进去
arr.forEach(function(item) {
// console.log(item)
})
// filter
// 我要过滤出来数组中大于5的数值 即选出大于5的数
var arr1 = [23, 2, 1, 56, 6, 10]
var arr2 = arr1.filter(function(item, index) {
// item代表新数组
// index代表索引下标
// console.log(index)
return item > 5
})
console.log(arr2)
// some 找到数值为1的,返回true false 查找这个值是否存在于数组中!!!
var arr3 = [6, 1, 3, 4, 10, 20]
var arr4 = arr3.some(function(item, index) {
return item == 1
})
console.log(arr4)
// every 每一个
var arr5 = [10, 20 , 30 , 33, 22, 355, 11]
// 判断所有的值大等于10 所有数据大于等于10, 则返回true,有一个不满足条件就返回false
var res = arr5.every(function(item, index) {
return item >= 10;
})
console.log(res)
</script>
2-字符串中的函数
1.trim
<script>
var input = " asdfasdf asdf as asd sd "
// 去掉头和尾部空格
var str = input.trim();
console.log(str)
</script>
3-对象
<script>
var obj = {
id: 1,
name:"zhangsan",
age: 20
}
// for in
var arr = Object.keys(obj)
// 利用数组遍历对象
console.log(arr)
arr.forEach(function(item) {
console.log(obj[item])
})
</script>
4-严格模式状态
<script>
'use strict';
// 下面的代码会处于严格模式状态
var num = 10
console.log(num)
// 2.不能随便删除变量
// delete num // window.num
// 3.this指向undefined
function demo() {
console.log(this) // 在严格模式下 是undefined
}
demo()
// 4. 构造函数需要使用new
function Person(sex) {
this.sex = sex
}
var p1 = new Person("man")
// 5. setTimeout
setTimeout(function() {
console.log(this) // 在定时器中this还是指向window
})
//6. 名字不能重复
function demo(a, a) {
console.log(a - a)
}
</script>
5-高阶函数
<script>
// 高阶函 以函数作为参数或者以函数作为返回值。则就是高阶函数!!!
function demo() {
// setTimeout(function() {
// fn()
// }, 2000)
return function() {
console.log("111")
}
}
// demo函数称为高阶函数!!!
var f1 = demo();
</script>
6-闭包
<script>
// 闭包的三个特点
// 1.函数嵌套函数
// 2.内部函数使用了外部函数的变量或者参数!!!
// 3.导致使用的变量或者参数不会被直接被释放!!!!
// 就形成了闭包!!!
function fn1() {
var num = 10;
return function() {
console.log(num)
}
}
var fn2 = fn1()
fn2()
fn2();
</script>
案例:
<body>
<ul>
<li>1</li>
<li>2</li>
<li>3</li>
<li>4</li>
<li>5</li>
</ul>
<script>
// 点击相应li,打印出来索引值,并且打印li里面的内容!!!
1, 一般写法
var liList = document.querySelectorAll("li")
for(var i = 0; i < liList.length; i++) {
// liList[i].index = i;
liList[i].onclick = function() {
// 点击的时候for循环早已经执行完毕了!!!
// console.log(i) // 5
// console.log(this.index)
}
}
2, 使用闭包的方法
for(var i = 0; i < liList.length; i++) {
onclick 这个属性需要的是一个函数
每当onclick被赋值一次,就会保存一个i值!!!
liList[i].onclick = (function(i) {
return function() {
console.log(i)
}
})(i)
}
3, 这也是一种闭包
liList.forEach(function(item, key) {
item.onclick = function() {
console.log(key)
}
})
</script>
</body>
7- 递归函数
<script>
// 递归函数: 函数内部调用自己,这个函数就是递归!!!
var count = 0
function fn() {
count++;
if(count >=20) {
return;
}
fn()
}
fn();
console.log(count)
</script>
案例:阶乘
<script>
// 20 20! 20 * 19 * 18....1
function fn(num) {
if(num == 1) {
return 1
}
return num * fn(num - 1)
}
// fn(20) = 20 * 19 * 18 * ....1;
console.log(fn(3))
</script>
8-浅拷贝
<script>
var arr1 = [1, 2, 3, 4]
var arr2 = arr1; // 赋予的是一个地址
arr2[0] = 100;
console.log(arr1[0]) // 100 这里arr1[0]也发生了改变
</script>
9-深拷贝
<script>
// 在js中对象和数组、函数存在于堆内存中,所以arr1和arr2指的是同一个数组
// 字面量存在于栈中 ,各自的不一样
// 深度拷贝1 使arr1不发生改变
var arr1 = [1, 2, 3, 4, 5]
var arr2 = []
for(var i = 0; i < arr1.length; i++) {
arr2.push(arr1[i])
}
// console.log(arr2)
arr2[0] = 100;
// console.log(arr1)
// console.log(arr2)
// 深拷贝2
var str = arr1.join(",")
var arr3 = str.split(",")
// console.log(arr3)
// 深度拷贝3
var arr4 = [1, 2, 3, 4, 5]
var str = JSON.stringify(arr4) // 这是一个字符串
var arr5 = JSON.parse(str)
// JSON.parse(JSON.stringify(arr4))
arr5[0] = 100;
console.log(arr4)
console.log(arr5)
</script>