前端面试题整理—JavaScript篇

1、JS的基本数据类型和引用数据类型

  基本类型->string、number、Boolean、null、undefined、symbol

  引用类型->array、object、function

2、数据类型中为假的有哪些?

  false (布尔型)

  0(数值型)

  null(定义空的或者不存在,现在没有,将来可能有)

  undefined(未定义,一直不存在)

  NaN(不是一个有效数字)

  空字符串(空字符串,字符类型)

3、举例JavaScript的基本规范,以及如何编写高性能代码

  基本规范

  1)代码缩进,建议使用“四个空格”缩进

  2)语句结束使用分号

  3)变量和函数在使用前进行声明

  4)以大写字母开头命名构造函数,全大写命名常量

  5)使用ID最好先获取一下

  6)规范定义JSON对象,补全双引号

  

  1)遵循严格模式:"use strict";

  2)将js脚本放在页面底部,加快渲染页面

  3)尽量减少使用闭包

  4)尽量使用直接量创建对象和数组

  5)尽量减少对象成员嵌套

  6)最小化重绘(repaint)和回流(reflow)

4、JS有哪些内置对象

  Object、Array、Boolean、Number、String、Function、Arguments、Math、Date、RegExp

  ES6新增对象:Symbol、Map、Set、Promises、Proxy

5、怎么实现string和number的相互转换

  String 转换成 Number:Number()、parseInt()、parseFloat()

  Number 转换成 String:String()、toString() 

6、怎么创建、添加、替换、克隆、删除元素

  创建-> document.createElement('标签名')
  添加-> parent.appendChild()   
      parent.insertBefore(新插入的元素,老元素)  
  替换-> replaceChild(new,old)
  克隆-> cloneChild()
  删除->removeChild()

7、什么情况下会转为字符串

  1)基于alert、confirm、document.write等输出内容时,会先把值转为字符串后在输出

  2)基于'+'进行字符串拼接时

  3)把复合类型值转换数字时候。首先会转换字符串然后再转为数字

  4)给对象设置属性名时候,如果不是字符串 先转为字符串,然后在作为属性存储到对象中(对象属性只能是字符串和数字)

  5)手动调用toString、toFixed(将 Number 四舍五入为指定小数位数的数字)、join、String方法时候,也是为了转换字符串

8、获取对象属性[]和.的区别

  .后面的是这个对象的属性,凡是用.的地方都可以用[]

  []中括号的内容可以是字符串也可以是变量,基本上[]放的是变量

9、null和undefined的区别

  Null:代表空对象指针。现在没有,将来可能会有

  undefined:空,未定义。现在没有,将来也不会有(Js中独有的数据类型)

10、检测数据类型的几种方式,以及他们的对比

  typeof、instanceof、constructor、Object.prototype.toString.call()

  typeof只针对基本数据类型,遇到引用数据类型是不起作用的(无法细分对象)

  instanceof用来判断对象和函数,不适合判断字符串和数字

  constructor是Object其中的一个属性。默认指向实例的构造函数

  通过Object.prototype.toString方法,判断某个对象值属于哪种内置类型

11、in 与 hasOwnProperty

  两者都代表查看某个属性是不是自己的

  in判断的是对象的所有属性,包括对象实例及其原型的属性

  hasOwnProperty则是判断对象实例的是否具有某个属性

12、innerHTML和innerText区别

  innerHTML可以获取结构和文本

  innerText只获取文本内容

13、如何清除一个定时器?

  clearTimeout(timer)

14、说一下倒计时原理及公式

  未来时间-现在时间= 剩余时间

        let d = Math.floor(t/86400);
        t % =86400;
        let h = Math.floor(t/3600);
        t % = 3600;
        let m = Math.floor(t/60);
        t % = 60;

15、何时使用 === 何时使用 ==

  判断对象的属性是否存在可以使用双等,其余都用全等

  ===更严谨,不仅值相等类型也要相等,不用进行类型转换,并且比==速度快

16、eval 是做什么的?

  它的功能是把对应的字符串解析成JS代码并运行

  由JSON字符串转换为JSON对象的时候可以用 eval('('+ str +')');

  应避免使用eval,因为不安全,耗性能

17、数组常用的一些方法有哪些 

  push()向数组末尾添加数据
  pop()删除数组最后一项
  unshift()向数组首位添加新内容
  shift()删除数组的第一项
  slice()按照条件查找出其中的部分内容
  splice()对数组进行增删改
  join()用指定的分隔符对数组拼接
  concat()用于连接两个或多个数组
  indexOf()/lastIndexOf()当前值在数组中第一次/最后一次出现的位置索引
  includes()判断一个数组是否包含指定的值
  sort()对数组进行排序
  reverse()把数组倒过来排列
  forEach()循环遍历数组每一项

18、说一下什么是DOM映射机制

  通过DOM中方法获取到的元素,与页面一一对应的这种关系称之为DOM映射

  querySelectorAll获取到的元素集合没有DOM映射,必须是元素的内置属性发生变化,浏览器才能监听得到

19、一行代码实现数组去重

[...new Set([1,2,3,4])]

20、节点类型都有哪些,如何判断当前节点类型

  1元素节点,2属性节点,3文本节点,8注释节点、9文档节点

  通过nodeObject.nodeType判断节点类型,其中,nodeObject为节点对象

  该属性返回以数字表示的节点类型,例如,元素节点返回1,属性节点返回2

21、重绘和回流(重排)区别,什么情况会触发重排和重绘

  当页面元素(宽高,位置)发生改变,回导致页面重排,浏览器会根据新位置进行重新渲染

  回流必将引起重绘,而重绘不一定会引起回流。重绘相对于回流性能消耗较低

  

  任何改变用来构建渲染树的信息都会导致一次重排或重绘

  比如添加、删除、更新DOM节点,通过display: none隐藏,调整样式属性,调整窗口大小,滚动等等

22、如何最小化重绘(repaint)和回流(reflow)

  1)需要对元素进行复杂的操作时,可以先display:none隐藏,操作完再显示

  2)需要创建多个DOM节点时,使用DocumentFragment创建完后一次性的加入document

  3)尽量避免用table布局

  4)避免使用css表达式(expression),每次调用都会重新计算值(包括加载页面)

  5)尽量使用css简写,如:用border代替border-width,border-style, border-color

23、什么是自执行函数,用于什么场景

   自执行函数,即定义和调用合为一体,比如匿名函数自执行

  他可以创建一个独立作用域,防止作用域污染,防止变量影响到全局,以免产生冲突

  多用于框架和插件

24、改变this指向的方法

  call、apply、bind

  call和apply可以自动执行,bind需要手动调用,返回值为函数

  call和bind都有无数个参数,apply只有两个参数,并且第二个为数组

25、iframe的优缺点

  优点:

  1)iframe能够原封不动的把嵌入的网页展现出来

  2)头部和底部一样时可以写成一个页面,用iframe来嵌套,可以增加代码的可重用

  3)引用多个页面,只需要修改iframe的内容,就可以实现页面内容的更改

  缺点:

  不容易管理、用户体验度差、不利于搜索引擎优化、兼容性差、增加服务器的http请求,一般用Ajax来代替iframe

26、类数组转数组的方法

  Array.from

  Array.prototype.slice.call

   [].slice.call

27、请解释什么是暂时性死区

  let 和 const 声明的变量不存在变量提升,其作用域都是块级作用域,凡是在声明变量之前使用变量就会报错,

  所以,在代码块内,使用let命令声明变量之前,该变量都是不可用的。这在语法上,称为“暂时性死区”

28、严格模式与非严格模式的区别

  非严格模式又被被称为懒散模式

  严格模式 use strict是一种ECMAscript 5添加的运行模式,这种模式使得 Js在更严格的条件下运行,使JS编码更加规范化

  消除Javascript语法的一些不合理、不严谨之处,减少一些怪异行为。

  严格模式中变量必须显示声明

  在严格模式下,arguments和eval是关键字,不能被修改

  在严格模式下,函数的形参也不可以同名

29、验证手机号码和邮箱的正则表达式

  手机号码验证

/^(13[0-9]|14[5-9]|15[012356789]|166|17[0-8]|18[0-9]|19[8-9])[0-9]{8}$/

  邮箱验证

^[A-Za-z]\w{3,17}@[1-9A-Za-z]{2,8}\.(com|cn|net)$

30、window 和document常见的方法和属性

  Window对象常见的属性:  

  top 代表当前所有窗口的最顶层窗口
  parent 指当前窗口的父窗口
  self 指当前窗口
  status 指定当前窗口状态栏中的信息

  Window对象常见的方法:

  alert 显示带有一个“确定”按钮的对话框
  confirm 显示带有“确定”和“取消”两个按钮的对话框
  open 打开一个新的窗口
  close 关闭用户打开的窗口

  Document常见属性: 

  title 设置文档标题,也就是html的标签
  bgColor 设置页面的背景色
  URL 设置url属性
  fileSize 文件大小

  Document常见的方法:  

  write() 动态向页面写入内容
  createElement(Tag) 创建一个HTML标签
  getElementById(ID) 获得指定id的对象
  getElementsByName(Name) 获得之前Name的对象

31、如何添加HTML元素的事件,有几种方法

  标签之中直接添加 onclick="fn()"

  JS添加 btn.onclick = method

  绑定事件 obj.addEventListener('click', method, false)

32、使用js去除字符串空格

  str.trim()

  使用replace正则匹配str.replace(/\s*/g,"")

猜你喜欢

转载自www.cnblogs.com/theblogs/p/10624726.html