JavaScript面试题总结
小职 2021-08-09 来源 :「不知名社会人」 阅读 543 评论 0

摘要:本篇是web前端JavaScript常见的面试题总结,希望对前端开发的学习与面试有一定的帮助。

本篇是web前端JavaScript常见的面试题总结,希望对前端开发的学习与面试有一定的帮助。

JavaScript面试题总结

1. 与foo有关:

foo指的是程序员用来代表数据,功能,属性的变量,就是随便定义的,相当于张三,李四



2. null,0,undefined,true与false

1.null和undefined与任何有意义的值比较,都是false

        console.log(null == undefined); //true

        console.log(null == 0); //false

        console.log(null == ""); //false

        console.log(1 == true); //true

        console.log(0 == false); //true


3. 求数组中最大值

(1) Math.max.apply(null,数组)(Math.max()中不支持数组,所以使用apply()方法将数组转化为一个个参数,第一个参数是null是只是先更实用这个方法,返回结果就行了)


 var max = Math.max.apply(null, [1, 888, 88]);

        console.log(max);


        (2)Array.max()是没有这个方法的


4. 连接符+的使用

console.log(1+ +'2'+'2');结果输出字符串32,(第一个+’2‘中的加号是一元加操作符,+’2‘会变成数值2,所以1+ +’2‘相当于1+2)


5. 跨域请求和同源策略

(1)浏览器的核心安全策略是同源策略,用于防御非法攻击的,但是也不能因为非法攻击就把所有的跨域都毙掉

(2)跨域:协议,域名(不同的域名指向同一个IP,也非同源),端口号

(3)跨域出现的原因:浏览器的同源策略不许不同源间有交互

(4)浏览器允许发起跨域请求,但是返回来的数据会被浏览器拦截

JavaScript面试题总结


(5)跨域的解决方案:JSONP,跨域资源共享CORS,Nginx正反代理

(6)JSONP:早期的解决方案,只支持GET请求,不支持POST请求;实现原理:script标签不受同源策略的影响,用script标签的src属性请求数据接口,然后通过函数调用接收数据(JSONP不是异步的,所以和Ajax没关系,是JavaScript脚本请求)


   $.ajax()除了可以发起Ajax请求,还可以发起JSONP请求

  jQuery发起JSONP请求,默认会携带一个callBack=jQueryxxx的参数(随机的)

 $.ajax({

            //type: '', /POST或GET

            url: '',

            dataType:'jsonp',

            //data: {},

            success: function(resp) {},//接收服务器返回的数据

            error: function() {}

        })


(7)CORS:支持GET/POST,但是可能不兼容低版本的浏览器


6. 四种本地存储方法(session Storage…)

cookie(document域下面的),sessionStorage(window域下面的),localStorage(window域下面的),indexedDB(window域下面的)

1

(1)数据存储在浏览器上,不需要经过服务器,刷新或关闭页面数据也不会丢失,他们都是key value存储的

(2)cookie在同一源下都是可用的(即使打开了同一源下的不同窗口),但是不允许跨浏览器,跨源;cookie的使用document.cookie,在 一段时间内有效,cookie存在于头部,每次都随头部提交(每次在客户端与服务器端来回传递),cookie往往用来保存用户的登录状态

(3)为什么有了cookie还要用local Storage呢?因为每次请求的时候都会将头部的cookie作为请求的一部分,会很浪费带宽,在H5提出了local Storage;localStorage的使用localStorage.setItem('key','value');local Storage读取值:local Storage.getItem(‘k’);localStorage不会每次随请求头提交,可长时间保存页面(除非手动删除,不能跨浏览器,跨源)


set.addEvenListenter('click', function() {

        localStorage.setItem('uname', '小明');

        localStorage.getItem('uname');

        localStorage.removeItem('uname');

        localStorage.clear();

    })


(4)sessionStorage使用方法与local Storage一样,不随头部提交,页面关闭就会失效,只能存储字符串


7. HTTP与HTTPS的区别

(1)HTTP是超文本传输协议,是基于TCP/IP的在客户端与服务器端如何传输数据的网络协议,是无状态协议(客户端是无状态存储,访问网站需要重复的登录,所以就出现了cookie/session技术),直接明文传输(密码等可能被中途截取),每次建立连接时都需要三次握手四次挥手

(2)HTTPS是基于HTTP协议,通过SSL/TSL(客户端与服务器先建立安全通道,服务器端发送证书告诉客户端我是安全的服务器,然后服务器发送一个箱子,客户端会将数据放入箱子进行数据传输)进行数据加密,客户端身份认证,用以保护数据


8. POST与GET(POST和GET是HTTP请求的两种方法)

 (1)get请求用于获取数据(一般都是一些大众可见的数据,可以被浏览器缓存),post请求会传输数据到后台(比如用户名,密码,是不能被浏览器缓存的)

 (2)get传参时,会在url地址栏可见,安全性较差,参数长度有限制;post传参时,参数在requestbody中

 (3)get请求在回退刷新页面时不会有影响,post请求在回退/刷新时会重新发送请求(get效率更高)

 (4)get只支持URL编码,而post支持多种编码

 (5)因为HTTP是基于TCP/IP的,所以GET和POST也是基于TCP/IP的

 (6)GET发送一个TCP数据包,POST 发送两个TCP数据包(火狐产生一个)

 (7)GET请求会把header和data一起发送给服务器(返回200状态码);POST先发送header给服务器,服务器响应100;再将data数据发送给服务器,服务器响应200(所以在网络不好的情况下,GET会更快)


9.symbol

(1)symbol是ES6新引入的基本数据类型的一种(String,Number,Boolean,Undefined,Null,)

(2)symbol表示独一无二的值


let sym=Symbol(‘foo’);

typeof sym;//输出'symbol'


(3)因为不是对象,所以无法使用New关键字,因此不能给它添加属性

JavaScript面试题总结


10.柯里化?

(1)柯里化:将上面的函数拆分成两个函数,每个函数只接受一个参数


function add(a) {

            return function(b) {

                return a + b;

            }

        }

        const f = add(10);

        const test = f(1) 

        console.log(test);


(2)柯里化函数的作用:使用柯里化技术可以实现参数的复用,大大的减少代码量(实际开发中经常会出现重复的参数)

(3)柯里化的作用:延迟执行


11.this指向

JavaScript面试题总结

(1)this指向他的调用者

(2)call(修改后的this指向,参数一,参数二)(会被理立即调用)

(3)apply(修改this的指向,【数组】)(会被立即调用)

(4)bind()(不会立即调用,会生成新的函数,需要接收,做定时器)修改this的指向


12.闭包?

(1)JavaScript语言的特殊之处:函数内部可以直接读取全局 变量;在函数外部无法直接读取函数内的局部变量

(2)在函数内部定义变量不适用var ,相当于声明了一个全局变量


function f1(){

    n=999;

  }


  f1();


  alert(n); // 999


(3)闭包就是能够读取到其他函数内部变量的函数(就是将函数内外链接起来的桥梁),如下所示,f2()就是闭包


function f1(){


    var n=999;


    function f2(){

      alert(n); 

    }


    return f2;


  }


  var result=f1();


  result(); // 999


(4)闭包的用途:可以读取函数内部的变量;使变量的值始终保存在内存中


function f1(){


    var n=999;


    nAdd=function(){n+=1}


    function f2(){

      alert(n);

    }


    return f2;


  }


  var result=f1();


  result(); // 999


  nAdd();


  result(); // 1000


(5)使用闭包的注意点:因为变量始终保存在内存中,使内存消耗很大,解决方法:退出函数前,将不用的变量全部删除


13.作用域链

(1)作用域:变量的可用范围就是作用域

(2)作用域链:(和原型链好像)查找变量时,先从当前上下文的变量对象中查找,若没有到父级执行上下文的变量对象中查找,一直到全局上下文对象,这样的由多个执行上下文变量对象构成的链表叫作用域链


14.执行栈/执行上下文

1.运行代码的时候可以生成执行上下文(执行环境),决定着代码的作用域;如下执行上下文分为三种:

(1)全局环境

(2)函数环境

(3)Eval环境(慎用,一般不考虑)

2.每次创建执行上下文的时候,分为创建阶段和执行阶段(如下用函数举例)

(1)创建阶段:创建作用域链,变量对象(变量,函数声明等),决定this值

(2)执行阶段:变量赋值,函数引用

3.执行任何代码前,先创建全局执行上下文,再创建作用域链(因为是全局执行上下文,所以只有全局变量对象),


15.单位px,em,rem,vw,vh的区别

(1)px是像素值,是绝对单位,是固定的,就像厘米,米一样

(2)em和rem是相对单位,缩小屏幕时,字体大小也随之发生变化,就用到了em和rem;

(3)默认1em=16px,当自己元素上有fontSize:32px,则1em=32px,也可以给父元素设置font Size从而影响自己em的值

(4)默认1rem=16px,只能修改html标签,从而影响自己rem的值

(5)vh和vw是根据窗口的宽高,分为100等分,100vh就表示满高,50vh表示一半高


.div-vh-vw {

            width: 100vw;

            /* // 视窗宽度的 1/10 */

            height: 100vh;

            /* // 视窗高度的 1/10 */

            background-color: pink;

        }

        /* %百分比的用法:父元素的宽高作为参照值 */

        

        .div-vh-vw-child {

            width: 50%;

            height: 50%;

            background-color: aliceblue;

        }

   

       


      


16.清除浮动

(1)清除浮动的原因:父元素未设置高度,,导致父元素塌陷;浮动元素脱标影响后面的标准流

(2)额外标签法:在浮动元素末尾加一个新的标签(必须是会块级元素)

(3)父级元素添加 overflow:hidden;(父元素塌陷也用 overflow:hidden; )

(4)给父元素添加 :after伪元素法 相当于额外标签法的升级版(在盒子的后面插入新的标签)


.clearfix:after { content: ""; display: block; height: 0; clear: both;  } 

1

(5)给父元素添加 双伪元素法 盒子的前后都添加标签


.clearfix:before,.clearfix:after { content: ""; display: table; } .clearfix :after{ clear:both; } }

1

17.数组去重

(1)ES6中的Set去重,但这种方法不会去重{}(空对象)



(2)双重for循环+splice()去重,依然无法去重{}


  var arr = [1, 1, null, {}, 3, {}, null];


        function test(arr) {

            for (let i = 0; i < arr.length; i++) {

                for (let j = i + 1; j < arr.length; j++) {

                    if (arr[i] == arr[j]) {

                        //arr.splice(起始项,个数);

                        arr.splice(j, 1);

                        j--;

                    }

                }

            }

            return arr;

        }

        console.log(test(arr));//一样无法去重{}


(3)indexOf去重,{}一样无法去重


 var arr = [1, 1, null, {}, 3, {}, null];


        function test(arr) {

            var newArr = [];

            if (!Array.isArray(arr)) {

                console.log('不是数组');

                return;

            } else {

                for (let i = 0; i < arr.length; i++) {

                    if (newArr.indexOf(arr[i]) === -1) {

                        newArr.push(arr[i]);

                    }

                }

                return newArr;

            }

        }

        console.log(test(arr));


(4)sort()排序(直接把null都去除了),{}无法去重


var arr = [9, 1, 1, null, {}, 3, {}, null];


        function test(arr) {

            //先排序

            var arr = arr.sort();

            //新建数组

            var newArr = [];

            if (!Array.isArray(arr)) {

                console.log('这不是个数组');

                return;

            } else {

                for (let i = 0; i < arr.length; i++) {

                    if (arr[i] != arr[i + 1]) {

                        newArr.push(arr[i]);

                    }

                }

                return newArr;

            }

        }

        console.log(test(arr));


(5)includes()去重(和sort()好像,就是不需要sort()排序),{}无法去重


 var arr = [9, 1, 1, null, {}, 3, {}, null];


        function test(arr) {

            var newArr = [];

            if (!Array.isArray(arr)) {

                console.log('这不是个数组');

                return;

            } else {

                for (let i = 0; i < arr.length; i++) {

                    if (!newArr.includes(arr[i])) {

                        newArr.push(arr[i]);

                    }

                }

                return newArr;

            }

        }

        console.log(test(arr));


18.for…in和for…of的区别?

(1)for…in用于遍历对象属性,for…of可以遍历数组

(2)for…of新语法弥补了for…in的不足(两者都可以遍历数组,但是对于自定义属性,for…of是不会遍历 的)


 let persons = ['小明 ', '小刚', '小红'];

   persons.name = 'paka';

    for (let k in persons) {

        console.log(k);//输出0,1,2

    }

    for (let k of persons) {

        console.log(k);输出name,小明,小刚,小红

    }


(3)for…of不能遍历对象,需要搭配Ojbect.keys()使用


19.promise

(1)promise是回调函数(回调函数一般需要触发条件然后来执行的)的升级,里面保存着未来才会结束的事件(通常是异步事件);所以在处理花费长时间的任务时,使用promise进行异步处理,防止阻塞

(2)使用promise只会导致两种结果,成功返回resolve用then来表示,失败返回reject用catch来表示,用finally来表示无论状态如何都会执行的操作(不接受参数,与promise的状态无关,不依赖promise的执行结果)

(3)无参数的


const isTrue = false;

const promise = new Promise((resolve, reject) => {

    if (!isTrue) {

        resolve('是错的');

    } else {

        reject('是对的');

    }

});

promise

    .then(test => {

        console.log('小明的回答' + test);

    })

    .catch(test => {

        console.log('小明的回答' + test);

    })

    .finally(() => {

        console.log('请小明回答了问题');

    })


(4)有参数的


const imgAdd = 'https://i0.hdslb.com/bfs/feed-admin/9a10ffd36796f073f8a5a40d59ecde145aa8d145.png';

const promise = (url) => {

    return new Promise((resolve, reject) => {

        let img = new Image();

        let error = new Error('图片有误');

        img.src = url;

        img.onload = () => {

            resolve(img);

        };

        img.onerror = () => {

            reject(error);

        };

    });

}

promise(imgAdd)

    .then(img => {

        console.log('失误了');

        document.body.appendChild(img);

    })

    .catch(error => {

        document.body.innerHTML = error;

    })


20.图片懒加载与自定义属性data-src

(1)网页有很多图片,图片是非常吃流量的,当用户还没有浏览到图片,我们就没有必要把图片加载出来

(2)因此肯定需要scroll事件监听;窗口显示区的高度window.innerHeight;图片到视窗上边的距离getBoundingClientRect().top


   

先帝创业未半而中道崩殂,今天下三分,益州疲弊,此诚危急存亡之秋也。然侍卫之臣不懈于内,忠志之士忘身于外者,盖追先帝之殊遇,欲报之于陛下也。诚宜开张圣听,以光先帝遗德,恢弘志士之气,不宜妄自菲薄,引喻失义,以塞忠谏之路也。 宫中府中,俱为一体,陟罚臧否,不宜异同。若有作奸犯科及为忠善者,宜付有司论其刑赏,以昭陛下平明之理,不宜偏私,使内外异法也。 侍中、侍郎郭攸之、费祎、董允等,此皆良实,志虑忠纯,是以先帝简拔以遗陛下。愚以为宫中之事,事无大小,悉以咨之,然后施行,必能裨补阙漏,有所广益。

        将军向宠,性行淑均,晓畅军事,试用于昔日,先帝称之曰能,是以众议举宠为督。愚以为营中之事,悉以咨之,必能使行阵和睦,优劣得所。 亲贤臣,远小人,此先汉所以兴隆也;亲小人,远贤臣,此后汉所以倾颓也。先帝在时,每与臣论此事,未尝不叹息痛恨于桓、灵也。侍中、尚书、长史、参军,此悉贞良死节之臣,愿陛下亲之信之,则汉室之隆,可计日而待也。 臣本布衣,躬耕于南阳,苟全性命于乱世,不求闻达于诸侯。先帝不以臣卑鄙,猥自枉屈,三顾臣于草庐之中,咨臣以当世之事,由是感激,遂许先帝以驱驰。后值倾覆,受任于败军之际,奉命于危难之间,尔来二十有一年矣。

        先帝知臣谨慎,故临崩寄臣以大事也。受命以来,夙夜忧叹,恐托付不效,以伤先帝之明,故五月渡泸,深入不毛。今南方已定,兵甲已足,当奖率三军,北定中原,庶竭驽钝,攘除奸凶,兴复汉室,还于旧都。此臣所以报先帝而忠陛下之职分也。至于斟酌损益,进尽忠言,则攸之、祎、允之任也。 愿陛下托臣以讨贼兴复之效,不效,则治臣之罪,以告先帝之灵。若无兴德之言,则责攸之、祎、允等之慢,以彰其咎;陛下亦宜自谋,以咨诹善道,察纳雅言,深追先帝遗诏,臣不胜受恩感激。 今当远离,临表涕零,不知所言。


   

   

先帝创业未半而中道崩殂,今天下三分,益州疲弊,此诚危急存亡之秋也。然侍卫之臣不懈于内,忠志之士忘身于外者,盖追先帝之殊遇,欲报之于陛下也。诚宜开张圣听,以光先帝遗德,恢弘志士之气,不宜妄自菲薄,引喻失义,以塞忠谏之路也。 宫中府中,俱为一体,陟罚臧否,不宜异同。若有作奸犯科及为忠善者,宜付有司论其刑赏,以昭陛下平明之理,不宜偏私,使内外异法也。 侍中、侍郎郭攸之、费祎、董允等,此皆良实,志虑忠纯,是以先帝简拔以遗陛下。愚以为宫中之事,事无大小,悉以咨之,然后施行,必能裨补阙漏,有所广益。

        将军向宠,性行淑均,晓畅军事,试用于昔日,先帝称之曰能,是以众议举宠为督。愚以为营中之事,悉以咨之,必能使行阵和睦,优劣得所。 亲贤臣,远小人,此先汉所以兴隆也;亲小人,远贤臣,此后汉所以倾颓也。先帝在时,每与臣论此事,未尝不叹息痛恨于桓、灵也。侍中、尚书、长史、参军,此悉贞良死节之臣,愿陛下亲之信之,则汉室之隆,可计日而待也。 臣本布衣,躬耕于南阳,苟全性命于乱世,不求闻达于诸侯。先帝不以臣卑鄙,猥自枉屈,三顾臣于草庐之中,咨臣以当世之事,由是感激,遂许先帝以驱驰。后值倾覆,受任于败军之际,奉命于危难之间,尔来二十有一年矣。

        先帝知臣谨慎,故临崩寄臣以大事也。受命以来,夙夜忧叹,恐托付不效,以伤先帝之明,故五月渡泸,深入不毛。今南方已定,兵甲已足,当奖率三军,北定中原,庶竭驽钝,攘除奸凶,兴复汉室,还于旧都。此臣所以报先帝而忠陛下之职分也。至于斟酌损益,进尽忠言,则攸之、祎、允之任也。 愿陛下托臣以讨贼兴复之效,不效,则治臣之罪,以告先帝之灵。若无兴德之言,则责攸之、祎、允等之慢,以彰其咎;陛下亦宜自谋,以咨诹善道,察纳雅言,深追先帝遗诏,臣不胜受恩感激。 今当远离,临表涕零,不知所言。


   

   

先帝创业未半而中道崩殂,今天下三分,益州疲弊,此诚危急存亡之秋也。然侍卫之臣不懈于内,忠志之士忘身于外者,盖追先帝之殊遇,欲报之于陛下也。诚宜开张圣听,以光先帝遗德,恢弘志士之气,不宜妄自菲薄,引喻失义,以塞忠谏之路也。 宫中府中,俱为一体,陟罚臧否,不宜异同。若有作奸犯科及为忠善者,宜付有司论其刑赏,以昭陛下平明之理,不宜偏私,使内外异法也。 侍中、侍郎郭攸之、费祎、董允等,此皆良实,志虑忠纯,是以先帝简拔以遗陛下。愚以为宫中之事,事无大小,悉以咨之,然后施行,必能裨补阙漏,有所广益。

        将军向宠,性行淑均,晓畅军事,试用于昔日,先帝称之曰能,是以众议举宠为督。愚以为营中之事,悉以咨之,必能使行阵和睦,优劣得所。 亲贤臣,远小人,此先汉所以兴隆也;亲小人,远贤臣,此后汉所以倾颓也。先帝在时,每与臣论此事,未尝不叹息痛恨于桓、灵也。侍中、尚书、长史、参军,此悉贞良死节之臣,愿陛下亲之信之,则汉室之隆,可计日而待也。 臣本布衣,躬耕于南阳,苟全性命于乱世,不求闻达于诸侯。先帝不以臣卑鄙,猥自枉屈,三顾臣于草庐之中,咨臣以当世之事,由是感激,遂许先帝以驱驰。后值倾覆,受任于败军之际,奉命于危难之间,尔来二十有一年矣。

        先帝知臣谨慎,故临崩寄臣以大事也。受命以来,夙夜忧叹,恐托付不效,以伤先帝之明,故五月渡泸,深入不毛。今南方已定,兵甲已足,当奖率三军,北定中原,庶竭驽钝,攘除奸凶,兴复汉室,还于旧都。此臣所以报先帝而忠陛下之职分也。至于斟酌损益,进尽忠言,则攸之、祎、允之任也。 愿陛下托臣以讨贼兴复之效,不效,则治臣之罪,以告先帝之灵。若无兴德之言,则责攸之、祎、允等之慢,以彰其咎;陛下亦宜自谋,以咨诹善道,察纳雅言,深追先帝遗诏,臣不胜受恩感激。 今当远离,临表涕零,不知所言。


   

   

    JavaScript面试题总结

    JavaScript面试题总结

    JavaScript面试题总结

   

先帝创业未半而中道崩殂,今天下三分,益州疲弊,此诚危急存亡之秋也。然侍卫之臣不懈于内,忠志之士忘身于外者,盖追先帝之殊遇,欲报之于陛下也。诚宜开张圣听,以光先帝遗德,恢弘志士之气,不宜妄自菲薄,引喻失义,以塞忠谏之路也。 宫中府中,俱为一体,陟罚臧否,不宜异同。若有作奸犯科及为忠善者,宜付有司论其刑赏,以昭陛下平明之理,不宜偏私,使内外异法也。 侍中、侍郎郭攸之、费祎、董允等,此皆良实,志虑忠纯,是以先帝简拔以遗陛下。愚以为宫中之事,事无大小,悉以咨之,然后施行,必能裨补阙漏,有所广益。

        将军向宠,性行淑均,晓畅军事,试用于昔日,先帝称之曰能,是以众议举宠为督。愚以为营中之事,悉以咨之,必能使行阵和睦,优劣得所。 亲贤臣,远小人,此先汉所以兴隆也;亲小人,远贤臣,此后汉所以倾颓也。先帝在时,每与臣论此事,未尝不叹息痛恨于桓、灵也。侍中、尚书、长史、参军,此悉贞良死节之臣,愿陛下亲之信之,则汉室之隆,可计日而待也。 臣本布衣,躬耕于南阳,苟全性命于乱世,不求闻达于诸侯。先帝不以臣卑鄙,猥自枉屈,三顾臣于草庐之中,咨臣以当世之事,由是感激,遂许先帝以驱驰。后值倾覆,受任于败军之际,奉命于危难之间,尔来二十有一年矣。

        先帝知臣谨慎,故临崩寄臣以大事也。受命以来,夙夜忧叹,恐托付不效,以伤先帝之明,故五月渡泸,深入不毛。今南方已定,兵甲已足,当奖率三军,北定中原,庶竭驽钝,攘除奸凶,兴复汉室,还于旧都。此臣所以报先帝而忠陛下之职分也。至于斟酌损益,进尽忠言,则攸之、祎、允之任也。 愿陛下托臣以讨贼兴复之效,不效,则治臣之罪,以告先帝之灵。若无兴德之言,则责攸之、祎、允等之慢,以彰其咎;陛下亦宜自谋,以咨诹善道,察纳雅言,深追先帝遗诏,臣不胜受恩感激。 今当远离,临表涕零,不知所言。


   



21.单线程异步执行机制

JavaScript是单线程,同一时间只能做一件事,但是有时会等待时间过长(Ajax从网络获取数据)

将任务分为同步任务和异步任务

异步任务队列中的事件有IO事件和用户事件(鼠标点击,页面滚动)和定时器;异步任务必须指定回调函数;开始执行异步任务就是执行回调函数

在主线程上先执行同步任务(在执行栈中执行),同步任务执行完后,系统就会执行进入任务队列,执行任务队列中的异步任务。不断重复以上步骤

22.set和map?

(1)es6新的数据结构set和map

(2)set和map的应用场景:数组去重和数据存储

(3)set成员值唯一且无重复的值,Set本身是一个构造函数

(4)


23.防抖?

(1)防抖策略:当事件被触发后,延迟N秒,执行回调函数,如果在N秒内事件又被触发,则重新延迟事件

(2)好处:当频繁的触发某个事件时,保证回调函数只被执行一次

(3)防抖的应用场景:输入框在输入字符时,通过防抖策略,只有在用户输入完成后,才发出请求,减少请求的次数,节约资源


24.深浅拷贝

(1)浅拷贝:拷贝数据,还是指向同一地址,所以当拷贝后的数据发生变化时,拷贝前的数据也会发生变化


  var obj = {

        name: '小明',

        age: 20,

    };

    var o = {};

    //assign(新的对象,旧的对象)

    Object.assign(o, obj);

    console.log(o);


(2)深拷贝,不仅会拷贝数据也会拷贝一份新的地址,所以在改变拷贝后的数据时,拷贝前的数据不会发生变化


   var obj = {

        name: '小明',

        age: 20,

        address: '北京路清河街'

    };

    var o = {};


    function test(newObj, oldObj) {

        for (let k in oldObj) {

            let item = oldObj[k];

            if (item instanceof Array) {

                newObj[k] = [];

                test(newObj[k], item);

            } else if (item instanceof Object) {

                newObj[k] = {};

                tets(newObj[k], item);

            } else {

                newObj[k] = item;

            }

        }

    }

    test(o, obj);

    console.log(o);


25.mouse over和mouseenter区别

(1)mouseover鼠标经过自身盒子会触发,经过子盒子也会触发;mouseEnter只会经过自身盒子触发 (mouseenter不会冒泡)

(2)mouse enter与mouse leave搭配使用;mouse over和mouseout搭配使用


我是小职,记得找我

✅ 解锁高薪工作

✅ 免费获取基础课程·答疑解惑·职业测评

JavaScript面试题总结

本文由 @小职 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程