美文网首页
Days24 笔试-理论

Days24 笔试-理论

作者: biu丶biubiu | 来源:发表于2018-08-24 15:04 被阅读0次

    1.关于if()的数据类型转换

    0false   1true

    2.this的指向

    this的值要等到代码真正执行时才能确定

    同时this的值具体有以下几种情况:

    1.new 调用时指的是被构造的对象

    2.call、apply调用,指向我们指定的对象

    3.对象调用,如执行obj.b(),this指向obj

    4.默认的,指向全局变量window(相当于执行window.fun())

    3.NOSCRIPT标签

    用来定义在脚本未被执行时的替代内容

    4.AMD&CMD

    1. 对于依赖的模块,AMD 是提前执行,CMD 是延迟执行

    2. CMD 推崇依赖就近,AMD 推崇依赖前置

    AMD 是 RequireJS 在推广过程中对模块定义的规范化产出。

    CMD 是 SeaJS 在推广过程中对模块定义的规范化产出。

    5.Onload页面加载时间计算

    页面的性能指标详解:

    白屏时间(first Paint Time)——用户从打开页面开始到页面开始有东西呈现为止

    首屏时间——用户浏览器首屏内所有内容都呈现出来所花费的时间

    用户可操作时间(dom Interactive)——用户可以进行正常的点击、输入等操作,默认可以统计domready时间,因为通常会在这时候绑定事件操作

    总下载时间——页面所有资源都加载完成并呈现出来所花的时间,即页面 onload 的时间

    6.如何规避javascript多人开发函数重名问题。

    7.解释性语言和编译性语言的定义:

    计算机不能直接理解高级语言,只能直接理解机器语言,所以必须要把高级语言翻译成机器语言,计算机才能执行高级语言编写的程序。

    翻译的方式有两种,一个是编译,一个是解释。两种方式只是翻译的时间不同。

    解释性语言的定义:

    解释性语言的程序不需要编译,在运行程序的时候才翻译,每个语句都是执行的时候才翻译。这样解释性语言每执行一次就需要逐行翻译一次,效率比较低。

    现代解释性语言通常把源程序编译成中间代码,然后用解释器把中间代码一条条翻译成目标机器代码,一条条执行。

    编译性语言的定义:

    编译性语言写的程序在被执行之前,需要一个专门的编译过程,把程序编译成为机器语言的文件,比如exe文件,以后要运行的话就不用重新翻译了,直接使用编译的结果就行了(exe文件),因为翻译只做了一次,运行时不需要翻译,所以编译型语言的程序执行效率高。

    8.时间戳与时间日期的相互转换

    将日期格式转换成时间戳:    // 有三种方式获取

    var date = new Date('2014-04-23 18:55:49:123');

        var time1 = date.getTime();  // console.log(time1);//1398250549123

        var time2 = date.valueOf(); // console.log(time2);//1398250549123

        var time3 = Date.parse(date); //  console.log(time3);//1398250549000

    将时间戳转换成日期格式:

    function timestampToTime(timestamp) {

            var date = new Date(timestamp * 1000);//时间戳为10位需*1000,时间戳为13位的话不需乘1000

            Y = date.getFullYear() + '-';

            M = (date.getMonth()+1 < 10 ? '0'+(date.getMonth()+1) : date.getMonth()+1) + '-';

            D = date.getDate() + ' ';

            h = date.getHours() + ':';

            m = date.getMinutes() + ':';

            s = date.getSeconds();

            return Y+M+D+h+m+s;

        }

        timestampToTime(1403058804);

        console.log(timestampToTime(1403058804));//2014-06-18 10:33:24

    9.normalize&reset区别

    共同点:都是重置样式库,增强浏览器的表现一致性

    不同点:举个例子:ul

    reset.css  list-style:none ---因为需求

    normalize.css 不会重置ul样式 ---本身已经在每个浏览器表现一致的元素

    一句话:都是增强浏览器的表现一致性但是normalize不会重置已经一致的元素

    10.v-model原理:

    监听原生组件的事件,当获取到原生组件的值后把 值通过调用 $emit('input' ,data) 方法去触发 input事件

    11.尽量用padding,慎用margin

    12.javascript变量定义规则

    第一个字符必须是一个 ASCII 字母(大小写均可),或一个下划线(_)。注意第一个字符不能是数字。 

    后续的字符必须是字母、数字或下划线。  

    变量名称一定不能是 保留字。 

    13.CSS Sprites

    (1)CSS Sprites能很好地减少网页的http请求,从而大大的提高页面的性能,这是CSS Sprites最大的优点,也是其被广泛传播和应用的主要原因;

    (2)CSS Sprites能减少图片的字节;

    (3)CSS Sprites解决了网页设计师在图片命名上的困扰,只需对一张集合的图片命名,不需要对每一个小图片进行命名,从而提高了网页制作效率。

    (4)CSS Sprites只需要修改一张或少张图片的颜色或样式来改变整个网页的风格。

    14元素

    块级元素:div  , p  ,form,   ul,li ,  ol, dl,form,   address,fieldset,  hr, menu,  table

    行内元素:span,   strong,   em,br,img,input,  label,  select,  textarea,cite,

    15.浏览器端:

    cookie

    WebStorage(localStorage、sessionStorage)

    userData

    indexedDB

    服务器端:

    session

    16.dl自定义列表

    <dl>       <dt><dt>  //自定义标题       <dd><dd>  //自定义描述</dl>

    17.获取被删除元素

    this.splice(j, 1)[0]

    18.Doctype作用    严格模式与混杂模式

    (1)声明位于文档中的最前面,处于标签之前。告知浏览器的解析器,用什么文档类型规范来解析这个文档。 

    (2)严格模式的排版和JS 运作模式是以该浏览器支持的最高标准运行。 

    (3)在混杂模式中,页面以宽松的向后兼容的方式显示。模拟老式浏览器的行为以防止站点无法工作。               (4)DOCTYPE不存在或格式不正确会导致文档以混杂模式呈现。 

    19,Html语义化

    为了在没有CSS的情况下,页面也能呈现出很好地内容结构、代码结构 : 为了裸奔时好看;

    方便其他设备解析      便于团队开发和维护   有利于SEO

    H5中的语义化标签<header> <section> <footer> <nav>

     语义样式标签strong, em, ins, del, code

    自然样式标签b, i, u, s, pre。   应该准确使用语义样式标签, 但不能滥用 , 如果不能确定时首选使用自然样式标签。

    20 link 引用 CSS 时,在页面载入时同时加载; @import 需要页面网页完全载入以后加载。

    link 是 XHTML 标签,无兼容问题; @import 是在 CSS2.1 提出的,低版本的浏览器不支持。

    21data-`属性

    `data-`为H5新增的为前端开发者提供自定义的属性,这些属性集可以通过对象的 `dataset` 属性获取,不支持该属性的浏览器可以通过`getAttribute` 方法获取 

    22.浏览器内核

    主要分成两部分:渲染引擎 和 JS 引擎。

    渲染引擎:负责取得网页的内容(HTML、 XML 、图像等等)

    JS引擎则:解析和执行 javascript 来实现网页的动态效果。

    最开始渲染引擎和JS引擎并没有区分的很明确,后来 JS 引擎越来越独立,内核就倾向于只指渲染引擎。

    23.label标签 , 当用户选择该标签时,浏览器会自动将焦点转到和标签相关的表单控件上。提升了鼠标用户体验

    24.src与href的区别

    src指向外部资源的位置,指向的内容将会嵌入到文档中当前标签所在位置

    href指向网络资源所在位置,建立和当前元素(锚点)或当前文档(链接)之间的链接

    25Websocket

    WebSocket是 HTML5 开始提供的一种浏览器与服务器间进行全双工通讯的网络技术。依靠这种技术可以实现客户端和服务器端的长连接,双向实时通信。

    特点:a、事件驱动b、异步c、使用 ws 或者 wss 协议的客户端 socketd、能够实现真正意义上的推送功能

    26.Alt 用于图片无法加载时显示 Title 为该属性提供信息,通常当鼠标滑动到元素上的时候显示

    27.! important > <style></style> > ID > 类 > 标签 | 伪类 | 属性选择 >  继承 > 通配符

    权重、特殊性计算法: 

    CSS样式选择器分为4个等级,a、b、c、d

    (1)、如果样式是行内样式(通过Style=“”定义)1,0,0,0 

    (2)、b为ID选择器的总数 0,1,0,0 

    (3)、c为属性选择器,伪类选择器和class类选择器的数量。0,0,1,0

    (4)、d为标签、伪元素选择器的数量 0,0,0,1

    (5)、!important 权重最高,比 inline style 还要高

    28.浏览器兼容问题

    1.不同浏览器的标签默认的padding和margin。对标签的解释有些不一样

    解决方案:CSS里 *{margin:0;padding:0;}  或者  引入nomallize.css

    2.块属性标签float后,又有横行的margin情况下,在IE6显示margin比设置的大 

    解决方案:在float的标签样式控制中加入 display:inline;将其转化为行内属性

    3.设置较小高度标签(一般小于10px),在IE6,IE7,遨游中高度超出自己设置高度 

    解决方案:给超出高度的标签设置overflow:hidden;或者设置行高line-height 小于你设置的高度。

    4.图片默认有间距 加了问题一中提到的通配符也不起作用。

    解决方案:使用float属性为img布局

    5.标签最低高度设置min-height不兼容 

    解决方案:如果我们要设置一个标签的最小高度200px,需要进行的设置为:{min-height:200px; height:auto !important; height:200px; overflow:visible;}

    29.原型链

    原型链

    30.OSI模型

    Http,Dns位于应用层

    TCP,UDP传输层

    IP网络层

    31.margin标记可以带一个、二个、三个、四个参数,各有不同的含义。

    margin: 20px;(上、下、左、右各20px。)

    margin: 20px 40px;(上、下20px;左、右40px。)

    margin: 20px 40px 60px;(上20px;左、右40px;下60px。)

    margin: 20px 40px 60px 80px;(上20px;右40px;下60px;左80px。)

    32.vue响应式原理

    vue是采用数据劫持,并且使用发布-订阅者的开发模式。原理是观察者observer通过Object.defineProperty()来劫持到各个属性的getter setter,在数据变动的时候,会被observer观察到,会通过Dep通知数据的订阅者watcher,之后进行相应的视图上面的变化

    Object.defineProperty() 方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性, 并返回这个对象。

    vue 的响应式系统依赖于三个重要的类:Dep 类、Watcher 类、Observer 类。

    Dep 类作为发布者的角色,Watcher 类作为订阅者的角色,Observer 类则是连接发布者和订阅者的纽带,决定订阅和发布的时机。

    双向数据绑定

    双向数据绑定就是在单向绑定的基础上给可输入元素(input、textare等)添加了change(input)事件,来动态修改model和 view,

    数据绑定     :发布者-订阅者模式(backbone.js)脏值检查(angular.js)数据劫持(vue.js)

    虚拟dom

      官网给出的概念:Vue通过建立一个虚拟DOM树对真实DOM发生的变化保持追踪。

    一棵真实DOM树的渲染需要先解析CSS样式和DOM树,然后将其整合成一棵渲染树,再通过布局算法去计算每个节点在浏览器中的位置,最终输出到显示器上

    而虚拟DOM则可以理解为保存了一棵DOM树被渲染之前所包含的所有信息,而这些信息可以通过对象的形式一直保存在内存中,并通过JavaScript的操作进行维护。

    Virtual DOM

    Virtual DOM是一个映射真实DOM的JavaScript对象,如果需要改变任何元素的状态,

    那么是先在Virtual DOM上进行改变,而不是直接改变真实的DOM。

    当有变化产生时,一个新的Virtual DOM对象会被创建并计算新旧Virtual DOM之间的差别。

    之后这些差别会应用在真实的DOM上。

    Vue在渲染过程中,会跟踪每一个组件的依赖关系,不需要重新渲染整个组件树。

    React每当应用的状态被改变时,全部子组件都会重新渲染。这可以通过shouldComponentUpdate这个生命周期方法来进行控制。

    33.MVVM设计思想

    在MVVM架构下,View 和 Model 之间并没有直接的联系,而是通过ViewModel进行交互,ViewModel 通过双向数据绑定把 View 层和 Model 层连接了起来,而View 和 Model 之间的同步工作完全是自动的,无需人为干涉,因此开发者只需关注业务逻辑,不需要手动操作DOM, 不需要关注数据状态的同步问题,复杂的数据状态维护完全由 MVVM 来统一管理。

    34vue生命周期的理解

    创建前/后: 

    beforeCreate:此时的vue实例还没有挂载元素$el,数据对象data也是undefiend; 

    created:vue实例的数据对象data有了,但是$el还没有 

    载入前/后: 

    beforeMount:vue的实例的$el和data都初始化了,但还是挂载在之前虚拟的DOM节点上面,data.message还未替换 

    mounted :vue实例挂载完成,data.message成功渲染。 

    更新前/后 :

    在data发生变化的时候,会触发beforeUpdate和updated方法。 

    销毁前/后: 

    beforeDestroy/destroyed

    在destory之后,对data的改变不会再触发周期函数,说明此时vue实例已经解除了事件监听以及和dom的绑定,但是dom结构依然存在

    errorCaptured 2.5.0+ 新增

    keep-alive 包裹动态组件时,会缓存不活动的组件实例,主要用于保留组件状态或避免重新渲染。

    35.vue实现按需加载配合webpack设置

    webpack中提供了require.ensure()来实现按需加载。以前引入路由是通过import 这样的方式引入,改为const定义的方式进行引入。

    不进行页面按需加载引入方式:import  home  from '../../common/home.vue'

    进行页面按需加载的引入方式:const  home = r => require.ensure( [], () => r (require('../../common/home.vue')))

    36.vuex的store属性值

    state => 基本数据 .特性就是当mutation修改了state的数据的时候,他会动态的去修改所有的调用这个变量的所有组件里面的值( 若是store中的数据发生改变,依赖这个数据的组件也会发生更新 )

    getters => 从基本数据派生的数据 mapgetter经常在计算属性中被使用

    mutations => 提交更改数据的方法,同步! 

    actions => 像一个装饰器,包裹mutations,使之可以异步。 

    modules => 模块化Vuex

    何时使用vuex  就像眼镜:您自会知道什么时候需要它。

    vuex

    37.前端安全问题:CSRF,XSS,SQL注入

    跨站请求伪造(CSRF攻击)

    CSRF攻击过程是受害者用户登录网站A,输入个人信息,在本地保存服务器生成的cookie。然后在A网站点击由攻击者构建一条恶意链接跳转到 B网站,然后B网站携带着的用户cookie信息去访问A网站.让A网站造成是用户自己访问的假相,从而来进行一些列的操作,常见的就是交易转账. 

    防御 CSRF 攻击主要有三种策略:验证 HTTP Referer 字段;在请求地址中添加 token 并验证;在 HTTP 头中自定义属性并验证。

    参考CSDN博客:CSRF的原理及防御措施

    跨站脚本攻击(XSS攻击)

    恶意攻击者往Web页面里注入恶意Script代码,用户浏览这些网页时,就会执行其中的恶意代码,可对用户进行盗取cookie信息、会话劫持等各种攻击. 

    防御 XSS 攻击:1.输入过滤,2.对所有要动态输出到页面的内容,进行相关的编码和转义  3.白名单机制,开发者明确告诉客户端(浏览器)哪些资源可以加载并执行

    38.caller和callee

    caller 是返回一个对函数的引用,该函数调用了当前函数;

    function a(){

    b();

    };

    function b(){

    alert(b.caller);

    };

    a(); //结果就是弹出函数a,b的属性caller调用当前函数b的函数引用a(就是指向当前函数b的父函数a)

    callee是返回正在被执行的 function 函数,也就是所指定的 function 对象的正文

    function chen(x){

    if (x<=1) {return 1;

    }else{

    return x*arguments.callee(x-1);

    };

    };//arguments.callee相当于chen

    参考博客

    39.浅拷贝和深拷贝

    基本数据类型有哪些,number,string,boolean,null,undefined五类。

    引用数据类型(Object类)有常规名值对的无序对象{a:1},数组[1,2,3],以及函数等。

    a.基本类型--名值存储在栈内存中

    b.引用数据类型--名存在栈内存中,值存在于堆内存中,但是栈内存会提供一个引用的地址指向堆内存中的值

    参考博客

    40.Promise 

    Promise 是异步编程的一种解决方案,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果。从语法上说,Promise 是一个对象,从它可以获取异步操作的消息。Promise 提供统一的 API,各种异步操作都可以用同样的方法进行处理。

    Promise对象有以下两个特点。

    (1)对象的状态不受外界影响。Promise对象代表一个异步操作,有三种状态:pending(进行中)、fulfilled(已成功)和rejected(已失败)。只有异步操作的结果,可以决定当前是哪一种状态,任何其他操作都无法改变这个状态。这也是Promise这个名字的由来,它的英语意思就是“承诺”,表示其他手段无法改变。

    (2)一旦状态改变,就不会再变,任何时候都可以得到这个结果。Promise对象的状态改变,只有两种可能:从pending变为fulfilled和从pending变为rejected。只要这两种情况发生,状态就凝固了,不会再变了,会一直保持这个结果,这时就称为 resolved(已定型)。如果改变已经发生了,你再对Promise对象添加回调函数,也会立即得到这个结果。

    有了Promise对象,就可以将异步操作以同步操作的流程表达出来,避免了层层嵌套的回调函数。

    Promise 实例具有then方法,也就是说,then方法是定义在原型对象Promise.prototype上的。它的作用是为 Promise 实例添加状态改变时的回调函数。前面说过,then方法的第一个参数是resolved状态的回调函数,第二个参数(可选)是rejected状态的回调函数。

    promise

       .then(function(data){ // success})

       .catch(function(err){ // error});

    参考:阮一峰es6文档

    41.URL

    url

    案例

    1.依次弹出4,4,4,4。当加载JS代码时for循环就开始了,onclick之前循环结束,i=4,所以点击都是弹出4

    杂项

    1.任何函数执行完一次,如果没有 return 返回值和声明变量接受返回值,都会立即消失,永远找不到值!

    2.注意各种返回的东西是什么

    3.js函数调用时加括号和不加括号的区别.不加括号相当于把函数代码赋给等号左边,加括号是把函数返回值赋给等号左边.

    4.js中this的用法,this总是指向调用它的对象,倒数第二行的getColor为windows调用的,倒数第一行的getColor是test4399对象调用的

    5.只有IE浏览器支持defer延迟加载方式(w3c)

    6.DNS协议运行在UDP协议之上,使用端口号53,默认缓存为一天

    相关文章

      网友评论

          本文标题:Days24 笔试-理论

          本文链接:https://www.haomeiwen.com/subject/mplybftx.html