前端面试题
*1. 判断数组
(1)Array.isArray()方法判断
var a=[ ];
Array.isArray(a) //返回true
var b='hello world';
Array.isArray(b) //返回false
这个方法简单有效,缺点是IE8及以下版本浏览器不兼容
(2)用instanceof判断
var a=[ ];
console.log(a instanceof Array) //返回true
obj instanceof Object 判断 Object.prototype 是否存在在 obj 的原型链上,因此 a instanceof Object 也会返回 true
(3)根据对象的constuctor属性判断
var a=[ ];
console.log(a.constructor==Array); //返回true
在javascript中,每个对象都有一个constructor属性,它引用了初始化该对象的构造函数,通常会将这个判断方法封装为一个判断数组的方法
function isArray(obj) {
return typeof obj == 'object' && obj.constructor == Array
}
(4)终极判断方法
function isArray(obj) {
return Object.prototype.toString.call(obj) == '[object Array]';
}//仅判断Array
function isType(data,type) {
return Object.prototype.toString.call(data) === "[object "+type+"]";
} //通用判断方法
*2. 编写一个带参数(m,n)的函数,产生一个m个n的数组,不用循环
function mnArr(m,n){
//第一种方法
var newArr=new Array(m);
newArr.fill(n);
return newArr;
//第二种,from方法
var arr = Array.from({length:m}, (v)=> n);
return arr;
}
*3. html怎么解析的?
把html解析为dom树,使用css渲染dom,js操作dom。
*4. jQ中让一个元素消失怎么实现?
a) dispaly:none
b) hide()
c) visibility:hidden
d) $(‘p’).fadeOut( )
*5. ajax.get发送数据成功后会把请求的url和结果保存缓存中,当下一次请求时直接取出来,这是为了提高页面响应速度和用户体验,但是如果因为业务需要,我们要怎么解决缓存问题?
a) 在ajax发送请求前加上 xmlHttpRequest.setRequestHeader("Cache-Control","no-cache");
b) 在ajax发送请求前加上xmlHttpRequest.setRequestHeader)"If-Modified-Since","0");
c) 在 Ajax 的 URL 参数后加上 "?fresh=" + Math.random(); //加随机数
d) 第五种方法和第四种类似,在 URL 参数后加上"?timestamp=" + new Date().getTime();//加时间戳
e) 在服务端加 header("Cache-Control: no-cache, must-revalidat");
*6. 什么是深入响应式原理?
深入响应式原理是利用了数据劫持和订阅发布的模式, 当数据模型发生改变的时候,视图就会响应的进行更新, 那么深入响应式原理是利用es5的Object.defineProperty中的getter/setter来进行数据的劫持的,
在数据变动时发布消息给订阅者,触发相应的监听回调。
*7. 如何理解vue中MVVM模式?
MVVM全称是Model-View-ViewModel;
View 与 Model 不发生联系,都通过 ViewModel 传递。
vue是以数据为驱动的,一旦创建dom和数据就保持同步,每当数据发生变化时,dom也会变化。DOMListeners和DataBindings是实现双向绑定的关键。DOMListeners监听页面所有View层DOM元素的变化,当发生变化,Model层的数据随之变化;DataBindings监听Model层的数据,当数据发生变化,View层的DOM元素随之变化。
*8. 下面的代码输出什么?
var y = 1;
if (function f(){}) {
y += typeof f;
}
console.log(y);
答案:1undefined