js面试题

本文详细探讨了JavaScript中的核心概念,包括var、let、const的区别,数据类型的判断,强制与隐式类型转换,以及深度比较、数组操作、函数特性、事件处理和前端性能优化等关键知识点。此外,还深入讲解了Map、Set、WeakMap和WeakSet等高级数据结构的差异。通过这些内容,帮助读者深化对JavaScript的理解并提升面试准备。
摘要由CSDN通过智能技术生成


阮一峰es6入门

var 和let const的区别

  • var是ES5 语法,let const 是ES6语法;var 有变量提升(有变量的定义,但没有赋值)
  • var和let 是变量,可修改;const 是常量,不可修改;
  • let const 有块级作用域,var 没有

typeof返回哪些数据类型

  • 值类型:string、number、boolean、undefine、symbol
  • 应用类型·:object array null归于object
  • function

列举强制类型转换和隐式类型转换

  • 强制:parseInt parseFloat toString 等
  • 隐式 : if、逻辑运算、==、+ 拼接字符串

手写深度比较,模拟lodash.isEqual

// 实现如下效果
const obj1 = {
   a: 10, b: {
    x: 100, y: 200 }}
const obj2 = {
   a: 10, b: {
    x: 100, y: 200 }}
isEqual(obj1, obj2) === true
// 遍历值-递归
function isObject() {
   
    return typeof object === 'object' && obj !== null
}
function isEqual(obj1, obj2) {
   
    if(!isObject(obj1) || !isObject(obj2) ) {
   
        // 不是对象则判断两个值类型是否相等
        return obj1 === obj2
    }
    if(obj1 === obj2) {
   
        return true
    }
    // 两个都是对象或者数组,且不相等
    // 1.先取出obj1 和obj2 的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 ) {
   
        // 比较当前的key 的val递归
        const res = isEqual(obj1[key], obj2[key])
        if (!res) {
   
            return false
        }
    }
    return true
}

split()和join()的区别

  • split()字符串以指定符号切割成数组
  • join()数组通过指定符号连接成字符串

数组的 pop push unshift shift 分别做什么

[10,20,30]

  • pop()删除数组的最后一个元素,返回删除的那个元素,改变原数组[10,20]
  • push()往数组末尾添加元素,返回数组的长度,改变原数组[10,20,30,40]
  • shift()删除数组的第一个元素,返回删除的那个元素,改变原数组[20,30]
  • unshift()往数组开头添加元素,返回数组的长度,改变原数组[40,10,20,30]

纯函数

1.不改变原函数 2.返回一个数组

  • concat():arr.concat([50,60,70])
  • map
  • filter
  • slice(): arr.slice(2,3)获取指定位置的数据

非纯函数

  • forEach(): 遍历,可能改变原数组
  • some,evey reduce不改变原数组,不返回一个新数组

slice和splice的区别

(start从零开始数,-1表示倒数第一个的下标)

  • slice:返回新数组,slice(start, end)返回从[start,end)的元素,start为负数表示倒数第几个元素
  • splice:改变原始数组,splice(start, number, item) ,从start这个开始剪切掉number个元素,然后再添加item进去。

[10,20,30].map(parseInt)

返回[10,NaN,NaN]
parseInt()函数用来将字符串转化为整数,第二个参数是转换的进制

  • parseInt第一个参数不是数字或者是负号会返回NaN
  • 是数字则会继续解析第二个参数
  • 如果是0x开头会当作十六进制
  • 如果是0开头,会当作八进制
  • 小数时,会向下取整
var num1 = parseInt("123.45")    //123
var num2 = parseInt("123num")    //123

[10,20,30].map(parseInt) //[10,NaN,NaN] 

[10,20,30].map((item, index) => {
   
    return parseInt(item, index)
})
parseInt(10, 0) === parseInt(10, 10) // 10
parseInt(20, 1) // NaN

ajax请求get 和post的区别

  • get一般用于查询操作,post 一般用户提交操作
  • get 参数拼接在url上,post 放在请求体内(数据体积可更大)
  • 安全性:post 易于防止 CSRF

函数call和apply的区别

fn.call(this, p1,p2)
fn.apply(this, arguments)
穿参数的方式不同

事件代理(委托)是什么

const p1 = document.getElementById('p1')
const body = document.body
bindEvent(p1, 'click', e => {
   
    e.stopPropag
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值