前端面试必问问题前端面试必问问题18道道—一篇文章进大厂一篇文章进大厂
谈谈数组谈谈数组Array在项目中常见的场景在项目中常见的场景
求和,求最大(小)值,排序,多个数组合并(concat),去重,分割,find,indexOf,filter,join, toString等等
数组的concat,join,slice,toString方法不会改变原数组
数组的splice,push,pop,unshift,shift,sort,reverse方法会改变原数组
类数组怎么转化为数组类数组怎么转化为数组
什么是类数组,就是属性要为索引(数字)属性,同时又必须有一个length属性来控制对象边界的一个特殊对象,特点:
1.不能使用数组的方法,他们不能使用Array的方法
2.拥有length属性,可以使用下标来访问元素,这两点和数组相同。
var obj = {
'0': 'a',
'1': 'b',
'2': 'c',
'length': 3
}
转化为数组的方法有3种:
第一种,采用es6中的新方法Array.from()
var myArray = ["value1", "value2", "value3"];
var mySet = new Set(myArray);
console.log(Array.from(mySet)); //第一种方法Array.from()
console.log([...mySet]); //第二种方法Array.from()
第二种,创建新数组,通过forEach遍历把类数组的元素添加到新数组中
第三种,通过Array.prototype.slice.call(arrayLike, 0)或者[].slice.call(arrayLike, 0)将类数组对象传入即可
第四种,扩展运算符 ... [...arguments]
// 将参数转为数组
var fn = function() {
console.log([...arguments]);
}
fn(1, 2, 3)
// 展开Set值
[...set.values()]
common.js和和ES6模块化的区别模块化的区别
详情可见:
js的4种模块化的使用方法和区别
import、require、export、module.exports 混合使用详解
不同规范产生的来由啊,随着技术的发展,js这门语言模块化的需要也越来迫切,随之而来就是各种规范,什么CMD、AMD
各种规范也应运而生,现在在服务端形成CommonJS规范,前端呢ES6模块化的概念也深入人心。
毕竟一个是用于后端,一个是用于前端,所以还是有很大的不同,比较一下common.js和ES6模块化的区别:
前者支持动态导入,也就是 require(${path}/xx.js),后者目前不支持。
前者是同步导入,因为用于服务端,文件都在本地,同步导入即使卡住主线程影响也不大。而后者是异步导入,因为用于浏览
器,需要下载文件,如果也采用同步导入会对渲染有很大影响。
前者在导出时都是值拷贝,就算导出的值变了,导入的值也不会改变,所以如果想更新值,必须重新导入一次。但是后者采用
实时绑定的方式,导入导出的值都指向同一个内存地址,所以导入值会跟随导出值变化
require 在 ES6(bable将import转化为require) 和 CommonJS 中都支持,像Vue中一般引入CSS样式的时候会用到require,
是因为样式一般需要同步导入的原因所致
即使我们使用了 ES6 的模块系统,如果借助 Babel 的转换,ES6 的模块系统最终还是会转换成 CommonJS 的规范。
两个数据互换,比如两个数据互换,比如a=6&b=5,怎么做能,怎么做能a=5&b=6
// 第一种方法
var a = 10;
var b = 20;
var tmp = a; // tmp = 10;
a = b; // a = 20;
b = tmp; // b = 10;