js定义函数的方式(两种)
函数的声明(函数的声明存在函数提升,意思就是在函数声明可以放在调用他的语句之后)
add(1,2) //弹窗显示:3
function add(x,y){
alert(x+y)
}
函数表达式(先创建一个匿名函数,然后通过变量赋值,我们知道js中要想使用一个变量必须先给它赋值,函数也不例外,所以在调用前必须赋值,函数的表达式不存在函数提升)
add() //会报错
var add= function(arg0, arg1, arg2) {
//函数体
}
add(1,2,3)
常用哪几种判断js数据类型的方式
typeof 可以判断j数据类型(“undefined”,“number”,“string”,“symbol”,“boolean”)
判断null时为Obeject,判断数据和object时皆为Object
instanceof用于判断(object,function,Array,Date)
[1,2,3] instanceof Array //true
什么是闭包
闭包就是指的是能调用其他函数内部变量的函数
常见的闭包
function foo(a) {
setTimeout(function timer(){
console.log(a)
}, 1000)
}
foo(2);
循环和闭包
for(var i = 0; i < 5; i++) {
setTimeout(() => {
console.log(i);
}, i * 1000);
}
分别输出5,5,5,5,5 为什么? 这属于延迟函数 延迟函数的回调会在循环结束时才会执行 当i等于5时条件不在满足 跳出循环 才开始执行settimeout 所以此时的i是等于5的
JS几种数据类型转换
转字符串
toString() null和undefined不可以
var a= true
console.log(a.toString())
string()方法都可以
console.log(string(null))
转数字
Number()//可以把任何值转换为数值,只要字符串中一个不为数字返回都为NaN
console.log(Number(" 12111 "))
console.log(Number("154554qwqe")) //NaN
parseInt()//如果字符串第一个是数字就会开始解析,直到遇到不是数字结束,一开始就不是数字则返回NAN
console.log(parseInt("154654a")) //154654
console.log(parseInt("a12131321")) //nan
parseFloat(): parseFloat()把字符串转换成浮点数,parseFloat()和parseInt非常相似,不同之处在与parseFloat会解析第一个. 遇到第二个.或者非数字结束如果解析的内容里只有整数,解析成整数。
数组常用的方法
一、split() 和 join() 的区别
'1-2-3'.split('-') // [1, 2, 3]
[1, 2, 3].join('-') // 1-2-3
二、数组的 pop push unshift shift 分别是什么?
const arr = [10, 20, 30, 40]
// pop:删除数组最后一个
const popRes = arr.pop()
console.log(popRes, arr) // 40 [10, 20, 30]
// push:数组末尾添加
const pushRes = arr.push(50)
console.log(pushRes, arr) // 5 [10, 20, 30, 40, 50]
// unshift:数组头部添加一个或者多个元素
const unshiftRes = arr.unshift(5)
console.log(unshiftRes, arr) // 5 [5, 10, 20, 30, 40]
// shift:删除数组头部第一个元素
const shiftRes = arr.shift()
console.log(shiftRes, arr) // 10 [20, 30, 40]
三、slice 与 splice 有何不同
slice 和 splice 都可以截取数组,不同的是 slice 不会改变原数组,而 splice 会改变原数组。
const arr = [10, 20, 30, 40, 50]
// slice:截取数组
const arr1 = arr.slice() // [10, 20, 30, 40, 50]
const arr2 = arr.slice(1, 4) // [20, 30, 40]
const arr3 = arr.slice(2) // [20, 30, 40, 50]
const arr4 = arr.slice(-2) // [40, 50]
// splice:插入,删除替换数组
const spliceRes = arr.splice(1, 2, 'a', 'b', 'c') // [20, 30] [10, "a", "b", "c", 40, 50]
const spliceRes1 = arr.splice(1, 2) // [20, 30] [10, 40, 50]
const spliceRes2 = arr.splice(1, 0, 'a', 'b', 'c') // [] [10, "a", "b", "c", 20, 30, 40, 50]
console.log(spliceRes, arr)
四、数组遍历
const arr = [10, 20, 30, 40]
// concat
const arr1 = arr.concat([50, 60, 70])
console.log(arr, arr1) // [10, 20, 30, 40] [10, 20, 30, 40, 50, 60, 70]
// map
const arr2 = arr.map(num => num * 10)
console.log(arr, arr2) // [10, 20, 30, 40] [100, 200, 300, 400]
// filter
const arr3 = arr.filter(num => num > 25)
console.log(arr, arr3) // [10, 20, 30, 40] [30, 40]
// slice
const arr4= arr.slice()
console.log(arr, arr3) // [10, 20, 30, 40] [10, 20, 30, 40]
可以看出来,数组的 API:concat、map、filter、slice 不会改变原数组,且返回一个数组,被称为纯函数。
非纯函数: pop push shift unshift forEach some every reduce
五、数组内容反转
var arr = [1,2,3];
var arr1 = arr.reverse();
console.log(arr, arr1); // [3, 2, 1] [3, 2, 1]
六、数组排序
var arrs = [1,3,5,2,4];
arrs.sort();
console.log(arrs); // [1, 2, 3, 4, 5]
// 排序里面可以添加函数,来决定排序的前后
arrs.sort(function (a,b){
return a - b;
});
console.log(arrs); // [1, 2, 3, 4, 5]
补充:
const res = [10, 20, 30].map(parseInt)
console.log(res) // [10, NaN, NaN]
相当于:
[10, 20, 30].map((num, index) => {
return parseInt(num, index)
})