如何检测数据类型
首先,要知道总共有几种数据类型,截至今日,共分7种基本数据类型:string, number, bigint, boolean, null, undefined, symbol和object类型,总共8种。
常见的方式是使用typeof
方法,基本数据类型都可以返回,还可以判断方法,其余统一返回”object”,注意,其中typeof null === ‘object’
数据 | 输出值 |
---|---|
Undefined | “undefined” |
Null | “object” |
Boolean | “boolean” |
Number | “number” |
BigInt | “bigint” |
String | “string” |
Symbol | “symbol” |
宿主对象 | 取决于具体实现 |
Function 对象 | “function” |
其他任何对象 | “object” |
这种方式很便捷,但不能检测出数组类型。
ES6中数组新增isArray方法也可以用来检测
那有没有更普适的方法呢?答案是有的,使用Object.prototype.toString()
方法:
示例:
此方法会返回形如[object XXX]
格式的字符串,其中XXX可以用来判断我们的数据类型
GET和POST请求的区别
GET和POST是什么?HTTP协议中的两种发送请求的方法。
HTTP是什么?HTTP是基于TCP/IP的关于数据如何在万维网中如何通信的协议。
HTTP的底层是TCP/IP。所以GET和POST的底层也是TCP/IP,也就是说,GET/POST都是TCP链接。GET和POST能做的事情是一样一样的。你要给GET加上request body,给POST带上url参数,技术上是完全行的通的。
GET产生一个TCP数据包;POST产生两个TCP数据包。
对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据);
而对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)。
参考自w3schools:
GET在浏览器回退时是无害的,而POST会再次提交请求。
GET产生的URL地址可以被Bookmark,而POST不可以。
GET请求会被浏览器主动cache,而POST不会,除非手动设置。
GET请求只能进行url编码,而POST支持多种编码方式。
GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。
GET请求在URL中传送的参数是有长度限制的,而POST么有。
对参数的数据类型,GET只接受ASCII字符,而POST没有限制。
GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息。
GET参数通过URL传递,POST放在Request body中。
GET和POST最大的区别主要是GET请求是幂等性的,POST请求不是。
什么是幂等性?幂等性是指一次和多次请求某一个资源应该具有同样的副作用。简单来说意味着对同一URL的多个请求应该返回同样的结果。
反转链表
leetcode206题: https://leetcode-cn.com/problems/reverse-linked-list/submissions/
1 | var reverseList = function(head) { |
如何自我介绍
自我介绍要突出工作经历,学历、背景突出的话也可以说一句,介绍项目可以简单说一下业务,主要围绕使用技术栈、个人负责内容、以及做了哪些额外工作,比如优化了多少代码、达到了什么效果,抽离了多少组件,提高了开发效率。
介绍最后可以简单说下换工作的原因,有一次介绍完之后面试官直接问我换工作的原因,我回答除了业务开发,也想参与技术项目,使用的技术栈也可以更丰富些,然而经过一些交流发现对方和我目前的处境类似,所以就没有再进行下去了。(当然如果对换工作比较急、或者手上没有满意的offer时慎重,面试官可能觉得你对工作内容比较“挑剔”,面试本来就是双向选择的过程)
网页性能优化方法
开放性题目,回答首先要说出业内默认会做的;然后再说出几条个人比较了解的
常见的推荐雅虎35条军规:https://www.cnblogs.com/xianyulaodi/p/5755079.html
或者精简版14条:https://www.jianshu.com/p/a6f197934cf5。
上面提到的多而全,可能有的平时已经在做了但没感觉到而已;
(1) 减少http请求次数:CSS Sprites, JS、CSS源码压缩、图片大小控制合适;网页Gzip,CDN托管,data缓存 ,图片服务器。
(2) 前端模板 JS+数据,减少由于HTML标签导致的带宽浪费,前端用变量保存AJAX请求结果,每次操作本地变量,不用请求,减少请求次数
(3) 用innerHTML代替DOM操作,减少DOM操作次数,优化javascript性能。
(4) 当需要设置的样式很多时设置className而不是直接操作style。
(5) 少用全局变量、缓存DOM节点查找的结果。减少IO读取操作。
(6) 避免使用CSS Expression(css表达式)又称Dynamic properties(动态属性)。
(7) 图片预加载,将样式表放在顶部,将脚本放在底部 加上时间戳。
(8) 避免在页面的主体布局中使用table,table要等其中的内容完全下载之后才会显示出来,显示比div+css布局慢。
对普通的网站有一个统一的思路,就是尽量向前端优化、减少数据库操作、减少磁盘IO。向前端优化指的是,在不影响功能和体验的情况下,能在浏览器执行的不要在服务端执行,能在缓存服务器上直接返回的不要到应用服务器,程序能直接取得的结果不要到外部取得,本机内能取得的数据不要到远程取,内存能取到的不要到磁盘取,缓存中有的不要去数据库查询。减少数据库操作指减少更新次数、缓存结果减少查询次数、将数据库执行的操作尽可能的让你的程序完成(例如join查询),减少磁盘IO指尽量不使用文件系统作为缓存、减少读写文件次数等。程序优化永远要优化慢的部分,换语言是无法“优化”的。
一般情况可以满足面试官要求了,但这些都是普适的,还要根据自身经历说出几点。
JS优化
图片优化
前端路由实现原理:hash与history模式
网站最开始都是多页的,每个页面都对应一个完整结构的HTML文件,这样每次操作都会重新请求数据,造成资源浪费。
Ajax技术兴起,慢慢出现了SPA(单页应用),整个应用都在一个HTML文件上,大大减少数据请求,交互体验也变得更加流畅。
单页也有它的弊端,无法保留用户状态,页面刷新又恢复初始状态。这时就需要前端路由了。
DFS(深度优先搜索)&BFS(广度优先搜索)
深度优先搜索
基本原理就是不断对子节点进行深度优先搜索,递归思想:
1 |
|
广度优先搜索
借助队列数据结构,现将根结点入队,然后出队,访问节点并入队所有子节点。然后重复入队这些子节点,知道队列为空
1 | function bfs(root) { |
https://www.geeksforgeeks.org/inorder-tree-traversal-without-recursion/
https://stackoverflow.com/questions/5278580/non-recursive-depth-first-search-algorithm
例如,树结构是这样的:
1 |
|
DFS输出:
https://www.geeksforgeeks.org/iterative-postorder-traversal-using-stack/?ref=rp
https://www.techiedelight.com/postorder-tree-traversal-iterative-recursive/
如何理解BFC
MDN定义:
块格式化上下文(Block Formatting Context,BFC) 是Web页面的可视CSS渲染的一部分,是块盒子的布局过程发生的区域,也是浮动元素与其他元素交互的区域。
实现嵌套数组层次展开
一道高频面试题,方法有很多,基本思想都是递归。