你们为何如此相似

222 阅读6分钟

前段时间比较闲,没事胡乱看突然想到了这些面试常问的比较性问题,权当是留个笔记吧欢迎补充!

opacity、visibility与display

opacity

DOM结构:opacity属性值为0时透明度为100%,元素隐藏,占据空间,opacity值为0到1,为1时显示元素。 事件监听:可以进行DOM事件监听。 性能:提升为合成层,不会引发重绘,性能较高。 继承:会被子元素继承,子元素不能通过设置opacity:1;来取消隐藏。。 transtion:opacity可以延时显示与隐藏。

visibility

DOM结构:元素被隐藏了,浏览器会渲染visibility属性为hidden的元素,占据空间,意思就是页面上有它的空间,在开发者模式中能选中那个元素。 事件监听:无法进行DOM事件监听。 性能:动态改变此属性时会引起重绘,性能较高。 继承:会被子元素继承,子元素通过设置visibility:visible;来显示自身,使子元素取消自身隐藏。 transtion:visibility会立即显示,隐藏时会延时。

display

DOM结构:浏览器不会渲染display属性为none的元素,不占据空间,意思就是页面上没有它的一席之地,你在开发者模式中选不中那个元素。 事件监听:无法进行DOM事件监听。 性能:动态改变此属性时会引起重排,性能较差。 继承:不会被子元素继承,因为子元素也不被渲染。 transtion过渡不支持display。

disabled与readonly

Readonly和Disabled是用在表单中的两个属性 共同点: 比如都设为true,则form属性将不能被编辑; 不同点:

  • 如果一个输入项的disabled设为true,则该表单输入项不能获取焦点,用户的所有操作(鼠标点击和键盘输入等)对该输入项都无效,最重要的一点是当提交表单时,这个表单输入项将不会被提交。
  • readonly只是针对文本输入框这类可以输入文本的输入项,如果设为true,用户只是不能编辑对应的文本,但是仍然可以聚焦焦点,并且在提交表单的时候,该输入项会作为form的一项提交。

axios与fetch

axios 与 fetch 某种程度上讲,并不是一个层面的

axios

  • axios 是一个基于Promise 用于浏览器和 nodejs 的 HTTP 客户端,本质上也是对原生XHR的封装,只不过它是Promise的实现版本,符合最新的ES规范;

  • 从浏览器中创建 XMLHttpRequest

  • 支持 Promise API

  • 提供一些并发请求的接口(重要,方便了很多的操作)

  • 从 nodejs 创建 http 请求

  • 支持拦截请求和响应

  • 转换请求合响应数据

  • 支持取消请求

  • 自动转换JSON数据

  • 客户端支持防止 CSRF。

  • 客户端支持防御 XSRF。 因为是封装之后的,非要说什么缺点那只能说是需要安装并且对于原生的支持没有fetch那么好吧!

fetch

fetch是一个低层次的API,你可以把它考虑成原生的XHR,所以使用起来并不是那么舒服,需要进行封装。

优点:

  • 语法简洁,更加语义化
  • 基于标准 Promise 实现,支持 async/await
  • 更加底层,无需安装,提供丰富的API
  • 支持jsonp
  • 脱离了 XHR,是ES规范里新的实现方法

缺点:

  • fetch 只对网络请求报错,对于400,500都当做成功的请求,服务请返回400,500错误码时,并不会reject,只有网络错误这些导致请求不能完成时,fetch 才会被 reject
  • fetch 默认不会带 cookie,需要添加配置项:fetch(url,{credentials:'include'})
  • fetch 不支持 abort,不支持超时控制,使用 setTimeout 及promise.reject的实现的超时控制并不能阻止请求过程继续在后台运行,造成了流量的浪费
  • fetch 没有办法原生监听请求的进度,而XHR可以
  • fetch 上传文件时,不支持进度检测

typeof、instanceof与{}.toString.call()

typeof

使用typeof可以判断基本数据类型,但对于对象(进一步区别数组,对象等)引用数据类型 就有局限性了,因为无论你怎么检测,输出都是object类型,比如Date类型、RegExp类型、Null类型,均会返回object类型;

instanceof

可以判断一个实例是否是某个对象的实例,判断已知对象类型的方法,可区分Date类型、RegExp类型、Null类型,但是判端这些类型是不是object类型的实例的时候一样也是成立的,比如[] instanceof Object同样会返回true;

{}.toString.call()

这是对象的一个原生原型扩展函数,用来精确的区分数据类型… toString方法的作用是返回一个对象的字符串形式,默认情况下返回类型字符串。

  • 数值:返回[object Number]。
  • 字符串:返回[object String]。
  • 布尔值:返回[object Boolean]。
  • undefined:返回[object Undefined]。
  • null:返回[object Null]。
  • 数组:返回[object Array]。
  • arguments对象:返回[object Arguments]。
  • 函数:返回[object Function]。
  • Error对象:返回[object Error]。
  • Date对象:返回[object Date]。
  • RegExp对象:返回[object RegExp]。
  • 其他对象:返回[object Object]。

hash与history

hash

  • hash模式较丑, url上带有#;

  • hash只可修改#后面的部分,故只可设置与当前同文档的URL;

  • hash设置的新值必须与原来不一样才会触发记录添加到栈中;

  • hash只可添加短字符串;

  • hash兼容IE8以上; history

  • history模式较优雅;

  • pushState设置的新URL可以是与当前URL同源的任意URL;

  • pushState设置的新URL可以与当前URL一模一样,这样也会把记录添加到栈中;

  • pushState通过stateObject可以添加任意类型的数据到记录中;

  • history兼容IE10以上;

  • history模式需要后端配合将所有访问都指向index.html,否则用户刷新页面,会导致404错误;

proxy与defineProperty

熟悉vue的应该对这两个属性不陌生,vue3升级的一个重要方面就是将原来的响应式数据的处理方式由defineProperty转换成proxy,不在需要遍历处理,从而提升性能;(更深的等回头在补充吧,正好最近在学习vue3.x的源码先欠着 呵呵)

canvas与svg

canvas

  • 依赖分辨率;
  • 不支持事件处理器;
  • 弱的文本渲染能力;
  • 能够以 .png 或 .jpg 格式保存结果图像;
  • 最适合图像密集型的游戏,其中的许多对象会被频繁重绘;
  • Canvas 通过 JavaScript 来绘制 2D 图形;
  • Canvas 是逐像素进行渲染的;
  • 在 canvas 中,一旦图形被绘制完成,它就不会继续得到浏览器的关注。如果其位置发生变化,那么整个场景也需要重新绘制,包括任何或许已被图形覆盖的对象;

svg

  • 不依赖分辨率;
  • 支持事件处理器;
  • 最适合带有大型渲染区域的应用程序(比如谷歌地图);
  • 复杂度高会减慢渲染速度(任何过度使用 DOM 的应用都不快);
  • 不适合游戏应用;
  • SVG 是一种使用 XML 描述 2D 图形的语言。;
  • SVG 基于 XML,这意味着 SVG DOM 中的每个元素都是可用的。您可以为某个元素附加 JavaScript 事件处理器;
  • 在 SVG 中,每个被绘制的图形均被视为对象。如果 SVG 对象的属性发生变化,那么浏览器能够自动重现图形;