JS真题
题目一
1. var和let const的区别
答:
-
var是ES5语法,let、const是ES6语法; var有变量提升
-
var和let是变量,可修改; const是常量,不可修改;
-
let、const有块级作用域,var没有
2. typeof返回哪些类型
答:
-
undefined、string、number、boolean、symbol
-
object(注意,typeof null === ‘object’)
-
function
3. 列举强制类型转换和隐式类型转换
答:
-
强制:parseInt、parseFloat、toString等
-
隐式:if、逻辑运算、==、+拼接字符串
题目二
1. 手写深度比较,模拟lodash的isEqual
function isObject(obj){
return typeof obj === 'object' && obj !== null
}
function isEqual(obj1, obj2) {
if(!isObject(obj1) || !isObject(obj2)){
// 值类型
return obj1 === obj2
}
if(obj1 === obj2){
return true
}
// 两个都是对象或者数组,而且不相等
// 1. 先判断keys个数
const obj1Keys = Object.keys(obj1)
const obj2Keys = Object.keys(obj2)
if (obj1Keys.length !== obj2Keys.length) {
return false
}
// 2. 以obj1为基准,和obj2 一次递归比较
for (let key in obj1) {
// 递归比较
const res = isEqual(obj1[key], obj2[key])
if (!res) {
return false
}
}
return true
}
2. split()和join()的区别
答:split是字符串的方法,用来分割字符串为数组,'1-2-3'.split('-') // [1, 2, 3]
join是数组方法,用来拼接数组为字符串,[1, 2, 3].join('-') // '1-2-3'
3. 数组的pop、push、unshift、shift分别做什么
-
pop : 从 数组末尾弹出一个元素,无参,返回弹出的元素,原位操作
-
push : 从数组末尾加入元素,参数是加入的元素,按顺序加入,返回数组长度,原位操作
-
shift : 从数组的开头弹出一个元素,无参,返回弹出的元素,原位操作
-
unshift : 从数组的开头加入元素,参数是加入的元素,按顺序一起加入,返回数组的长度,原位操作
const arr = [10, 20, 30, 40] // pop // const popRes = arr.pop() // console.log(arr, popRes) // [10, 20, 30] 40 // push // const pushRes = arr.push(50, 60) // console.log(arr, pushRes) // [ 10, 20, 30, 40, 50, 60 ] 6 // unshift // const unshiftRes = arr.unshift(-10, -20) // console.log(arr, unshiftRes) // [ -10, -20, 10, 20, 30, 40 ] 6 // shift // const shiftRes = arr.shift() // console.log(arr, shiftRes) // [ 20, 30, 40 ] 10
扩展:数组的API,有哪些纯函数?
纯函数:1. 不改变源数组(没有副作用); 2. 返回一个数组
-
concat
-
map
-
filter
-
slice
// 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(val => val * 10) // console.log(arr, arr2) // [ 10, 20, 30, 40 ] [ 100, 200, 300, 400 ] // filter // const arr3 = arr.filter(val => val > 25) // console.log(arr, arr3) // [ 10, 20, 30, 40 ] [ 30, 40 ] // slice // const arr4 = arr.slice() // console.log(arr, arr4) // [ 10, 20, 30, 40 ] [ 10, 20, 30, 40 ]
非纯函数: push pop shift unshift forEach some every
题目三
1. 数组slice和splice的区别
-
功能区别(slice-切片, splice-剪切)
-
参数和返回值
-
是否纯函数
// slice 纯函数 // const arr4 = arr.slice() // console.log(arr, arr4) // [ 10, 20, 30, 40 ] [ 10, 20, 30, 40 ] // const arr4 = arr.slice(2, 4) // start, end // console.log(arr, arr4) // [ 10, 20, 30, 40 ] [ 30, 40 ] // const arr4 = arr.slice(1) // start // console.log(arr, arr4) // [ 10, 20, 30, 40 ] [ 20, 30, 40 ] // const arr4 = arr.slice(-2) // lastest start // console.log(arr, arr4) // [ 10, 20, 30, 40 ] [ 30, 40 ] // const arr4 = arr.slice(-3, -2) // lastest start, lastest end // console.log(arr, arr4) // [ 10, 20, 30, 40 ] [ 20 ] // splice 非纯函数 // const spliceRes = arr.splice(1, 2, 'a', 'b', 'c') // start, length, // console.log(arr, spliceRes) // [ 10, 'a', 'b', 'c', 40 ] [ 20, 30 ] // const spliceRes = arr.splice(1, 2) // console.log(arr, spliceRes) // [ 10, 40 ] [ 20, 30 ] // const spliceRes = arr.splice(1, 0, 'a', 'b', 'c') // 只增加不剪切 // console.log(arr, spliceRes) // [ 10, 'a', 'b', 'c', 20, 30, 40 ] []
2. [10, 10, 10, 10].map(parseInt) 返回结果是什么
-
map的参数和返回值:参数:数组的每个元素,对应元素下标。返回值:新数组
-
parseInt参数和返回值:参数:待转换的该进制数字,进制。返回值:转换过的十进制数
const res = [10, 10, 10