前端面试题1

浏览器缓存,有何区别?

• localStorage和sessionStorage一样都是用来存储客户端临时信息的对象。他们均只能存储字符串类型的对象
• localStorage生命周期是永久,除非自己清除
• sessionStorage生命周期为当前窗口或标签页,一旦窗口或标签页被永久关闭了,那么所有通过sessionStorage存储的数据也就被清空了。
• LocalStorage 一般不会自动过期(除非用户手动清除),而 SessionStorage 在会话结束时过期(如关闭浏览器)

常用的数组API?

push、pop、unshift、shift、splice、slice、map、reduce、concat、filter、some、forEach、find、findIndex等

  • push() 方法将一个或多个元素添加到数组的末尾,并返回该数组的新长度。
  • unshift() 方法将一个或多个元素添加到数组的开头,并返回该数组的新长度(该方法修改原有数组)。
  • pop()方法从数组中删除最后一个元素,并返回该元素的值。此方法更改数组的长度。
  • shift() 方法从数组中删除第一个元素,并返回该元素的值。此方法更改数组的长度。
  • splice() 方法通过删除或替换现有元素或者原地添加新的元素来修改数组,并以数组形式返回被修改的内容。此方法会改变原数组。
  • slice() 方法返回一个新的数组对象,这一对象是一个由 begin 和 end 决定的原数组的浅拷贝(包括 begin,不包括end)。原始数组不会被改变。
  • map() 方法创建一个新数组,其结果是该数组中的每个元素是调用一次提供的函数后的返回值。
  • concat() 方法用于合并两个或多个数组。此方法不会更改现有数组,而是返回一个新数组。
  • filter() 方法创建一个新数组, 其包含通过所提供函数实现的测试的所有元素,不改变原有数组。
  • some() 方法测试数组中是不是至少有1个元素通过了被提供的函数测试。它返回的是一个Boolean类型的值。
  • forEach() 方法对数组的每个元素执行一次给定的函数。返回值是undefined。

对象API

keys方法,用于遍历对象可枚举属性;create用于创建指定原型的新对象;getPrototypeOf用于获取对象原型;definedProperty用于自定义对象是否可枚举,是否可写等属性。assign用于复制多个源对象属性到目标对象等;
对象的API链接-MDN

  • Object.defineProperty() 方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性,并返回此对象。通过Object.defineProperty()添加的属性值不会被修改
const obj1 = {};
//给obj1对象添加一个propty1的属性,并且值为42
Object.defineProperty(obj1, 'property1', {
  value: 42,
  writable: false
});
//虽然此时修改了property1的值,但是并没有改变
obj1.property1 = 77;
console.log(obj1.property1);
// 打印出来的还是42
  • Object.create()方法创建一个新对象,使用现有的对象来提供新创建的对象的__proto__。
  • Object.keys() 方法会返回一个由一个给定对象的自身可枚举属性组成的数组(就是返回对象的下表组成的数组),数组中属性名的排列顺序和正常循环遍历该对象时返回的顺序一致 。
    作用域和作用域链
    作用域是变量和函数的作用范围与生命周期,当在当前作用域查找某变量时,如果没找到就会去上层作用域找,此行为可以一直找到全局对象window(非严格模式),而这个查找过程也就是所谓的作用域链。

原型与原型链

Prototype原型
我们创建的每个函数都有一个 prototype(原型) 属性,这个属性是一个指针,指向一个对象,而这个对象的用途是包含可以由特定类型的所有实例共享的属性和方法。
简单来说,就是当我们创建一个函数的时候,系统就会自动分配一个 prototype属性,可以用来存储可以让所有实例共享的属性和方法

  • 每一个构造函数都拥有一个 prototype 属性,这个属性指向一个对象,也就是原型对象
  • 原型对象默认拥有一个 constructor 属性,指向指向它的那个构造函数
  • 每个对象都拥有一个隐藏的属性 proto,指向它的原型对象
function Person(){}
var p = new Person();
p.__proto__ === Person.prototype // true
Person.prototype.constructor === Person // true

原型链
JavaScript 中所有的对象都是由它的原型对象继承而来。而原型对象自身也是一个对象,它也有自己的原型对象,这样层层上溯,就形成了一个类似链表的结构,这就是原型链

  • 所有原型链的终点都是 Object 函数的 prototype 属性
  • Objec.prototype 指向的原型对象同样拥有原型,不过它的原型是 null ,而 null 则没有原型
    总结
  • 对象._ proto_ === 构造函数.prototype
  • 一个对象的原型指的是这个对象与其他同类对象的公有属性的集合
  • 一个对象的原型的地址存在这个对象的__proto__属性里
  • 每个对象都有原型,但除了「根对象Object.prototype比较特殊,Object.prototype这个对象的原型为null

闭包

闭包:如果一个函数用到了外部的变量,那么这个函数加这个变量,就叫做闭包
闭包的作用:闭包常常用来‘间接访问一个变量’。换句话说,隐藏一个变量。就是当你需要延长变量的生命周期的时候
优点:

  • 可以避免使用全局变量,防止全局变量污染
    缺点:

  • 会造成内存泄漏(有一块内存空间被长期占用,而不被释放)

      					学习的时光总是短暂,又到了时候说拜拜
      							欢迎关注公众号  oldCode
      								获取新鲜教程资料
    

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值