94道JavaScript笔试面试题(一)

本文汇总了94道JavaScript面试题目,涵盖数据类型、函数、对象、DOM操作、事件处理等多个方面,帮助读者深入理解JavaScript基础知识和常见问题。包括continue和break的区别、i++与++i、数据类型、自调函数、slice和splice的用法、变量提前、DOM操作的属性方法对比、事件处理和垃圾回收等重点内容。
摘要由CSDN通过智能技术生成

1. continue和 break有什么区别?

continue跳出当前循环,继续下一次循环
break终止整个循环,不再继续

2.i++和++i的区别?

i++ 先运算,再自增
++i 先自增,再运算

3.JavaScript都有哪些数据类型?

6种原始数据类型:

  • Boolean: 布尔表示一个逻辑实体,可以有两个值:true 和 false
  • Number: 用于表示数字类型
  • String: 用于表示文本数据
  • Null: Null 类型只有一个值: null,特指对象的值未设置
  • Undefined: 一个没有被赋值的变量会有个默认值 undefined
  • Symbol: 符号(Symbols)是ECMAScript第6版新定义的。符号类型是唯一的并且是不可修改的 引用类型:array,object,函数,正则表达式

引用类型:array,object,函数,正则表达式

4.自调函数是什么?用于什么地方

(function(){})()
创建一个局部作用域,防止全局污染

5.slice和splice有什么区别?

slice(s,e)可以截取数组或字符串
splice(s,count,e1,e2...)可以删除或添加数组元素

slice -- “读取”数组指定的元素,不会对原数组进行修改

  • 语法:arr.slice(start, end)
  • start 指定选取开始位置(含)
  • end 指定选取结束位置(不含)

splice - “操作”数组指定的元素,会修改原数组,返回被删除的元素 - 语法:arr.splice(index, count, [insert Elements]) - index 是操作的起始位置 - count = 0 插入元素,count > 0 删除元素 - [insert Elements] 向数组新插入的元素

6.typeof返回的类型有哪些(6个)?

number、string、boolean、undefined、object、function

7.取1~11之间的随机数(即不包括1不包括11)?

parseInt(Math.random()*10+1)
或
Math.floor(Math.random()*10+1)

8.什么是变量提前?

使用var关键字声明的变量,会将声明提升到所在作用域的最前面

9.push、pop、shift和unshift区别?

push和pop在数组的尾部(栈顶)添加/删除 栈---后进先出
unshift和shift在数组的头部(栈底)添加/删除

10.列举4种强制类型转换和3种隐式类型转换?

强制类型:
    Number()、parseInt()、parseFloat()、toString()
隐式类型:
    字符串+数字--->数字转换成字符串
    字符串+布尔--->布尔转成字符串
    数字+布尔----->布尔转数字

11.函数声明与函数表达式的区别?

相同点:两者都是创建函数
不同点:函数声明时存在函数声明提前,而函数表达式不存在声明提前

12.JS中有哪些内置函数(对象)?

11个:String、Number、Boolean、Array、Math、Date、Object、Function、Error、RegExp、Global

13.Math相关的函数(10个)?

1)Math.PI-----------取圆周率
2)Math.abs()--------取绝对值
3)Math.ceil()-------向上取整
4)Math.floor()------向下取整
5)Math.round()------四舍五入
6)Math.max()--------取一组数字的最大值
7)Math.min()--------取一组数字的最小值
8)Math.pow(x,y)-----取x的y次幂
9)Math.random()-----取随机数,范围[0.1)
10)Math.sqrt()-------取开方

14.null和undefined的区别?

undefined:声明变量但未初始化时,返回的值就是undefined
null:访问一个尚不存在的对象时所返回的值,可以把null看做空的对象,但本身不是对象
  • null表示"没有对象",即该处不应该有值

        典型用法:作为函数的参数,表示该函数的参数不是对象 作为对象原型链的终点

  • undefined表示"缺少值",就是此处应该有一个值,但是还没有定义

         典型用法:变量被声明了,但没有赋值时,就等于undefined 调用函数时,应该提供的参数没有提供,该参数等于undefined 对象没有赋值的属性,该属性的值为undefined 函数没有返回值时,默认返回undefined

15.==和===有什么不同?

==:抽象相等,比较时,会先进行类型的转换,然后再比较值
===:数值和数据类型都必须相等

16.JavaScript 的组成

JavaScript 由以下三部分组成:

  • ECMAScript(核心):JavaScript 语言基础
  • DOM(文档对象模型):规定了访问 HTML 和 XML 的接口
  • BOM(浏览器对象模型):提供了浏览器窗口之间进行交互的对象和方法

17.检测浏览器版本版本有哪些方式?

  • 根据 navigator.userAgent // UA.toLowerCase().indexOf('chrome')
  • 根据 window 对象的成员 // 'ActiveXObject' in window

18.介绍 JS 有哪些内置对象?

  • 数据封装类对象:Object、Array、Boolean、Number、String
  • 其他对象:Function、Arguments、Math、Date、RegExp、Error
  • ES6 新增对象:Symbol、Map、Set、Promises、Proxy、Reflect

19.说几条写 JavaScript 的基本规范?

  • 代码缩进,建议使用“四个空格”缩进
  • 代码段使用花括号{}包裹
  • 语句结束使用分号;
  • 变量和函数在使用前进行声明
  • 以大写字母开头命名构造函数,全大写命名常量
  • 规范定义 JSON 对象,补全双引号
  • 用{}和[]声明对象和数组

20.如何编写高性能的 JavaScript?

  • 遵循严格模式:"use strict";
  • 将 js 脚本放在页面底部,加快渲染页面
  • 将 js 脚本将脚本成组打包,减少请求
  • 使用非阻塞方式下载 js 脚本
  • 尽量使用局部变量来保存全局变量
  • 尽量减少使用闭包
  • 使用 window 对象属性方法时,省略 window
  • 尽量减少对象成员嵌套
  • 缓存 DOM 节点的访问
  • 通过避免使用 eval() 和 Function() 构造器
  • 给 setTimeout() 和 setInterval() 传递函数而不是字符串作为参数
  • 尽量使用直接量创建对象和数组
  • 最小化重绘(repaint)和回流(reflow)

21.DOM 元素 e 的 e.getAttribute(propName)和 e.propName 有什么区别和联系

  • e.getAttribute(),是标准 DOM 操作文档元素属性的方法,具有通用性可在任意文档上使用,返回元素在源文件中设置的属性
  • e.propName 通常是在 HTML 文档中访问特定元素的特性,浏览器解析元素后生成对应对象(如 a 标签生成 HTMLAnchorElement),这些对象的特性会根据特定规则结合属性设置得到,对于没有对应特性的属性,只能使用 getAttribute 进行访问
  • e.getAttribute()返回值是源文件中设置的值,类型是字符串或者 null(有的实现返回"")
  • e.propName 返回值可能是字符串、布尔值、对象、undefined 等
  • 大部分 attribute 与 property 是一一对应关系,修改其中一个会影响另一个,如 id,title 等属性
  • 一些布尔属性<input hidden/>的检测设置需要 hasAttribute 和 removeAttribute 来完成,或者设置对应 property
  • <a href="../index.html">link</a>中 href 属性,转换成 property 的时候需要通过转换得到完整 URL
  • 一些 attribute 和 property 不是一一对应如:form 控件中<input value="hello"/>对应的是 defaultValue,修改或设置 value property 修改的是控件当前值,setAttribute 修改 value 属性不会改变 value property

22.offsetWidth/offsetHeight,clientWidth/clientHeight 与 scrollWidth/scrollHeight 的区别

  • offsetWidth/offsetHeight 返回值包含 content + padding + border,效果与 e.getBoundingClientRect()相同
  • clientWidth/clientHeight 返回值只包含 content + padding,如果有滚动条,也不包含滚动条
  • scrollWidth/scrollHeight 返回值包含 content + padding + 溢出内容的尺寸

23.描述浏览器的渲染过程,DOM 树和渲染树的区别?

浏览器的渲染过程:

  • 解析 HTML 构建 DOM(DOM 树),并行请求 css/image/js
  • CSS 文件下载完成,开始构建 CSSOM(CSS 树)
  • CSSOM 构建结束后,和 DOM 一起生成 Render Tree(渲染树)
  • 布局(Layout):计算出每个节点在屏幕中的位置
  • 显示(Painting):通过显卡把页面画到屏幕上

DOM 树 和 渲染树 的区别:

  • DOM 树与 HTML 标签一一对应,包括 head 和隐藏元素
  • 渲染树不包括 head 和隐藏元素,大段文本的每一个行都是独立节点,每一个节点都有对应的 css 属性

24.重绘和回流(重排)的区别和关系?

  • 重绘:当渲染树中的元素外观(如:颜色)发生改变,不影响布局时,产生重绘
  • 回流:当渲染树中的元素的布局(如:尺寸、位置、隐藏/状态状态)发生改变时,产生重绘回流
  • 注意:JS 获取 Layout 属性值(如:offsetLeft、scrollTop、getComputedStyle 等)也会引起回流。因为浏览器需要通过回流计算最新值
  • 回流必将引起重绘,而重绘不一定会引起回流

25.如何最小化重绘(repaint)和回流(reflow)?

  • 需要要对元素进行复杂的操作时,可以先隐藏(display:"none"),操作完成后再显示
  • 需要创建多个 DOM 节点时,使用 DocumentFragment 创建完后一次性的加入 document
  • 缓存 Layout 属性值,如:var left = elem.offsetLeft; 这样,多次使用 left 只产生一次回流
  • 尽量避免用 table 布局(table 元素一旦触发回流就会导致 table 里所有的其它元素回流)
  • 避免使用 css 表达式(expression),因为每次调用都会重新计算值(包括加载页面)
  • 尽量使用 css 属性简写,如:用 border 代替 border-width, border-style, border-color

    批量修改元素样式:elem.className 和 elem.style.cssText 代替 elem.style.xxx

26.script 的位置是否会影响首屏显示时间?

  • 在解析 HTML 生成 DOM 过程中,js 文件的下载是并行的,不需要 DOM 处理到 script 节点。因此,script 的位置不影响首屏显示的开始时间。
  • 浏览器解析 HTML 是自上而下的线性过程,script 作为 HTML 的一部分同样遵循这个原则
  • 因此,script 会延迟 DomContentLoad,只显示其上部分首屏内容,从而影响首屏显示的完成时间

27.解释 JavaScript 中的作用域与变量声明提升?

JavaScript 作用域:

  • 在 Java、C 等语言中,作用域为 for 语句、if 语句或{}内的一块区域,称为作用域;
  • 而在 JavaScript 中,作用域为 function(){}内的区域,称为函数作用域。

JavaScript 变量声明提升:

  • 在 JavaScript 中,函数声明与变量声明经常被 JavaScript 引擎隐式地提升到当前作用域的顶部。
  • 声明语句中的赋值部分并不会被提升,只有名称被提升
  • 函数声明的优先级高于变量,如果变量名跟函数名相同且未赋值,则函数声明会覆盖变量声明
  • 如果函数有多个同名参数,那么最后一个参数(即使没有定义)会覆盖前面的同名参数

28.介绍 JavaScript 的原型,原型链?有什么特点?

原型:

  • JavaScript 的所有对象中都包含了一个 [proto] 内部
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值