字节网上面经整理(100道面试题)一篇

为了准备面试,看了很多字节面经,整理出来,方便复习,答案一部分是自己看完网上的知识理解的,一部分是网上摘过来的。
1、let map={} 和newMap()的区别?
考察的是字面量创建对象和构造函数创建对象的区别。
字面量创建对象:1、代码量少易读。2、运行速度更快,在解析的时候会被优化,即不需要作用域解析,解析器需要顺着作用域链从当前作用域向上查找,如果在当前作用域找到了名为Object()的函数就执行,如果没找到,就继续顺着作用域链往上照,直到找到全局Object()构造函数为止。3、但是一次只可以创建一个对象,创建很多对象,会造成代码冗余度高。
构造函数创建对象:把对象实例的创建过程委托给一个内置的函数,函数的传参会影响对象的创建。
2、说说symbol。
①symbol是es6的新特性,它类似于唯一标识一个ID。②用typeof识别会返回Symbol,③用Symbol定义的变量,比较的结果为false。④如果对象里面的属性被定义为Symbol类型,则不能用Object.keys()和for in 遍历出来,因为该属性不在对象的自身属性名集合中。⑤用JSON.stringify()将对象转换成JSON字符串的时候,Symbol属性也会被排除在输出内容之外。⑥可以用Symbol来定义私有属性。⑦如果要获取以Symbol方式定义的对象属性,可以用object的API:Object.getOwnPropertySymbols()或者用新增的反射API:Reflect.ownKeys()

3、说说js垃圾回收机制(网络答案)
一般来说没有被引用的对象就是垃圾,就是要被清除。
现在各大浏览器通常用采用的垃圾回收有两种方法:标记清除、引用计数。
1、标记清除
这是javascript中最常用的垃圾回收方式。当变量进入执行环境时,就标记这个变量为“进入环境”。从逻辑上讲,永远不能释放进入环境的变量所占用的内存,因为只要执行流进入相应的环境,就可能会用到他们。当变量离开环境时,则将其标记为“离开环境”。
  垃圾收集器在运行的时候会给存储在内存中的所有变量都加上标记。然后,它会去掉环境中的变量以及被环境中的变量引用的标记。而在此之后再被加上标记的变量将被视为准备删除的变量,原因是环境中的变量已经无法访问到这些变量了。最后。垃圾收集器完成内存清除工作,销毁那些带标记的值,并回收他们所占用的内存空间。
2、引用计数
另一种不太常见的垃圾回收策略是引用计数。引用计数的含义是跟踪记录每个值被引用的次数。当声明了一个变量并将一个引用类型赋值给该变量时,则这个值的引用次数就是1。相反,如果包含对这个值引用的变量又取得了另外一个值,则这个值的引用次数就减1。当这个引用次数变成0时,则说明没有办法再访问这个值了,因而就可以将其所占的内存空间给收回来。这样,垃圾收集器下次再运行时,它就会释放那些引用次数为0的值所占的内存。
出自:链接:js垃圾回收机制
4、循环对象的方法及区别
1.使用for in。可以用来枚举对象的属性,也可以用来循环数组。但也会把原型上的方法名也遍历出来。遍历对象,是获取对应元素的序号,for…in是获取对象的key。
2.使用for of。遍历对象,可以获取对应的元素,是遍历获取对象中的value。
3.Object.keys().找到对象中所有key值的一个数组,,再forEach取得其value。
5、判断数据类型的方法
typeof 、instanceof 、constructor 、Object.prototype.toString.call
6、transition和animation的区别,以及触发transition的条件
transition是过渡属性,强调过渡,设置一个开始关键帧和一个结束关键帧。animation是动画属性,可以设置多个关键帧完成动画,设定好时间后自己执行,无需触发事件。触发transition的条件是触发一个事件,比如鼠标移动上去,焦点,点击等。
7、js有哪些类数组,es5 es6有哪些方法可以将其转化为数组?
arguments、NodeList、HTMLCollection.
方法:Array.prototype.slice.call(),[].concat.apply([],arr)、Function.prototype.call.bind(Array.prototype.slice)、[].slice.call(arr)ES6类数组转化为数组 Array.from(arr)
8、0.1+0.2 === 0.3吗?为什么?怎么才能得到想要的结果?
不等于,在JavaScript中的二进制的浮点数0.1和0.2并不是十分精确,在他们相加的结果并非正好等于0.3,而是一个比较接近的数字 0.30000000000000004 ,所以条件判断结果为false。可以通过以下两种方法实现:
1.ES6提供的Number.EPSILON方法

Number.EPSILON=(function(){   //解决兼容性问题
        return Number.EPSILON?Number.EPSILON:Math.pow(2,-52);
      })();
//上面是一个自调用函数,当JS文件刚加载到内存中,就会去判断并返回一个结果,相比if(!Number.EPSILON){
  //   Number.EPSILON=Math.pow(2,-52);
  //}这种代码更节约性能,也更美观。
function numbersequal(a,b){ 
    return Math.abs(a-b)<Number.EPSILON;
  }
//接下来再判断   
    var a=0.1+0.2, b=0.3;
  console.log(numbersequal(a,b)); //这里就为true了
1
2
3
4
5
6
7
8
9
10
11
12
2、把计算数字 提升 10 的N次方 倍 再 除以 10的N次方。N>1.

(0.1*1000+0.2*1000)/1000==0.3
1
9、重绘、重排。
重排:当渲染树因为元素尺寸、布局、隐藏等改变而需要重建,这就称为重排(回流)。每个页面至少需要一次重排(回流

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值