笔者最近经历了一波面试的摧残,所以准备奋笔疾书,整理一下面试或者笔试中会问到的一些题,希望可以给各位提供一些帮助,笔者也祝面试前端的哥哥姐姐弟弟妹妹们能够顺利通过,加油,奥利给!


1.css超出部分省略如何设置?

  1. overflow: hidden;
  2. text-overflow: ellipsis;
  3. white-space: nowrap;

2.简述下src跟href的区别?

  • src主要用于替换当前元素, href用于在当前文档和引用资源之间确立联系,
  • src是source的缩写,指向外部资源的位置,指向的内容将会嵌入到文档中当前标签所在位置,href是 Hypertext Reference的缩写,指向网络资源所在位置,建立和当前元素(锚点)或当前文档链接之间的链接.

    3.写一个简单的$.ajax()的请求方式

    1. $.ajax({
    2. // 请求地址
    3. url: 'user1.php',
    4. // 请求方式
    5. type: 'get',
    6. // 设置请求参数
    7. data: {id: 1},
    8. // 设置响应体的类型,一旦设置该项就不再关心服务端响应的 Coontent-Type
    9. dataType: 'json',
    10. // 在请求发送前执行的函数,可以用来设置自定义HTTP头信息等
    11. beforeSend: function(xhr) {
    12. console.log('beforeSend',xhr);
    13. },
    14. // 请求成功后的回调函数
    15. success: function(res) {
    16. console.log(res);
    17. },
    18. // 请求失败时执行的函数
    19. error: function(xhr) {
    20. console.log(xhr);
    21. },
    22. // 请求完成后执行的函数(不管请求是否成功,都是完成了请求)
    23. complete: function(xhr) {
    24. console.log(xhr);
    25. }
    26. })

    4.在ES6中,箭头函数有哪些新特点?

    • .使用ES6箭头函数语法定义函数,将原函数的“function”关键字和函数名都删掉,并使用“=>”连接参数列表和函数体。
    • 当函数参数只有一个,括号可以省略;但是没有参数时,括号不可以省略。
    • 箭头函数内部的this是词法作用域,由上下文确定。

5.$(this)和this关键字在Jquery中有何不同?

1.表示对象不同:this表示的是javascript提供的当前对象,$(this)表示的是用jquery封装候的当前对象。
2.过程不同:this对象可以直接用this.style修改样式,$(this)可以使用jquery提供的方法访问样式。

6.验证参数是否由12位英文字母组成的正则表达式?

  1. function isStudentNo(str) {
  2. var reg= /^(\w){6,12}$/; //定义正则表达式
  3. return reg.test(str);
  4. }

7.谈谈你对mvvm框架的理解?

MVVM是一种新的设计架构模式 , MVVM分别指View,Model,View-Model,View通过View-Model的DOM Listeners将事件绑定到Model上,而Model则通过Data Bindings来管理View中的数据,View-Model从中起到一个连接桥的作用。
简单理解:对于MVVM来说,data一般是放在一个对象中,但是对于vue来说,是没有办法感知到数据的变化的,那么我们就需要使用Object.defineProperty,通过Object.defineProperty将data里的每一个属性的访问与修改都变成了一个函数,在函数get和set中我们即可监听到data的属性发生了改变。

8.简述同步和异步的区别

同步就是指一个进程在执行某个请求的时候,若该请求需要一段时间才能返回信息,那么这个进程将会一直等待下去,知道收到返回信息才继续执行下去;异步是指进程不需要一直等下去,而是继续执行下面的操作,不管其他进程的状态。当有消息返回式系统会通知进程进行处理,这样可以提高执行的效率.

9.请简述下cookies、sessionStorage、localStorage的区别

相同点:都存储在客户端
不同点:

  • 储存大小不同,cookie数据大小不能超过4k,sessionStorage和localStorage 虽然也有存储大小的限制,但比cookie大得多,可以达到5M或更大
  • 有效时间.cookies理论来说是 设置的cookie过期时间之前一直有效,即使窗口或浏览器关闭,sessionStorage 数据在当前浏览器窗口关闭后自动删除,localStorage 存储持久数据,浏览器关闭后数据不丢失除非主动删除数据;
  • 数据与服务器之间的交互方式, cookie的数据会自动的传递到服务器,服务器端也可以写cookie到客户端,sessionStorage和localStorage不会自动把数据发给服务器,仅在本地保存

    10.一次完整的HTTP事务是怎样的一个过程?

  1. 域名解析
  2. 发起TCP的三次握手
  3. 建立TCP连接后发送http请求
  4. 服务器响应http请求,浏览器得到html代码
  5. 浏览器解析html代码,并请求html代码中的资源
  6. 浏览器对页面进行渲染进而显示给用户

    11.Javascript实现二分法查找?(递归)

    二分法查找,也称折半查找,是一种在有序数组中查找特定元素的搜索算法。
    (1)首先,从有序数组的中间的元素开始搜索,如果该元素正好是目标元素(即要查找的元素),则搜索过程结束,否则进行下一步。
    (2)如果目标元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半区域查找,然后重复第一步的操作。
    (3)如果某一步数组为空,则表示找不到目标元素。

    1. function binary_search(arr,low,high,key) {
    2. if(low>high) {
    3. return -1;
    4. }
    5. var mid=parseInt((high+low)/2);
    6. if(arr[mid]==key) {
    7. return mid;
    8. }else if(arr[mid]>key){
    9. high=mid-1;
    10. return binary_search(arr,low,high,key);
    11. }else if(arr[mid]<ey){
    12. high=mid+1;
    13. return binary_search(arr,low,high,key);
    14. }
    15. }

    12.浏览器是如何渲染页面的?如何优化首屏渲染性能?

  7. 处理HTML标记并构建DOM树

  8. 处理CSS标记并构建CSSOM树
  9. 将DOM与CSSOM合并成一个渲染树
  10. 根据渲染树来布局,计算每个节点的布局信息
  11. 将各个节点绘制到屏幕上

优化性能 : 将外部样式的引入放在head标签中,body渲染前先把相对完整CSSOM Tree构建好。为了实现最佳性能,可以让您的 JavaScript 异步执行(async),并去除关键渲染路径中任何不必要的 JavaScript。

13.如何获取浏览器URL中查询字符串中的参数?

  1. function getUrlData(url){
  2. var urlObj={};
  3. var urlData=url.split("?")[1];
  4. urlData=urlData.split("&");
  5. for(var i =0;i<urlData.length;i++) {
  6. var key1=key.split("=")[0];
  7. var value1=urlData[i].split("=")[1];
  8. urlObj[key1]=value1;
  9. }
  10. return urlObj;
  11. }

14.ES6的新特性,除了let const 箭头函数之外还有哪些?

模板字符串,函数的参数默认值,解构赋值,对象超类,for…of和for…in,类,promise,模块化

15.vue的生命周期是什么 ? 都有哪些 ? 执行顺序是什么?

vue每个组件都是独立的,每个组件都有一个属于它的生命周期,从一个组件创建、数据初始化、挂载、更新、销毁,这就是一个组件所谓的生命周期,

16.vue开发项目过程中,用到的性能优化方式有哪些?

  1. 当实例完成后应该将其销毁,比如定时器等
  2. 图片资源懒加载(vue-lazyload )
  3. 路由懒加载
  4. 第三方资源的按需引入,可以减少项目的体积(借助 babel-plugin-component ,然后可以只引入需要的组件,以达到减小项目体积的目的)
  5. webpack对图片进行压缩(url-loader 中设置 limit 大小来对图片处理,对小于 limit 的图片转化为 base64 格式,其余的不做操作。所以对有些较大的图片资源,在请求资源的时候,加载会很慢,我们可以用 image-webpack-loader来压缩图片)
  6. 提取公共代码,减少代码冗余
  7. 开启gzip压缩
  8. 使用cdn

    17.computed跟watch的区别及应用场景?

    computed: 是计算属性,依赖其它属性值,并且 computed 的值有缓存,只有它依赖的属性值发生改变,下一次获取 computed 的值时才会重新计算 computed 的值
    watch: 更多的是「观察」的作用,类似于某些数据的监听回调 ,每当监听的数据变化时都会执行回调进行后续操作
    运用场景:
  • 当我们需要进行数值计算,并且依赖于其它数据时,应该使用 computed,因为可以利用 computed 的缓存特性,避免每次获取值时,都要重新计算
  • 当我们需要在数据变化时执行异步或开销较大的操作时,应该使用 watch,使用 watch 选项允许我们执行异步操作 ( 访问一个 API ),限制我们执行该操作的频率,并在我们得到最终结果前,设置中间状态。这些都是计算属性无法做到的

    18.v-for为什么必须加key,而且不能同时使用v-if?

    在列表数据进行遍历渲染时,需要为每一项 item 设置唯一 key 值,方便 Vue.js 内部机制精准找到该条列表数据。当 state 更新时,新的状态值和旧的状态值对比,较快地定位到 该元素.
    v-for 比 v-if 优先级高,如果每一次都需要遍历整个数组,将会影响速度,尤其是当之需要渲染很小一部分的时候,就会出现数据混乱.

    19.说说数组去重比较常用的都有哪些方法?

  • 利用ES6的Set去重

    1. function unique (arr) {
    2. return Array.from(new Set(arr))
    3. }
    4. var arr = [1,1,'true','true',true,true,15,15,false,false, undefined,undefined, null,null, NaN, NaN,'NaN', 0, 0, 'a', 'a',{},{}];
    5. console.log(unique(arr))
    6. //[1, "true", true, 15, false, undefined, null, NaN, "NaN", 0, "a", {}, {}]
  • 利用for嵌套for,然后splice去重

    1. function unique(arr){
    2. for(var i=0; i<arr.length; i++){
    3. for(var j=i+1; j<arr.length; j++){
    4. if(arr[i]==arr[j]){ //第一个等同于第二个,splice方法删除第二个
    5. arr.splice(j,1);
    6. j--;
    7. }
    8. }
    9. }
    10. return arr;
    11. }
  • 利用indexOf去重

    1. function unique(arr) {
    2. if (!Array.isArray(arr)) {
    3. console.log('type error!')
    4. return
    5. }
    6. var array = [];
    7. for (var i = 0; i < arr.length; i++) {
    8. if (array .indexOf(arr[i]) === -1) {
    9. array .push(arr[i])
    10. }
    11. }
    12. return array;
    13. }
  • 利用filter去重

    1. function unique(arr) {
    2. return arr.filter(function(item, index, arr) {
    3. //当前元素,在原始数组中的第一个索引==当前索引值,否则返回当前元素
    4. return arr.indexOf(item, 0) === index;
    5. });
    6. }

    20.vue-cli怎么实现移动端多屏适配?

    1.首先下载两个依赖 lib-flexible px2rem-loader
    2.在main.js中引入lib-flexible
    3.配置 px2rem-loader.在build文件中找到util.js,将px2rem-loader添加到cssLoaders中

    1. const px2remLoader = {
    2. loader: 'px2rem-loader',
    3. options: {
    4. remUnit: 37.5 // (以宽为375的设计稿为基准值)
    5. }
    6. }
    7. // generate loader string to be used with extract text plugin
    8. function generateLoaders (loader, loaderOptions) {
    9. const loaders = options.usePostCSS ? [cssLoader, postcssLoader, px2remLoader] : [cssLoader, px2remLoader]
    10. if (loader) {
    11. loaders.push({
    12. loader: loader + '-loader',
    13. options: Object.assign({}, loaderOptions, {
    14. sourceMap: options.sourceMap
    15. })
    16. })
    17. }
    18. if (options.extract) {
    19. return ExtractTextPlugin.extract({
    20. use: loaders,
    21. fallback: 'vue-style-loader'
    22. })
    23. } else {
    24. return ['vue-style-loader'].concat(loaders)
    25. }
    26. }

    21.谈谈你对闭包的理解?

    闭包就是函数内部嵌套函数,内部函数总是可以访问其所在的外部函数中声明的参数和变量.而且参数和变量不会被垃圾回收机制回收.闭包的使用可以避免命名冲突,但是由于变量被存储在内存栈中,无法被释放,将会导致性能下降,从而造成内存泄露问题.

    1. //函数作为返回值
    2. function a(){
    3. var name="慕筱佳";
    4. return function(){
    5. return name;
    6. }
    7. }
    8. var b=a();
    9. console.log(b()); //慕筱佳

    22.call 、apply跟bind的区别?

    共同点 :
    1、都是用来改变函数的this对象的指向的。
    2、第一个参数都是this要指向的对象。
    3、都可以利用后续参数传参。
    不同点 : call跟apply接受的参数形式不同,call接受的是对象形式,而apply则是数组形式,bind则是被动的通过调用函数来改变this的指向.

    23.什么是事件代理/委托机制,怎么实现?

    事件委托就是利用事件冒泡,只指定一个事件处理程序,就可以管理某一类型的所有事件,将事件委托给父元素来完成,那么子元素就会委托父元素去完成该事件,这样就会较少dom的操作,大大的提高了性能.
    适合用事件委托的事件:click,mousedown,mouseup,keydown,keyup,keypress。
    事件委托.png

    24.谈谈跨域,说说常用都有哪些解决方法?

    由于浏览器同源策略,凡是发送请求url的协议、域名、端口三者之间任意一与当前页面地址不同即为跨域.
    跨域的解决方法如下:

    1.通过jsonp跨域

    1. <script>
    2. var script = document.createElement('script');
    3. script.type = 'text/javascript';
    4. // 传参一个回调函数名给后端,方便后端返回时执行这个在前端定义的回调函数
    5. script.src = 'http://www.domain2.com:8080/login?user=admin&callback=handleCallback';
    6. document.head.appendChild(script);
    7. // 回调执行函数
    8. function handleCallback(res) {
    9. alert(JSON.stringify(res));
    10. }
    11. </script>

    2.跨域资源共享(CORS)

    1. setHeader("Access-Control-Allow-Origin", "*")
    2. setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS,DELETE,PUT");

    3.配置代理

    1. const config = require("../src/fetch/config"); //路径你们改下
    2. module.exports = {
    3. proxy: {
    4. [config.ROOT]: { //将www.exaple.com印射为/apis
    5. target: config.PROXYROOT,, // 接口域名
    6. secure: false, // 如果是https接口,需要配置这个参数
    7. changeOrigin: true, //是否跨域
    8. pathRewrite: {
    9. [`^${config.ROOT}`]: '' //需要rewrite的
    10. }
    11. }
    12. }
    13. }

    配置请求地址及环境(config.js) ```javascript //项目域名地址 const url = ‘https://exaple.com‘;

let ROOT; //由于封装的axios请求中,会将ROOT打包进去,为了方便之后不再更改,判断了当前环境,而生成的不同的ROOT if (process.env.NODE_ENV === ‘development’) { //开发环境下的代理地址,解决本地跨域跨域,配置在config目录下的index.js dev.proxyTable中 ROOT = “/apis” } else { //生产环境下的地址 ROOT = url; }

exports.PROXYROOT = url; //代理指向地址 exports.ROOT = ROOT;

  1. <a name="v6lHL"></a>
  2. ### 25.px、em跟rem的区别?
  3. px像素(Pixel)。相对长度单位。像素px是相对于显示器屏幕分辨率而言的。<br />em是相对长度单位。相对于当前对象内文本的字体尺寸。em会继承父级元素的字体大小。<br />rem是[CSS3](http://www.html5cn.org/portal.php?mod=list&catid=16)新增的一个相对单位(root em,根em),相对的只是HTML根元素font-size的大小.
  4. <a name="5l3BN"></a>
  5. ### 26.CSS3有哪些新特性?
  6. <a name="4XMr4"></a>
  7. #### 1.CSS3的选择器
  8. - E:last-child 匹配父元素的最后一个子元素E。
  9. - E:nth-child(n)匹配父元素的第n个子元素E。
  10. - E:nth-last-child(n) CSS3 匹配父元素的倒数第n个子元素E。
  11. <a name="RasKp"></a>
  12. #### 2.圆角
  13. ```less
  14. border-radius: 15px;

3.多列布局

  1. .mul-col{
  2. column-count: 3;
  3. column-gap: 5px;
  4. column-rule: 1px solid gray;
  5. border-radius: 5px;
  6. border:1px solid gray;
  7. padding: 10px ;
  8. }

4.阴影 box-shadow

  1. .class1{
  2. text-shadow:5px 2px 6px rgba(64, 64, 64, 0.5);
  3. }

5.CSS3 的渐变效果

  1. background-image:-webkit-gradient(linear,0% 0%,100% 0%,from(#2A8BBE),to(#FE280E));

6.css弹性盒子模型

  1. <div class="boxcontainer">
  2. <div class="item">1</div>
  3. <div class="item">2</div>
  4. <div class="item">3</div>
  5. <div class="item">4</div>
  6. </div>
  7. .boxcontainer {
  8. width: 1000px;
  9. display: -webkit-box;
  10. display: -moz-box;
  11. -webkit-box-orient: horizontal;
  12. -moz-box-orient: horizontal;
  13. }
  14. .item {
  15. background: #357c96;
  16. font-weight: bold;
  17. margin: 2px;
  18. padding: 20px;
  19. color: #fff;
  20. font-family: Arial, sans-serif;
  21. }

27.HTML5都有哪些新特性 ? 如何处理HTML5新标签的浏览器兼容HTML5 ?

  • 绘画 canvas
  • 用于媒介回放的 video 和 audio 元素
  • 本地离线存储 localStorage 长期存储数据,浏览器关闭后数据不丢失,sessionStorage 的数据在浏览器关闭后自动删除
  • 语意化更好的内容元素,比如 article、footer、header、nav、section
  • 表单控件,calendar、date、time、email、url、search
  • webworker, websocket, Geolocation

浏览器支持新标签后,还需要添加标签默认的样式。当然也可以直接使用成熟的框架、比如html5shim;

  1. <script> src="http://html5shim.googlecode.com/svn/trunk/html5.js"</script>

28.请列举五种隐藏元素的方法

1.visibility: hidden;这个属性只是简单的隐藏某个元素,…
2.opacity: 0;一个CSS3属性,设置0可以使一个元素完全透明
3.position: absolute;使元素脱离文档流,处于普通文档之上,…
4.display: none;元素会变得不可见,并且不会再占用文档的空间
5.transform: scale(0);将一个元素设置为无限小,这个元素将不可见

29.请简单描述下box-sizing:border-box跟box-sizing:content-box的区别?

  • 正常的盒模型,是指块元素box-sizing属性为content-box的盒模型。一般在现代浏览器中使用的都是正常盒模型content-box,它也是标准 w3c 盒子模型。

盒模型的大小包括content,padding,border,并且先做content.。
正常盒模型的大小会以内容优先自动扩展,内部子元素超过父元素给定的大小,会将父元素撑大。

  • 怪异盒模型,是指块元素box-sizing属性为border-box的盒模型,怪异盒模型中,父元素的盒模型确定,子元素是无法撑开父元素的盒模型,只能在盒模型剩余空间展示。

怪异盒模型是先做盒。然后添加border,padding,最后做content。即保证盒模型优先,先做盒再放 内容,不管内容是否放得下,一般手机上用的更多。

30.常见的浏览器内核有哪些?

IE Trident
firfox Gecko
Safari webkit
chrome Chromium/Blink
Opera blink

31.介绍下你对浏览器内核的理解

浏览器的内核主要分为两部分:渲染引擎和js引擎

  • 渲染引擎是负责取得网页的内容(html,xml,图像等),整理讯息(比如加入css等),以及计算网页的显示方式,然后会输出到显示器或者打印机。浏览器的内核不同,对网页语法的解释也就不同,渲染效果就不同。所有的浏览器等以及需要编辑,显示网络内容的应用程序都需要内核。
  • 则用来解析JavaScript来实现网页的动态效果
  • 最开始这两个引擎区分的不是很明确,后来js引擎越来越独立,内核就倾向于只指渲染引擎

    32.简述一下你对HTML语义化的理解

    HTML5的语义化指的是合理使用语义化的标签来创建页面结构

  • 代码结构清晰,易于阅读,利于开发和维护

  • 提高用于体验,在样式加载失败时,页面结构清晰
  • 方便其他设备解析(如屏幕阅读器)根据语义渲染网页。
  • 有利于搜索引擎优化(SEO),搜索引擎爬虫会根据不同的标签来赋予不同的权重

    33.页面导入样式时,使用link和@import有什么区别?

  • link是XHTML标签,除了加载CSSS之外,还可以定义RSS等其他事务,@import属于CSS范畴,只能加载CSS

  • link引用CSS时,在页面载入时同时加载;@import需要页面网页完全载入后才可以加载
  • link是XHTML标签,无兼容问题,@import是在CSS2.1提出的,低版本的浏览器不支持
  • link支持使用JS控制DOM改变样式,而@import不支持

    34.HTML5的离线储存怎么使用,工作原理能不能解释一下?

    在线时,浏览器发现html头部有manifest属性,就会请求manifest文件,如果是第一次访问,浏览器就会根据manifest文件进行相应资源的下载,如果已经访问过并且已经有资源了,就会使用离线下载的资源。然后对新旧的manifest文件进行比较,如果有改变则重新下载文件中的资源,没有改变就不进行任何操作
    离线时:直接使用离线下载的资源

    35.元素水平垂直居中的常用方法都有哪些?

  • absolute+margin负值法

    1. div{
    2. position: absolute;/*绝对定位*/
    3. width: 500px;
    4. height: 300px;
    5. top: 50%;
    6. left: 50%;
    7. margin: -150px00-250px;/*外边距为自身宽高的一半*/
    8. background-color: pink;/*方便看效果*/
    9. }
  • absolute+transform

    1. div {
    2. position: absolute; /*相对定位或绝对定位均可*/
    3. width: 500px;
    4. height: 300px;
    5. top: 50%;
    6. left: 50%;
    7. transform: translate(-50%, -50%);
    8. background-color: pink; /*方便看效果*/
    9. }
  • absolute+margin:auto

    1. div {
    2. position: absolute; /*相对定位或绝对定位均可*/
    3. width: 500px;
    4. height: 300px;
    5. bottom:0,
    6. top:0,
    7. left:0,
    8. right:0,
    9. margin:auto,
    10. background-color: pink; /*方便看效果*/
    11. }
  • flex(需要考虑兼容性)

    1. .container {
    2. display: flex;
    3. align-items: center; /*垂直居中*/
    4. justify-content: center; /*水平居中*/
    5. }
    6. .containerdiv {
    7. width: 100px;
    8. height: 100px;
    9. background-color: pink; /*方便看效果*/
    10. }
  • text-align:center和vertical-align:middle ```css .container { position: fixed; top: 0; right: 0; bottom: 0; left: 0; background: rgba(0, 0, 0, 0.5); text-align: center; font-size: 0; white-space: nowrap; overflow: auto; }

.container::after { content: ‘’; display: inline-block; height: 100%; vertical-align: middle; }

.box { display: inline-block; width: 500px; height: 400px; background-color: pink; white-space: normal; vertical-align: middle; }

  1. <a name="jetyJ"></a>
  2. ### 36.谈谈对BFC规范(块级格式化上下文:block formatting context)的理解
  3. BFC规定了内部的 Block-level Box 如何布局,并且与这个独立盒子里的布局不受外部影响,当然它也不会影响到外面的元素。它是一个独立容器,决定了元素如何对其内容进行定位,以及与其他元素的关系和相互作用。<br />特性:
  4. - 内部的 Box 会在垂直方向,从顶部开始一个接一个地放置
  5. - Box 垂直方向的距离由 margin 决定。属于同一个 BFC 的两个相邻 Box 的 margin 会发生叠加,
  6. - 每个元素的 margin box 的左边, 与包含块 border box 的左边相接触(对于从左往右的格式化,否则相反)。即使存在浮动也是如此。
  7. - BFC 的区域不会与 float box 叠加
  8. - BFC 就是页面上的一个隔离的独立容器,容器里面的子元素不会影响到外面的元素,反之亦然。
  9. - 计算 BFC 的高度时,浮动元素也参与计算。
  10. 触发BFC的条件:
  11. - float 除了 none 以外的值
  12. - overflow 除了 visible 以外的值(hidden,auto,scroll)
  13. - display (table-cell,table-caption,inline-block, flex, inline-flex)
  14. - position 值为(absolute,fixed)
  15. - fieldset 元素
  16. <a name="RQDwY"></a>
  17. ### 36.移动端如何实现适配?
  18. - 首先在head中添加以下代码
  19. ```html
  20. <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">

width=device-width :表示宽度是设备屏幕的宽度
initial-scale=1.0:表示初始的缩放比例
minimum-scale=1.0:表示最小的缩放比例
maximum-scale=1.0:表示最大的缩放比例
user-scalable=no:表示用户是否可以调整缩放比例

  • 引入css样式

    1. // 表示在符合的条件下引入
    2. <link rel="stylesheet" media="screen and (max-width: 400px)" href="mystylesheet.css">
  • 定义不同屏幕的样式

    1. @media screen and (max-width: 400px) {
    2. // 这里写你在当前条件下想要展示的样式
    3. .inner {
    4. height: 100px;
    5. width: 25%;
    6. background-color: brown;
    7. }
    8. }

    37.全屏滚动的原理是什么?用到了CSS的那些属性?

    所谓全屏滚动,就是网页的一个模块占据一屏的宽高,多个模块上下拼接在一起,当滑动鼠标滚轮,或点击导航按钮时,可以平滑到对应的页面、
    实现原理:响应鼠标事件,页面通过CSS的动画效果,进行移动。
    以下是使用jquery实现的全屏滚动效果,具体可以参考详细文献。 ```html <!doctype html>









  1. ```javascript
  2. var page_index = 0;
  3. var page_id = new Array();
  4. page_id[0] = "page1";
  5. page_id[1] = "page2";
  6. page_id[2] = "page3";
  7. page_id[3] = "page4";
  8. var screen_height = $(window).height();
  9. var doScroll = true;
  10. var speed = 1000;
  11. (function(){
  12. var oDiv = document.getElementById('main');
  13. function onMouseWheel(ev) {/*当鼠标滚轮事件发生时,执行一些操作*/
  14. var ev = ev || window.event;
  15. var down = true; // 定义一个标志,当滚轮向下滚时,执行一些操作
  16. down = ev.wheelDelta?ev.wheelDelta<0:ev.detail>0;
  17. if(doScroll){
  18. if(down){
  19. if(page_index!=3){
  20. doScroll = false;
  21. page_index++;
  22. $("#main").animate({top:-page_index*screen_height},speed,function() {
  23. doScroll = true;
  24. });//当响应向下滚动事件的时候,将doScroll设置成false,控制在这次响应过程中,不再响应其他滚轮事件,当这次事件执行结束后(1000ms后),再讲doScroll恢复成true,准备响应下次滚动。
  25. }
  26. }else{
  27. if(page_index!=0){
  28. doScroll = false;
  29. page_index--;
  30. $("#main").animate({top:-page_index*screen_height},speed,function() {
  31. doScroll = true;
  32. });
  33. }
  34. }
  35. if(ev.preventDefault){/*FF 和 Chrome*/
  36. ev.preventDefault();// 阻止默认事件
  37. }
  38. }
  39. return false;
  40. }
  41. addEvent(oDiv,'mousewheel',onMouseWheel);
  42. addEvent(oDiv,'DOMMouseScroll',onMouseWheel);
  43. })();
  44. function addEvent(obj,xEvent,fn) {
  45. if(obj.attachEvent){
  46. obj.attachEvent('on'+xEvent,fn);
  47. }else{
  48. obj.addEventListener(xEvent,fn,false);
  49. }
  50. }

38.谈谈你对Javascript中原型和原型链的理解

每个函数都有一个prototype属性,即就是该函数的原型对象,所有的对象和原型都有自己的原型,对象的原型指向原型对象,
在层级多的关系中,多个原型层层相连则构成了原型链。在查找一个对象的属性时,倘若在当前对象找不到该属性,则会沿着原型链一直往上查找,知道找到为止,如果到了原型链顶端,还没找到,则返回undefined。

39.Javascript如何实现继承?

  • 原型链继承:在子类型构造函数中调用超类型的构造函数。需要借助javascript提供的call()或者apply()函数

    1. function SuperClass() {
    2. this.name = "慕筱佳";
    3. this.bra = ["a", "b"];
    4. }
    5. function SubClass() {
    6. this.subname = "卡哇伊";
    7. //将SuperClass的作用域赋予当前构造函数,实现继承
    8. SuperClass.call(this);
    9. }
  • 组合式继承:使用原型链继承属性和方法,借用构造函数来实现实例属性的继承

    1. function SuperClass() {
    2. this.name = "慕筱佳";
    3. this.bra = ["a", "b"];
    4. }
    5. SuperClass.prototype.sayWhat = function(){
    6. console.log("good");
    7. }
    8. function SubClass() {
    9. this.subname = "your sister";
    10. SuperClass.call(this); //第二次调用SuperClass
    11. }
    12. SubClass.prototype = new SuperClass(); //第一次调用SuperClass
    13. var sub1 = new SubClass();
    14. console.log(sub1.sayWhat());//good
  • 寄生组合式继承 ```javascript function Cat(name){ Animal.call(this); this.name = name || ‘Tom’; } (function(){ // 创建一个没有实例方法的类 var Super = function(){}; Super.prototype = Animal.prototype; //将实例作为子类的原型 Cat.prototype = new Super(); })();

// Test Code var cat = new Cat(); console.log(cat.name); console.log(cat.sleep()); console.log(cat instanceof Animal); // true console.log(cat instanceof Cat); //true

  1. <a name="ubgXu"></a>
  2. ### 40.谈谈你对this的理解
  3. this表示当前对象,this的指向是根据调用的上下文来决定的,默认指向window对象。
  4. - 对于普通函数,this指向window
  5. - 在点击事件中,this指向当前被电击的对象
  6. - 构造函数中this指向当前实例化对象
  7. - 在对象的方法中,this指向当前对象
  8. - 定时器函数, 此时 this 指向 window
  9. - 箭头函数的是没有属于自己的this的,它所谓的this是捕获其上下文的this,作为自己的this,所以箭头函数不会被new调用,所谓的this也不会被改变
  10. <a name="jrQ8D"></a>
  11. ### 41.Javascript的数据类型都有哪些?如何判断数据类型?
  12. JavaScript中有8种数据类型, 包括基本数据类型(number, string, boolean, null, undefined, symbol, bigint)和引用数据类型object(Function,Array)<br />一般检测数据类型可以用typeof或者instanceof来检测,<br />但对于typeof来说,string,boolean,number,undefined都可以用 typeof 来进行判断变量的数据类型,但是有一种比较特殊,那就是null了,用typeof检测 null ,null 表示的是对一个空对象的引用,返回的是对象类型object
  13. ```javascript
  14. ypeof "慕筱佳"
  15. "string"
  16. typeof 123
  17. "number"
  18. typeof false
  19. "boolean"
  20. typeof null
  21. "object"
  22. typeof undefined
  23. "undefined"
  24. typeof Function
  25. "function

对于引用类型(Object)的检测,可以使用 instanceof 或者 constructor 来检测对象是否为引用类型Object,但是instanceof 跟 constructor,有时候不能很准确的判断出对象的类型
Object.prototype.toString.call 精确地判断各种数据类型

  1. Object.prototype.toString.call(null)
  2. "[object Null]"
  3. Object.prototype.toString.call("慕筱佳")
  4. "[object String]"

42.null,undefined的区别?

  • null表示空值,即此处不应该有值,undfined表示此处应该有值,只是未定义
  • null默认转换为0,undfined转换为NaN

    43.new操作符具体干了什么呢?

  • 创建一个空对象

    1. var obj = new Object();
  • 将对象与构建函数通过原型链连接起来

    1. _proto_=Object.prototype
  • 将构建函数中的this绑定到新建的对象obj

    1. this.name=name;
    2. this.age=age;
  • 根据构建函数返回类型作判断,如果是原始值则被忽略,如果是返回对象

手写new操作符:

  1. function mynew(Func,...args){
  2. const obj={};
  3. obj._proto=Func.prototype;
  4. let result=Func.apply(obj,args);
  5. return result instanceof Object ? result : obj
  6. }

44.如何改变this的指向?

  • 可以使用局部变量改变this的指向

    1. var name = "慕筱佳";
    2. var obj = {
    3. name : "慕筱佳",
    4. say : function(){
    5. var _this = this;//使用一个变量指向 this
    6. setTimeout(function(){
    7. console.log(_this.name);
    8. },0);
    9. }
    10. }
    11. obj.say(); //慕筱佳
  • applay跟call(主动执行),只不过两者接受的参数形式不同,call接受对象,而apply接受数组。

    1. function func(x,y) {
    2. return x+y
    3. }
    4. const userinfo = {}
    5. func.call(o, 5, 5) //this指向由window变为userinfo
  • bind (被动的改变this的指向,必须要自执行)

    1. function changeThis(name) {
    2. return name
    3. }
    4. const user={};
    5. changeThis.bind(user,"慕筱佳")();

    45.http状态码有那些?分别代表是什么意思?