js面试基础

1、let const var 相关
var ——ES5 变量声明方式

 在变量未赋值时,变量undefined(为使用声明变量时也为undefined)
 作用域:var的作用域为方法作用域;只要在方法内定义了,整个方法内的定义变量后的代码都可以使用

let——ES6变量声明方式

  在变量为声明前直接使用会报错
  作用域——let为块作用域——通常let比var 范围要小
  let禁止重复声明变量,否则会报错;var可以重复声明

const——ES6变量声明方式
1. const为常量声明方式;声明变量时必须初始化,在后面出现的代码中不能再修改该常量的值
2. const实际上保证的,并不是变量的值不得改动,而是变量指向的那个内存地址不得改动

2、js数据类型,区别
基本数据类型:
Number,String,Boolean,null,undefined,symbol,bigint(后两个为ES6新增)
引用数据类型:
object,function(proto Function.prototype)
object:普通对象,数组对象,正则对象,日期对象,Math数学函数对象。
两种数据存储方式:
基本数据类型是直接存储在栈中的简单数据段,占据空间小、大小固定,属于被频繁使用的数据。栈是存储基 本类型值和执行代码的空间。
引用数据类型是存储在堆内存中,占据空间大、大小不固定。引用数据类型在栈中存储了指针,该指针指向堆 中该实体的起始地址,当解释器寻找引用值时,会检索其在栈中的地址,取得地址后从堆中获得实体。
两种数据类型的区别:
堆比栈空间大,栈比堆运行速度快。
堆内存是无序存储,可以根据引用直接获取。
基础数据类型比较稳定,而且相对来说占用的内存小。
引用数据类型大小是动态的,而且是无限的。
3、Object.assign的理解
作用: Object.assign可以实现对象的合并
语法:

Object.assign(target, ...sources)

解析:

Object.assign会将source里面的可枚举属性复制到target,如果和target的已有属性重名,则会覆盖。
后续的source会覆盖前面的source的同名属性。
Object.assign复制的是属性值,如果属性值是一个引用类型,那么复制的其实是引用地址,就会存在引用共享的问题。
4、constructor的理解
参考答案:

创建的每个函数都有一个prototype(原型)对象,这个属性是一个指针,指向一个对象。在默认情况下,所有原型对象都会自动获得一个constructor(构造函数)属性,这个属性是一个指向prototype属性所在函数的指针。当调用构造函数创建一个新实例后,该实例的内部将包含一个指针(继承自构造函数的prototype),指向构造函数的原型对象。注意当将构造函数的prototype设置为等于一个以对象字面量形式创建的新对象时,constructor属性不再指向该构造函数。

5、map 和 forEach 的区别
相同点:

都是循环遍历数组中的每一项
每次执行匿名函数都支持三个参数,参数分别为item(当前每一项),index(索引值),arr(原数组)
匿名函数中的this都是指向window
只能遍历数组
不同点:

map()会分配内存空间存储新数组并返回,forEach()不会返回数据
forEach()允许callback更改原始数组的元素。map()返回新的数组。
6、 for of 可以遍历哪些对象
for...of:它是es6新增的一个遍历方法,但只限于迭代器(iterator), 所以普通的对象用for..of遍历是会报错的。

可迭代的对象:包括Array, Map, Set, String, TypedArray, arguments对象等等

7、变量提升
概念: 作用域就是一个独立的地盘,让变量不会外泄、暴露出去。也就是说作用域最大的用处就是隔离变量,不同作用域下同名变量不会有冲突。

ES6 之前 JavaScript 没有块级作用域,只有全局作用域和函数作用域。ES6 的到来,为我们提供了‘块级作用域’,可通过新增命令 let 和 const 来体现。

var ——ES5 变量声明方式

在变量未赋值时,变量undefined(为使用声明变量时也为undefined)
作用域——var的作用域为方法作用域;只要在方法内定义了,整个方法内的定义变量后的代码都可以使用
let——ES6变量声明方式

在变量为声明前直接使用会报错
作用域——let为块作用域——通常 let 比 var 范围要小
let禁止重复声明变量,否则会报错;var可以重复声明
const——ES6变量声明方式

const为常量声明方式;声明变量时必须初始化,在后面出现的代码中不能再修改该常量的值
const实际上保证的,并不是变量的值不得改动,而是变量指向的那个内存地址不得改动
8、 null 和 undefined 的区别,如何让一个属性变为null
undefined 表示一个变量自然的、最原始的状态值,而 null 则表示一个变量被人为的设置为空对象,而不是原始状态。所以,在实际使用过程中,为了保证变量所代表的语义,不要对一个变量显式的赋值 undefined,当需要释放一个对象时,直接赋值为 null 即可。

9、 介绍下 Set、Map、WeakSet 和 WeakMap 的区别?
Set

成员不能重复;
只有键值,没有键名,有点类似数组;
可以遍历,方法有add、delete、has
WeakSet

成员都是对象(引用);
成员都是弱引用,随时可以消失(不计入垃圾回收机制)。可以用来保存 DOM 节点,不容易造成内存泄露;
不能遍历,方法有add、delete、has;
Map

本质上是键值对的集合,类似集合;
可以遍历,方法很多,可以跟各种数据格式转换
WeakMap

只接收对象为键名(null 除外),不接受其他类型的值作为键名;
键名指向的对象,不计入垃圾回收机制;
不能遍历,方法同get、set、has、delete;
10、 简单说说 js 中有哪几种内存泄露的情况
意外的全局变量;
闭包;
未被清空的定时器;
未被销毁的事件监听;
 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值