前端js面试题(基础)

本文涵盖了前端JavaScript面试中常见的问题,包括类型检测、比较运算符、内置函数、变量类型、JSON理解、数组判断、原型链继承、new操作符的过程、变量提升、this用法、异步编程、DOM操作等,旨在帮助开发者全面复习和准备面试。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

1、js中使用typeof能得到哪些类型?

——undefined、string、number、boolean、object、function

2、===和==分别在何时使用?

 
  1. //==的使用情况为以下2种(其他情况下推荐使用===)

  2. if(obj.a == null){

  3. //相当于obj.a === null || obj.a === undefined

  4. }

  5. function fn(a,b){

  6. if(a == null){

  7. //a要先定义

  8. }

  9. }

3、js中哪些内置函数

——Object、Array、Boolean、Number、String、Function、Date、RegExp、Error

4、js变量按照存储方式区分为哪些类型,并描述其特点

—— 值类型:赋值不会相互干涉;

        引用类型:是指针的赋值,都指向内存空间中的同一个对象,会相互干涉;

5、如何理解json

——js对象(有两个API :JSON.stringify() 、JSON.parse())和数据格式

6、如何准确判断一个变量是数组类型

console.log(arr instanceof Array);

7、写一个原型链继承的例子

 
  1. //DOM封装查询

  2. function Elem(id){

  3. this.elem = document.getElementById(id);

  4. }

  5. Elem.prototype.html = function(val){

  6. var elem = this.elem;

  7. if(val){

  8. elem.innerHTML = val;

  9. return this;

  10. }else{

  11. return elem.innerHTML;

  12. }

  13. }

  14. Elem.prototype.on = function (type,fn){

  15. var elem = this.elem;

  16. elem.addEventListener(type,fn);

  17. return this;

  18. }

  19. var div1 = new Elem('div1');

  20. div1.html('<p>hello world</p>').on('click',function(){

  21. alert('clicked');

  22. }).html('<p>hello javascript</p>');

8、描述new一个对象的过程

—— 1、创建一个新对象
        2、this指向这个新对象
        3、执行代码,即对this赋值
        4、返回this

9、说一下对变量提升的理解

——  变量定义;
         函数声明(注意和函数表达式的区别)

10、说明this几种不同的使用场景

—— 1、作为构造函数执行
        2、作为对象属性执行
        3、作为普通函数执行
        4、call、apply、bind

11、用js创建10个<a>标签,点击的时候弹出来对应的序号

 
  1. var i;

  2. for(i=0;i<10;i++){

  3. (function(i){

  4. var a = document.createElement('a');

  5. a.innerHTML = i + '<br>';

  6. a.addEventListener('click',function(e){

  7. e.preventDefault();

  8. alert(i);

  9. });

  10. document.body.appendChild(a);

  11. })(i);

  12. }

12、如何理解作用域

—— 自由变量
        作用域链,即自由变量的查找
        闭包的两个场景(返回函数、作为参数传递)

13、实际开发中闭包的应用

 
  1. //闭包实际应用中主要用于封装变量,收敛权限

  2. //Exp1

  3. function F1(){

  4. var a =100;

  5. return function(){

  6. console.log(a);

  7. }

  8. }

  9. var f1 = F1();

  10. function F2(fn){

  11. var a = 200;

  12. fn()

  13. }

  14. F2(f1);

  15.  
  16. //Exp2

  17. function ifFirstLoad(){

  18. var _list =[];

  19. return function(id){

  20. if(_list.indexOf(id)>=0){

  21. return false;

  22. }else{

  23. _list.push(id);

  24. return true;

  25. }

  26. }

  27. }

  28. var firstLoad = isFirstLoad();

  29. firstLoad(10); //true

  30. firstLoad(10); //false

14、同步和异步的区别

——同步会阻塞代码执行,而异步不会。

15、setTimeout()

 
  1. console.log(1);

  2. setTimeout(function(){

  3. console.log(2);

  4. },1000);

  5. console.log(3);

//1 3 2

16、前端使用异步的场景有哪些

—— 1、setTimeout、setInverval

        2、ajax请求、动态<img>加载

        3、事件请求

(特点:都需要等待,由js是单线程语言所决定)

17、获取2018-4-26格式的日期

 
  1. function formatDate(dt){

  2. if(!dt){

  3. dt = new Date();

  4. }

  5. var year = dt.getFullYear();

  6. var month = dt.getMonth() + 1;

  7. var date = dt.getDate();

  8. if(month<10){

  9. month = '0' + month;

  10. }

  11. if(date<10){

  12. dae = '0' +date;

  13. }

  14. return year + '-' + month + '-' + date;

  15. }

  16. var dt = new Date();

  17. var formatDate = formatDate(dt);

  18. console.log(formatDate);

18、获取随机数(要求长度一致的字符串格式)

 
  1. var random = Math.random();

  2. var random = random + '0000000000';

  3. var random = random.slice(0,10);

  4. console.log(random);

    (Math.random():随时改变,清除缓存)

19、写一个能遍历对象和数组的通用的forEach函数

 
  1. function forEach(obj,fn){

  2. var key;

  3. if(obj instanceof Array){

  4. obj.forEach(function(item,index){

  5. fn(index,item);

  6. });

  7. }else{

  8. for(key in obj){

  9. fn(key,obj[key]);

  10. }

  11. }

  12. }

  13. var arr = [1,2,3];//数组

  14. forEach(arr,function(index,item){

  15. console.log(index,item);

  16. })

  17. var obj = {x:1,y:2};//对象

  18. forEach(obj,function(key,val){

  19. console.log(key,val);

  20. })

20、DOM是哪种基本的数据结构

——树

21、DOM操作的常用API有哪些

—— 1、获取DOM节点,以及节点的property和Attribute

        2、获取父节点,获取子节点

        3、新增节点,删除节点

(<div><p></p></div>换行与不换行的div的子节点的数量是不一样的)

22、DOM节点的attr和property有何区别

—— property只是一个js对象的属性的修改

        Attribute是对html标签属性的修改

23、如何检查浏览器的类型

 
  1. var ua = navigator.userAgent;

  2. var isChrome = ua.indexOf('Chrome');

  3. console.log(isChrome);

24、拆解url的各部分

 
  1. location.protocal //"https:"

  2. location.host //"blog.csdn.net"

  3. location.pathname //"/hannah1116"

  4. location.search //""

  5. location.hash //""

  6. location.href //"https://blog.csdn.net/hannah1116"

25、编写一个通用的事件监听函数

 
  1. function bindEvent(elem,type,selector,fn){

  2. if(fn == null){

  3. fn = selector;

  4. selector = null;

  5. }

  6. elem.addEventListener(type,function(event){

  7. var target;

  8. if(selector){

  9. target = event.target;

  10. if(target.matches(selector)){

  11. fn.call(target,event);

  12. }else{

  13. fn(event);

  14. }

  15. }

  16. });

  17. }

  18. //使用代理

  19. var div1 = document.getElementById("div1");

  20. bindEvent(div1,'click','a',function(event){

  21. console.log(this.innerHTML);

  22. });

  23. //不使用代理

  24. var a = document.getElementById("a1");

  25. bindEvent(div1,'click',function(event){

  26. console.log(a.innerHTML);

  27. });

26、描述事件冒泡流程

—— DOM树形结构

        事件冒泡

        阻止冒泡

27、对于一个无限下拉加载图片的页面,如何给每个图片绑定事件 

—— 使用代理:代码简洁;减少浏览器内存占用;

28、手动编写一个ajax,不依赖第三方库

 
  1. var xhr = new XMLHttpRequest();

  2. xhr.open("GET","/api",true);

  3. xhr.onreadystatechange = function(){

  4. if(xhr.readyState == 4){//客户端可以使用

  5. if(xhr.status == 200){//表示成功处理请求

  6. alert(xhr.responseText);

  7. }

  8. }

  9. }

  10. xhr.send(null);

29、跨域的几种方式

—— 1、CORS跨域资源共享

        2、图像Ping

        3、JSONP

        4、Comet

        5、服务器发送事件

        6、Web Sockets

30、请描述一下cookie,sessionStorage和localStorage的区别

—— cookie:本身用于客户端和服务器端通信,但是有本地存储的功能

             缺点:存储量太小,只有4KB;所有http请求都带着,会影响获取资源的效率;API简单,需要封装才能用document.cookie = ……

        localStorage和sessionStorage:HTML5专门为存储而设计

             优点:最大容量为5M;API简单易用:loaclStorage.setItem(key,value);localStorage.getItem(key);

             注意:iOS safari隐藏模式下:localStorage.getItem会报错;建议统一使用try-catch封装;

        区别:容量、是否会携带到ajax中、API易用性

31、上线流程和回滚的要点

—— 上线流程要点:

       (1)将测试完成的代码提交到git版本库的master分支

       (2)将当前服务器的代码全部打包并记录版本号,备份

       (3)将master分支的代码提交覆盖到线上服务器,生成新版本号

        回滚流程要点:

       (1)将当前服务器的代码打包并记录版本号,备份

       (2)将备份的上一个版本号解压,覆盖到线上服务器,并生成新的版本号

32、从输入url到得到html的详细过程

—— 1、浏览器根据DNS服务器得到域名的IP地址

        2、向这个IP的机器发送HTTP请求

        3、服务器收到、处理并返回HTTP请求

        4、浏览器得到返回内容

33、window.onload和DOMContentLoaded的区别?

—— window.onload:页面的全部资源加载完才可执行(包括图片、视频)

        DOMContentLoaded:DOM渲染完即可执行(此时图片、视频还没有加载完)

34、加载资源优化

—— 1、静态资源的压缩合并

        2、静态资源缓存

        3、使用CDN让资源加载更快

        4、使用SSR后端渲染,数据直接输出到HTML中

35、渲染优化

—— 1、CSS放前面,JS放后面

        2、懒加载(图片懒加载、下拉加载更多)

        3、减少DOM查询,对DOM查询做缓存

        4、减少DOM操作,多个操作尽量合并在一起执行

        5、事件节流

        6、尽早执行操作(如DOMContentLoaded)

        

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值