2020年web前端面试题(二)

九、CSS隐藏元素的几种方法(至少说出三种)

  Opacity:元素本身依然占据它自己的位置并对网页的布局起作用。它也将响应用户交互;

  Visibility:与 opacity 唯一不同的是它不会响应任何用户交互。此外,元素在读屏软件中也会被隐藏;

  Display:display 设为 none 任何对该元素直接打用户交互操作都不可能生效。此外,读屏软件也不会读到元素的内容。这种方式产生的效果就像元素完全不存在;

  Position:不会影响布局,能让元素保持可以操作;

  Clip-path:clip-path 属性还没有在 IE 或者 Edge 下被完全支持。如果要在你的 clip-path 中使用外部的 SVG 文件,浏览器支持度还要低;

十、如何让一个盒子水平垂直居中

//已知宽高

//未知宽高        Document        
//未知宽高方法二:        Document        


2

JS部分

1、cookie、localStorage、sessionStorage的区别和使用?

cookie:是存储在本地的数据,有时候也用cookies,通常经过加密,应用最经典的就是判断注册用户是否已经登录过该网站。   localStorage:仅在客户端保存(即浏览器),不参与和服务器的通信;没有时间限制,即使浏览器关闭,数据依然存在;

  创建和访问localStorage:

       1)、设置数据:

       var forgetData = {phone:vm.phone};        localStorage.setItem("forgetData",JSON.Stringfy(forgetData));    //forgetData是存储在localStorage里边的本地数据;JSON.Stringfy(forgetData)是将数据转化为字符串格式;

           获取数据:

       vm.forgetData=JSON.parse(localStorage.getItem("forgetData"));  //将对象转化为json;

       2)、设置:localStorage.name = "zhao";

            获取:localStorage.name    //zhao        localStorage.setItem(key,value);//设置数据        localStorage.getItem(key);//获取数据        localStorage.removeItem(key);//删除单个数据        localStorage.clear();//清除所有localStorage的数据

   sessionStorage:当用户的浏览器窗口关闭时,数据会被清除;


   共同点:都是保存在浏览器端,且同源的。

   区别:

       cookie数据始终在同源的http请求中携带9即使不需要),即cookie在浏览器和服务器之间来回传递;cookie数据还有路径的概念,可以限制cookie只属于某个路径下。存储大小限制也不同,cookie数据大小不能超过4K,同时因为每次http请求都会携带cookie,所以cookie只能保存很小的数据。

       sessionStorage和localStorage不会自动把数据发给服务器,只在本地保存,虽然也有大小限制,但是要比cookie大得多,可以达到5M或者更大。

       数据有效期不同,sessionStorage仅在当前浏览器窗口关闭前有效,不能持久保存;localStorage:始终有效,浏览器窗口关闭也一直保存;cookie:只在cookie设置的过期时间之前保存,即使浏览器窗口关闭。

       作用域不同,sessionStorage在不同浏览器窗口的数据不能共享,即使是同一个页面;localStorage在所有的同源窗口中都是共享的;cookie也是在同源窗口中共享的,

2、如何实现浏览器多标签页之间的通信?

   调用localStorage、cookie本地存储方式。

3、JavaScript的typeof返回类型有哪些?

Object(null和Array)、number、undefined、string、Boolean

4、类型转换

强制转换:parseInt();parseFloat();number();

5、数组的方法

var list = [1,2,3];list.pop();//删除数组的最后一个元素 var list = [1,2];list.unshift(0,1);//头部添加  var list = [0,1,1,2,3];list.push(4,5);//尾部添加   var list = [1,2,3,4,5];var arr = list.concat(4,[5,6]);//把两个数组连接起来 //var arr = [1,2,3,4,5];  //var list = [1,2,3];list.join("-");    //1-2-3list.reverse();//3,2,1list.slice(1);//var list = [2,3];list.slice(1,2);//var list = [2];list.slice(1,-2);//设置了两个参数,终止下标为负数,当出现负数时,将负数加上数组长度的值来替换该位置的数。var arr = list.splice(0,1);//删除 var list = [2,3];  var arr = [1];可以删除任意数量的项,只需指定2个参数;要删除的第一项的位置和要删除的项数。例如splice(0,2);会删除当前数组的前两项list.splice(2,0,4,6);//插入,var list = [1,2,4,6,3]; 可以向指定位置插入任意数量的项,需要3个参数,起始位置、0(要删除的项数)、要插入的任意数量的项。例如splice(2,0,4,6);会从第二个位置插入4和6;list.splice(2,1,4,6);//替换,var list = [1,2,6,3]; 可以向指定位置插入任意数量的项,同时删除任意数量的项,需要3个参数,起始位置、要删除的项数、要插入的任意数量的项。例如splice(2,1,4,6);会从位置 2 开始插入4和6。list.sort();//按照第一个数字大小进行排序;function compare(a,b){

   return a-b;//正序;

   return b-a;//倒序;}list.sort(compare);

6、ajax请求时get和post的区别?

get:从服务器上获取数据,传送数据量小,安全性低,请求会被缓存,缓存是针对URL进行缓存的,get请求参数直接加在URL地址后面,一种参数组合就会产生一种URL的缓存,重复的请求结果是相同的;post:向服务器发送数据;传送数据量大,请求不会被缓存,参数封装在二进制的数据体中,服务器也不会记录参数,相对安全,所以涉及用户隐私的数据都要用post传送;

7、ajax请求时,如何解释json数据?

使用eval方法解析的时候,eval();不会去判断该字符串是否合法,而且json对象里的js方法也会被执行,这是非常危险的;推荐使用JSON.parse(); JSON.parse();把字符串转化成json。

8、call和apply的区别?

共同点:

   都可以用来代替另一个对象调用一个方法,将一个函数的对象上下文从初始的上下文改变为由thisObj指定的新对象。

   另一种说法,都能够改变方法的执行上下文(执行环境),将一个对象的方法交给另一个对象来执行,并且是立即执行。

不同点:

   apply();//最多只能有两个参数--新this对象和一个数组argArray,如果给该方法传递多个参数,则把参数都写进这个数组里边,当然,即使只有一个参数,也要写进数组里边。

   call();//可以接收多个参数,第一个参数apply()一样,后面则是一串参数列表。

   实际上,apply和call的功能是一样的,只是传入的参数列表的形式不同。

9、http常用状态码?

   100  Continue  继续,一般在发送post请求时,已发送了http header之后服务端将返回此信息,表示确认,之后发送具体参数信息    200  OK   正常返回信息    201  Created  请求成功并且服务器创建了新的资源    202  Accepted  服务器已接受请求,但尚未处理    301  Moved Permanently  请求的网页已永久移动到新位置。    302 Found  临时性重定向。    303 See Other  临时性重定向,且总是使用 GET 请求新的 URI。    304  Not Modified  自从上次请求后,请求的网页未修改过。    400 Bad Request  服务器无法理解请求的格式,客户端不应当尝试再次使用相同的内容发起请求。    401 Unauthorized  请求未授权。    403 Forbidden  禁止访问。    404 Not Found  找不到如何与 URI 相匹配的资源。    500 Internal Server Error  最常见的服务器端错误。    503 Service Unavailable 服务器端暂时无法处理请求(可能是过载或维护)。

10.你有哪些性能优化的方法?

   (详情请看雅虎14条性能优化原则)。

     (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) 图片预加载,将样式表放在顶部,将脚本放在底部  加上时间戳。

11.深拷贝和浅拷贝

   基本类型指的是简单的数据段,引用类型指的是多个值构成的对象;    var name = "John"; // 基本类型值

   var obj = new Object();

   obj.name = "John";

   // obj 为引用类型值


   在复制变量中,对于基本类型来说,两者互不影响,    var num = 1;    var num1 = num; // num1 = 1;

   var num1 = 3; // num还是1,不会变


   浅拷贝和深拷贝的区别:

   对于浅拷贝来说,对于一个数组(数组是一个对象),只要我们修改了一个拷贝数组,原数组也会跟着改变。

   因为他们引用的是同一个地址的数据,拷贝的时候并没有给b数组创造独立的内存,只是把a数组指向数据的指针拷贝给了b;

   而深拷贝就与其相反,将会给b数组创造独立的内存,并且将a数组的内容一一拷贝进来,两者互不影响。


   实现深拷贝:

   一:层级拷贝,用递归实现;

   二:JSON解析        var b = JSON.parse(JSON.stringify(a));        

在这里我还是要推荐下我自己建的web前端开发学习群:849574952,群里都是学web前端开发的,如果你正在学习前端 ,小编欢迎你加入,今天分享的这个案例已经上传到群文件,大家都是软件开发党,不定期分享干货(只有前端软件开发相关的),包括我自己整理的一份2020最新的前端进阶资料和高级开发教程,欢迎进阶中和进想深入前端的小伙伴。

3

其他  

一、怎么让Chrome支持小于12px 的文字?

这个我们在做移动端的时候,设计师图片上的文字假如是10px,我们实现在网页上之后。往往设计师回来找我们,这个字体能小一些吗?我设计的是10px?为啥是12px?其实我们都知道,谷歌Chrome最小字体是12px,不管你设置成8px还是10px,在浏览器中只会显示12px,那么如何解决这个坑爹的问题呢?

我们的做法是:

针对谷歌浏览器内核,加webkit前缀,用transform:scale()这个属性进行缩放!

haorooms博客测试10px

二、IOS手机浏览器字体齿轮

修改-webkit-font-smoothing属性,结果是:-webkit-font-smoothing:none:无抗锯齿-webkit-font-smoothing: antialiased | subpixel-antialiased |default:灰度平滑

三、如何修改chrome记住密码后自动填充表单的黄色背景?

大体可以通过input : -webkit-autofill来进行修改!

input:-webkit-autofill {background-color:#FAFFBD;background-image: none;color:#000;}

四、谷歌浏览器运行下面代码,并解释!

[].forEach.call($$("*"),function(a){ a.style.outline="1px solid #"+(~~(Math.random()*(1<<24))).toString(16)})

运行上面代码之后,会发现HTML层都被使用不同的颜色添加了一个高亮的边框。为什么会这样呢?

首先我们来看

[].forEach.call(),关于call()和apply(),我前面有文章也写过,具体可以看http://www.haorooms.com/post/js_constructor_pro

[].forEach.call()等价于Array.prototype.forEach.call()

其次我们来看$$("*")

你可以在你的Chrome浏览器控制台中输入$$('a'),然后你就能得到一个当前页面中所有锚元素的列表。

函数是许多现代浏览器命令行API中的一个部分,它等价于document.querySelectorAll,你可以将一个CSS选择器作为这个函数的参数,然后你就能够获得当前页面中所有匹配这个CSS选择器的元素列表。如果你在浏览器控制台以外的地方,你可以使用document.querySelectorAll(′′)来代替

函数是许多现代浏览器命令行API中的一个部分,它等价于document.querySelectorAll,你可以将一个CSS选择器作为这个函数的参数,然后你就能够获得当前页面中所有匹配这个CSS选择器的元素列表。如果你在浏览器控制台以外的地方,你可以使用document.querySelectorAll(″)来代替

('')

为元素添加颜色

为了让元素都有一个漂亮的边框,我们在上面的代码中使用了CSS属性outline。outline属性位于CSS盒模型之外,因此它并不影响元素的属性或者元素在布局中的位置,这对于我们来说非常有用。这个属性和修改border属性非常类似,因此下面的代码应该不会很难理解:

a.style.outline="1px solid #"+ color

真正有趣的地方在于定义颜色部分:

(~~(Math.random()*(1<<24))).toString(16)

~~的作用相当于parseInt,和我前面讲解的“|”功能类似,关于运算符“I” ,可以去看看!

通过上面代码可以获取到一个随机的颜色值!

五、input [type=search] 搜索框右侧小图标如何美化?

美化效果如下图:

右侧默认的比较难看的按钮,美化成右侧效果。

input[type="search"]::-webkit-search-cancel-button{-webkit-appearance: none;height:15px;width:15px;border-radius:8px;background:url("images/searchicon.png")no-repeat 00;background-size:15px15px;}

用到的是伪元素::-webkit-search-cancel-button,关于什么是伪类和为元素,请看:http://www.haorooms.com/post/css_wl_wys

六、iOS safari 如何阻止“橡皮筋效果”?

可以参考一下知乎上的回答 https://www.zhihu.com/question/22256539 。

但是,我们遇到的问题不是这样,我是要解决弹跳导致弹出层(position:absolute)的覆盖层高度小于100%;

针对这个问题,我想到的解决方案如下:

方法一: 把position:absolute改成position:fixed,并在弹出层之后,设置body的高度是100%;overflow是hidden。

方法二:

思路是获取苹果浏览器导航栏的高度。然后滚动的时候,重新获取其高度。在导航栏高度变小的时候,给弹出层增加高度的百分比!

代码如下:

//ios safari 伸缩判断var topbarHeight=window.outerHeight-window.innerHeight,agent=navigator.userAgent,globleflag=true;

       $(window).scroll(function(){if(agent.indexOf("iPhone")!=-1|| agent.indexOf("iPad")!=-1){var topbarHeightNow=window.outerHeight-window.innerHeight;if(topbarHeightNow

                   globleflag=false//此处写处理逻辑}else{

                globleflag=true//此处写处理逻辑}}});

七、实现点击文字,文字后面radio选中效果

这个效果是前端很经常用到和遇到的效果了,实现这个效果的方式也很多,很多朋友用js和jquery来实现,但是最简单的,我们可以直接用lable标签的 for 属性来实现。

看下下面例子:

Male
Female

label 的for属性后面跟着input的id,就可以点击label,来触发input效果了,大家可以试一试!

八、网站中,图片文件(jpg,png,gif),如何点击下载?而非点击预览?

我们平时在网站中的图片,假如我们要下载,如下写:

下载

我们点击下载按钮,只会预览“haorooms博客.jpg”这张图片,并不会出现下载框,另存为那种?那么我们如何做呢?

我们只需要如下写

下载

就可以下载了。点击如下进行尝试吧!下载

不但如次,我们还可以指定文件名称,如下写法:

下载

测试如下:下载

上面就是指定下载的写法!

九、Math.min()比Math.max()大

Math.min()Math.max()// true

因为Math.min() 返回 Infinity, 而 Math.max()返回 -Infinity。



原文链接:https://blog.csdn.net/Raleway/article/details/104268283

你可能感兴趣的:(2020年web前端面试题(二))