Javascript面试题

本文详细探讨了JavaScript的各个方面,包括其组成部分(ECMAScript、DOM、BOM),内置对象,数组操作,数据类型检测,闭包的定义及特点,前端内存泄漏的理解,事件委托的概念,基本数据类型与引用数据类型的区别,原型链的工作原理,new操作符的作用,继承方式,JS设计原则,this指向问题,script标签的async和defer属性,setTimeout的执行时间,ES6与ES5的区别及其新特性,call、apply、bind的差异,递归使用注意事项,深拷贝实现方法,事件循环机制,Ajax的基本概念及实现,GET和POST请求的区别,Promise的内部原理及其优缺点,async/await的使用对比,浏览器存储方式,以及安全相关的token处理,页面渲染过程,DOM树与渲染树的差异,精灵图与Base64的区别,SVG的了解,JWT的身份验证流程,以及浏览器缓存策略和同源策略的解释。文章旨在帮助开发者全面掌握JavaScript相关面试知识点。
摘要由CSDN通过智能技术生成

JS由哪三部分组成?

ECMAScript:js核心内容,描述了语言的基础语法,比如var,for,数据类型(数组、字符串)

文档对象模型(DOM):DOM把整个HTML页面规划为元素构成的文档,

浏览器对象模型(BOM):对浏览器窗口进行访问和操作

JS有哪些内置对象?

String Boolean number array object function math date RegExp正则...

Math

abs() sqrt() max() min()

Data

new Data() getYear()

Array

String

concat()

concat() 方法用于连接两个或多个数组。

该方法不会改变现有的数组,而是返回一个新的数组。

length() slice()不会改变原有数组 split()

操作数组的方法有哪些?

push() pop() splice() unshift() shift() reverse() concat() join() map() filter()

every() some() reduce() isArray() findIndex()

哪些会改变原数组?

push() pop() unshift() shift() sort() reverse() splice()

JS对数据类的检测方式有哪些?

typeof()

instanceof()

constructor()

Object.prototype.toString.call()

// typeof() 对于基本数据类型没问题,遇到引用数据类型就不管用了
      console.log( typeof 666) //number
      console.log(typeof[1,2,3]) //object
    // instanceof() 只能判断引用数据类型,不能判断基本数据类型
      console.log([] instanceof Array) //true
      console.log('abc' instanceof String) //false
    // constructor() 几乎可以判断基本数据类型和引用数据类型;如果声明了一个构造函数,并把它的原型指向了Array
      console.log(('abc').constructor === String) //true
    // Object.prototype.toString.call()  完美解决方案
      var opt = Object.prototype.toString
      console.log(opt.call(2))
      console.log(opt.call(true))
      console.log(opt.call('aaa'))
      console.log(opt.call([]))
      console.log(opt.call({}))

说一下闭包,闭包有什么特点?

什么是闭包?函数嵌套函数,内部函数被外部函数返回并保存下来时,就会产生闭包

特点:可以重复利用变量,并且这个变量不会污染全局的一种机制;这个变量是一直保存在内存中,不会被垃圾回收机制回收。

缺点:闭包较多时候,会消耗内存,导致页面的性能下降,在IE浏览器中才会导致内存泄漏

使用场景:防抖、节流,函数嵌套避免全局污染的时候

function fn(a) {
      return function(){
        console.log(a)
      }
    }
    var fo = fn(2)
    fo()

前端内存泄漏怎么理解?

JS里已经分配内存地址的对象,但是由于长时间没有释放或者没办法清楚,造成长期占用内存的现象,会让内存资源大幅下降,最终导致运行速度慢,甚至崩溃的情况。

垃圾回收机制

因素:一些为生命周期赋值的变量,一些未清空的定时器,过度的闭包,一些引用元素没有被清除。

事件委托(事件代理)是什么?

又叫事件代理,原理就是利用了事件冒泡的机制来实现,也就是说把子元素的事件绑定到了父元素的身上,如果子元素阻止了事件冒泡,那么委托也就不成立。

阻止事件冒泡:event.stopPropagation()

addEventListener('click',函数名,true/false) 默认是false(事件冒泡),true(事件捕获)

好处:提高性能,减少了事件的绑定,也就减少了内存的占用。

基本数据类型和引用数据类型的区别?

基本数据类型 :String Number Boolean undefinded null

基本数据类型保存在栈内存当中,保存的就是一个具体的值。

引用数据类型(复杂数据类型)Object Function Array

保存在堆内存当中,声明一个引用类型的变量的时候,保存的是引用数据类型的地址

假如声明两个引用数据类型同时指向了一个地址的时候,修改其中一个那么另外一个也会改变

var obj = {
      name:'张三',
      age:18
    }
    var obj1 = obj
    obj1.name = '李四'
    console.log(obj) 
    console.log(obj1)
    console.log(obj == obj1) //true

说一下原型链

原型就是一个普通对象,它是为构造函数的实例共享属性和方法:所有实例中引用的原型都是同一个对象

使用prototype方法可以把方法挂在原型上,内存只保存一份

__proto__可以理解为指针,实例对象中的属性,指向了构造函数的原型(prototype)

一个实例对象在调用属性和方法的时候,会依次从实例本身、构造函数原型、原型的原型上去查找

这样的查找线程像是一个链条

function Person(){
    this.say = function(){
        console.log('唱歌')
    }
}
var p1 = new Person()
var p2 = new Person()
p1.say() // 唱歌
p2.say() // 唱歌
// 虽然打印出来的一样但是用了两个内存,为了解决这个问题js发明了原型,这样只要存一份即可,剩下所有的实例都可以共享它

function Person(){
    this.say = function(){
        console.log('唱歌')
    }
}
Person.prototype.look = function(){
    console.log('西游记')
}
var p1 = new Person()
var p2 = new Person()
p1.look() // 西游记
p2.look() // 西游记


function Person(){
   
}
Person.prototype.look = function(){
    console.log('西游记')
}
var p1 = new Person()
var p2 = new Person()
console.log(p1.__proto__ ===Person.prototype)  //true

new操作符具体做了什么?

  1. 先创建一个空对象

  1. 把空对象和构造函数通过原型链进行链接

  1. 把构造函数的this绑定到新的空对象身上

  1. 根据构造函数返回的类型判断,如果是值类型,则返回对象,如果是引用类型,就要返回这个引用类型

  2. </
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值