js面试题

7.宏任务,微任务

都是异步任务,微任务:promise.then,async/await。宏任务:定时器

  • Promise的then的回调(注意,new Promise()的函数参数是同步代码,then的回调才是异步)
  • await下方的代码和赋值代码(注意,await后方的函数是同步代码)

执行宏任务的前提是执行玩所有微任务。

8.作用域

作用域链:内部可以访问外部的变量,外部不能访问内部变量

function fun(){
vara=20;
a=10;
console. log(a);fun();

 10  变量再次赋值

function fun(){
a=10 ;
var  a=20;
console. log(a);

 20  

if( typeof name== 'undefined' ){
var name ='b' ;
console. log( ' 111 '+name) ;
}else{
console. Log( ' 222 '+name) ;
}

111b

if(false ){
var a=10;

undefined


 

12.cookie一般由服务器端生成,用于标识用户身份。localstorage用于浏览器端缓存数据。生命周期永久。sessionstorage在页面或者浏览器关闭时销毁。

16.垃圾回收

标记清除,引用计数(内存泄漏)

17,数组字符串的一些方法

join 数组链接为字符串默认逗号分割。

split 字符串分割为数组

slice 字符串数组都有(切割左开右闭)

18.css预处理器

为css添加了可编程性,使css更加灵活,适应性更高。

优点,不需要考虑浏览器的兼容问题,写法更加简洁,可读性好。

19.for in for of

for … of遍历获取的是对象的键值,for … in 获取的是对象的键名
for … in会遍历对象的整个原型链,性能非常差不推荐使用,

for..of适用遍历数/数组对象/字符串/map/set等拥有迭代器对象的集合.但是不能遍历对象,因为没有迭代器对象

22.求交集和并集

const union=(arr1,arr2)=>{

const result=arr1.concat(arr2,filter(item2=>arr1.every(item1=>item1!==item2)

return result

}

const inter=(arr1,arr2)=>{

const result=arr1.filter(item=>arr2.some(item2=>item1===item2));

return result;

}

23.浅拷贝,深拷贝

浅拷贝

  • Object.assign
  • Array.prototype.slice()Array.prototype.concat()返回一个新数组
  • 使用拓展运算符实现的复制
  • 深拷贝
  • .cloneDeep()

  • jQuery.extend()

  • JSON.stringify()

  • 手写循环递归

function clone(target) {
    let cloneTarget = {};
    for (const key in target) {
        cloneTarget[key] = target[key];
    }
    return cloneTarget;
};



module.exports = function clone(target) {
    if (typeof target === 'object') {
        let cloneTarget = Array.isArray(target) ? [] : {};
        for (const key in target) {
            cloneTarget[key] = clone(target[key]);
        }
        return cloneTarget;
    } else {
        return target;
    }
};


24ts,js 

ts是js的超集,ts能使用js的语法

ts需要静态编译,提供强类型和更多面向对象的内容

25.await原理

generate的语法糖,通过同步代码实现异步操作。

我对 ajax 的理解是,它是一种异步通信的方法,通过直接由 js 脚本向服务器发起 http 通信,然后根据服务器返回的数据,更新网页的相应部分,而不用刷新整个页面的一种方法。
 

27.

默认绑定

全局环境中定义person函数,内部使用this关键字

var name = 'Jenny';
function person() {
    return this.name;
}
console.log(person());  //Jenny

上述代码输出Jenny,原因是调用函数的对象在游览器中位window,因此this指向window,所以输出Jenny

这个函数中包含多个对象,尽管这个函数是被最外层的对象所调用,this指向的也只是它上一级的对象

var o = {
    a:10,
    b:{
        fn:function(){
            console.log(this.a); //undefined
        }
    }
}
o.b.fn();

这个函数中包含多个对象,尽管这个函数是被最外层的对象所调用,this指向的也只是它上一级的对象

var o = {
    a:10,
    b:{
        fn:function(){
            console.log(this.a); //undefined
        }
    }
}
o.b.fn();

这个函数中包含多个对象,尽管这个函数是被最外层的对象所调用,this指向的也只是它上一级

var o = {
    a:10,
    b:{
        fn:function(){
            console.log(this.a); //undefined
        }
    }
}
o.b.fn();

上述代码中,this的上一级对象为bb内部并没有a变量的定义,所以输出undefined

var o = {
    a:10,
    b:{
        a:12,
        fn:function(){
            console.log(this.a); //undefined
            console.log(this); //window
        }
    }
}
var j = o.b.fn;
j();

此时this指向的是window,这里的大家需要记住,this永远指向的是最后调用它的对象,虽然fn是对象b的方法,但是fn赋值给j时候并没有执行,所以最终指向window

28.事件流 描述的就是页面接收事件的顺序 事件流主要分为两种,一种是事件冒泡流, 一种是事件捕获流 <div> -> <body> -> <html> -> document

事件模型可以分为三种:

原始事件模型(DOM0级)只支持冒泡,不支持捕获

标准事件模型(DOM2级)事件捕获阶段:事件从document一直向下传播到目标元素, 依次检查经过的节点是否绑定了事件监听函数,如果有则执行事件处理阶段:事件到达目标元素, 触发目标元素的监听函数事件冒泡阶段:事件从目标元素冒泡到document, 依次检查经过的节点是否绑定了事件监听函数,如果有则执行

iE事件模型(基本不用)事件处理阶段:事件到达目标元素, 触发目标元素的监听函数。事件冒泡阶段:事件从目标元素冒泡到document, 依次检查经过的节点是否绑定了事件监听函数,如果有则执行

事件委托指当有大量子元素触发事件时,将事件监听器绑定在父元素进行监听,此时数百个事件监听器变为了一个监听器,提升了网页性能。事件委托就是在冒泡阶段完成 currentTarge指向事件绑定的元素,而 Event.target 则是事件触发的元素。

29.跨域

比如说前端域名a,后端域名b.server_name设置为a,然后设置相应的location以拦截前端需要跨域的请求,最后将请求代理返还b。a访问nginx的a是同源访问,而nginx对服务端转发的请求不会触发浏览器的同源策略。cors在服务器端设置几个响应头,jonsp

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值