精华内容
下载资源
问答
  • oracle应用之批量新增更新数据

    千次阅读 2019-05-12 00:11:12
    本博客介绍一下Oracle批量新增数据和更新数据的sql写法,业务场景是这样的,往一张关联表里批量新增更新数据,然后,下面介绍一下批量新增和更新的写法: 批量新增数据 对于批量新增数据,介绍两种方法 (1)命令窗口...

    本博客介绍一下Oracle批量新增数据和更新数据的sql写法,业务场景是这样的,往一张关联表里批量新增更新数据,然后,下面介绍一下批量新增和更新的写法:

    批量新增数据
    对于批量新增数据,介绍两种方法

    (1)命令窗口执行的
    一种需要在命令窗口执行的,Oracle数据库可以使用sqlplus或者plsql developer客户端软件

    可以使用sqlplus工具登录,进入数据库

    sqlplus / as sysdba
    

    查看用户,可以用命令

    show parameter db_name
    
    

    plsql developer也可以使用,登录之后,选择文件(File)->新建(New)->命令窗口(Command Window)
    假如要往表格t里写1000条数据,可以用如下批处理命令:

    begin 
    	for i in 1 .. 1000
    	loop
    		execute immediate
    		'insert into t values('|| i ||')';
    	end loop;
    	commit;
    end;
    

    ps:这个commit提交事务,放的位置也是有区别的,具体可以参考我之前的博客,Oracle体系结构学习笔记里面有涉及到

    (2) SQL窗口执行的
    然后介绍sql窗口执行的方法,因为命令窗口执行有时候觉得不太便利,所以可以使用sql窗口的方法,语法大致为:

    insert into [表格名称](字段名称1,字段名称2,...) [查询SQL]
    

    给个例子,sys_guid()生成uuid数据,sysdate获取当前时间,然后批量写数据,根据查询sql来

    insert into t_stuff_dir_related
      (seq, dir_seq, create_date, create_man, stuff_id, t_item)
      select sys_guid(),
             'uuidss',
             sysdate,
             'admin',
             b.rs_id,
             a.t_item
        from t_itm_define a
      where a.is_valid =1
    

    批量更新数据

    对于批量更新的和批量新增方法类型,同样可以用命令窗口和sql窗口两种方法

    (1)命令窗口执行的

    同样可以用如下批处理命令:

    begin 
    	for i in 1 .. 1000
    	loop
    		execute immediate
    		'${更新SQL}';
    	end loop;
    	commit;
    end;
    

    (1)SQL窗口执行的

    批量更新加了where条件就可以

     update t_itm_rcv_stuff stuff
        set stuff.dir_seq = '${目录SEQ}', stuff.dir_name = '${目录名称}'
      where stuff.t_item in
            (select a.t_item
               from t_itm_define a)
    
    
    展开全文
  • MyBatis批量新增更新

    万次阅读 多人点赞 2016-05-16 16:58:43
    之前有开发任务一个接口里面有大量的数据新增更新操作,导致十分缓慢。使用了批量操作之后速度有明显提升,几乎百倍千倍的速度提升。博主之前统计过,通过普通接口一次数据库插入大概需要200ms,对于大量新增或...

    之前有开发任务一个接口里面有大量的数据新增和更新操作,导致十分缓慢。使用了批量操作之后速度有明显提升,几乎百倍千倍的速度提升。

    博主之前统计过,通过普通接口一次数据库插入大概需要200ms,对于大量新增或更新操作的情况,数据库批量操作是十分有必要的。废话不多说,直接上代码。

    博主的resultMap如下:

    <resultMap id="BaseResultMap" type="com.luo.domain.Words" >
        <id column="word_no" property="wordNo" jdbcType="BIGINT" />
        <result column="value" property="value" jdbcType="VARCHAR" />
        <result column="filed_class" property="filedClass" jdbcType="VARCHAR" />
        <result column="pinyin" property="pinyin" jdbcType="VARCHAR" />
        <result column="synonym" property="synonym" jdbcType="VARCHAR" />
        <result column="create_date" property="createDate" jdbcType="TIMESTAMP" />
        <result column="update_date" property="updateDate" jdbcType="TIMESTAMP" />
        <result column="operator_no" property="operatorNo" jdbcType="VARCHAR" />
        <result column="src_channel" property="srcChannel" jdbcType="VARCHAR" />
        <result column="latest_operation" property="latestOperation" jdbcType="VARCHAR" />
        <result column="versions" property="versions" jdbcType="BIGINT" />
        <result column="file_index" property="fileIndex" jdbcType="BIGINT" />
        <result column="charac_class" property="characClass" jdbcType="VARCHAR" />
        <result column="weight" property="weight" jdbcType="INTEGER" />
    </resultMap>

    批量新增

    <insert id="addWordsByList" parameterType="java.util.List">
        insert into words (word_no, value, filed_class, 
          pinyin, synonym, create_date, 
          update_date, operator_no, src_channel, 
          latest_operation, versions, file_index, 
          charac_class, weight)
        values 
        <foreach collection="list" item="item" index="index" separator="," >
            (#{item.wordNo},#{item.value},#{item.filedClass},#{item.pinyin},
            #{item.synonym},#{item.createDate},#{item.updateDate},#{item.operatorNo},
            #{item.srcChannel},#{item.latestOperation},#{item.versions},#{item.fileIndex},
            #{item.characClass},#{item.weight})
        </foreach>
    </insert>

    接口:

    public void addWordsByList(List<Words> wordsList);

    批量更新

    批量更新必须在添加如下数据库连接配置:&allowMultiQueries=true,否则会报SQL格式错误

    比如MySQL:

    jdbc:MySQL://127.0.0.1:3306/test?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true
    <update id="updateWordsByList"  parameterType="java.util.List">  
        <foreach collection="list" item="item" index="index" separator=";">
           update words
           <set >
              <if test="item.value != null" >
                value = #{item.value,jdbcType=VARCHAR},
              </if>
              <if test="item.filedClass != null" >
                filed_class = #{item.filedClass,jdbcType=VARCHAR},
              </if>
              <if test="item.pinyin != null" >
                pinyin = #{item.pinyin,jdbcType=VARCHAR},
              </if>
              <if test="item.synonym != null" >
                synonym = #{item.synonym,jdbcType=VARCHAR},
              </if>
              <if test="item.createDate != null" >
                create_date = #{item.createDate,jdbcType=TIMESTAMP},
              </if>
              <if test="item.updateDate != null" >
                update_date = #{item.updateDate,jdbcType=TIMESTAMP},
              </if>
              <if test="item.operatorNo != null" >
                operator_no = #{item.operatorNo,jdbcType=VARCHAR},
              </if>
              <if test="item.srcChannel != null" >
                src_channel = #{item.srcChannel,jdbcType=VARCHAR},
              </if>
              <if test="item.latestOperation != null" >
                latest_operation = #{item.latestOperation,jdbcType=VARCHAR},
              </if>
              <if test="item.versions != null" >
                versions = #{item.versions,jdbcType=BIGINT},
              </if>
              <if test="item.fileIndex != null" >
                file_index = #{item.fileIndex,jdbcType=BIGINT},
              </if>
              <if test="item.characClass != null" >
                charac_class = #{item.characClass,jdbcType=VARCHAR},
              </if>
              <if test="item.weight != null" >
                weight = #{item.weight,jdbcType=INTEGER},
              </if>
            </set>
            where word_no = #{item.wordNo,jdbcType=BIGINT}
        </foreach>       
    </update>

    接口:

    public void updateWordsByList(List<Words> wordsList);
    展开全文
  • 前端面试题(持续更新中)

    万次阅读 多人点赞 2019-11-06 17:16:33
    前端面试题 1.闭包 闭包就是能够读取其他函数内部变量的函数。 闭包的缺点:滥用闭包函数会造成内存泄露,因为闭包中引用到的包裹函数中定义的变量都 永远不会被释放,所以我们应该在必要的...引用数据类型:Objec...

    全家桶项目源码:Vue全家桶+SSR+Koa2全栈开发美团网[完整版] 链接:https://pan.baidu.com/s/1cwPDVkj_I5z568mYIHni4A 提取码:24g2

    2020字节跳动扎心面试题链接(从公众号获取的):
    https://mp.weixin.qq.com/s/B8xRPxwjJfURyYzTQgIxUw

    CSS面试题:
    1、谈谈你对CSS盒模型的认识?

    1、基本概念:标准模型+IE模型
    CSS盒模型本质上是一个盒子,封装周围的HTML元素,它包括:内边距(padding),边框(border),margin(外边距),和内容(content)。
    标准盒模型:一个块的总宽度=width+margin(左右)+padding(左右)+border(左右)
    怪异(IE)盒模型:一个块的总宽度=width+margin(左右)(既width已经包含了padding和border值)
    设置盒模型:box-sizing:border-box

    2、CSS是如何设置这两种模型,那么二者怎么转化呢?

    content-box: 指的是W3C标准盒模型,也是默认的设置属性。
    border-box:指的是IE盒模型,width和height包含了padding和border。

    3、JS如何获取盒模型对应的宽和高?

    dom.style.width/height:对节点样式可读可写,但只能读或写内嵌的CSS样式对于在(style)或外联样式不能读写。
    dom.currentStyle.width/height:拿到的是渲染之后的宽和高,比较真实,但支持IE浏览器
    window.getComputedStyle(dom).width/height:方法是只读的,只能获取样式,不能设置。
    dom.getBoundingClientRect().width/height:getBoundingClientRect()方法得到8个值,除了 width 和 height 外的属性x、y、left、top、right和bottom都是相对于视口(viewport)的左上角位置而言的。

    4、什么是BFC?BFC的原理?

    块级格式化上下文。是一种边距重叠解决方案。
    应用场景: 1. 解决margin叠加的问题
    2. 用于布局(overflow: hidden)
    3.BFC不会与浮动盒子叠加。
    4. 用于清除浮动,计算BFC高度。

    5、行内元素和块级元素有什么区别?

    块级元素:显示在一块内,会自动换行,元素会从上到下垂直排列,各自占一行,块级元素可以设置宽高,如p,ul,form,div,(h1-h6)等标签元素
    行内元素:元素在一行内水平排列,高度由元素的内容决定,行内元素不可以设置宽高,如a,br,span,input等元素。

    6、行内元素和块级元素如何转换?

    行变块display:block
    块变行display:inline
    display:inline-block(可以在同一行内显示)

    7、什么是伪类选择器和伪元素?列举3个CSS3中引入的伪类选择器和伪元素!

    伪类用一个冒号来表示,而伪元素则用两个冒号来表示
    伪元素选择器:dom中不存在的元素,仅仅是css中用来渲染,添加一些特殊效果的,比如p::before,选择p标签(真元素)前面的假元素(伪元素,p标签前面没有元素,只是假设有)
    ::first-line选择元素的第一行,比如说改变每个段落的第一行文本的样式
    ::before::after这两个主要用来给元素的前面或后面插入内容,这两个常用"content"配合使用,见过最多的就是清除浮动
    ::selection用来改变浏览网页选中文的默认效果

    伪类选择器:一个概念上的类,不是我们定义的,是抽象的。如a:hover,选择a标签(元素选择器)中具有鼠标悬停类的所有元素,这个类是抽象的,不是我们自己定义的,再如first-child,选择第一个,选择具有这个类性质的所有元素,“第一个”,这个类就抽象了,我们没必要定义一个第一个这样的类
    列举::root()选择器,根选择器,匹配元素E所在文档的根元素。在HTML文档中,根元素始终是(html)。:root选择器等同于(html)元素。
    :not()选择器称为否定选择器,和jQuery中的:not选择器一模一样,可以选择除某个元素之外的所有元素。
    :empty()选择器表示的就是空。用来选择没有任何内容的元素,这里没有内容指的是一点内容都没有,哪怕是一个空格。

    8、px和em,rem的区别?

    px 实际上就是像素,用PX设置字体大小时,比较稳定和精确。px是固定长度单位,不随其它元素的变化而变化
    em 就是根据基准来缩放字体的大小。em 是相对长度单位。em是相对于父级元素的单位,会随父级元素的属性(font-size或其它属性)变化而变化
    rem是CSS3新增的一个相对单位,rem是相对于根目录(HTML元素)的,所有它会随HTML元素的属性(font-size)变化而变化
    例如: ==屏幕宽度/设计宽度 = 1rem的值/预设定rem的值。
    1920/1920=100/100 ;
    所以 1rem=1920/1920*100 ;
    document.documentElement 是html节点
    document.documentElement.style.fontSize = ((windowWidth / designWidth) * rem2px) + 'px';
    假如,用户将屏幕拖小了,变为960。1rem将自动变为50px;960/1920乘以100=50
    这里需要判断下,当屏幕的宽度大于设计稿定义的宽度,用设计稿的宽度,如果小于,用屏幕宽度作为变量屏幕宽度。

    10、关于绝对定位,相对定位和固定定位

    1、相对定位不脱离标准流,在页面中占位置 。
    相对于自己原来的位置来进行定位 。
    2、绝对定位脱离标准流,在页面中不占位置。
    如果没有父元素,则相对于body定位;如果有父元素,但父元素没有定位,那么还是相对于body定位;如果父元素有定位,那么相对于父元素来定位。
    3、固定定位:相对于浏览器窗口进行定位
    相对定位:position: relative;
    绝对定位:position: absolute;

    11、CSS 选择符有哪些?哪些属性可以继承?优先级算法如何计算? CSS3新增伪类有那些?

    CSS 选择符:
    1.id选择器( # myid)
    2.类选择器(.myclassname)
    3.标签选择器(div, h1, p)
    4.相邻选择器(h1 + p)
    5.子选择器(ul > li)
    6.后代选择器(li a)
    7.通配符选择器( * )
    8.属性选择器(a[rel = “external”])
    9.伪类选择器(a: hover, li:nth-child)

    1.2 可以继承的属性:
    可继承的样式: font-size font-family color, UL LI DL DD DT;
    不可继承的样式:border padding margin width height ;

    优先级: !important > id > class > tag
    important 比 内联优先级高,但内联比 id 要高

    CSS3新增伪类举例:
    p:first-of-type 选择属于其父元素的首个 <p> 元素的每个 <p> 元素。
    p:last-of-type 选择属于其父元素的最后 <p> 元素的每个<p> 元素。
    p:only-of-type 选择属于其父元素唯一的<p> 元素的每个<p> 元素。
    p:only-child 选择属于其父元素的唯一子元素的每个<p> 元素。
    p:nth-child(2) 选择属于其父元素的第二个子元素的每个<p> 元素。
    :enabled :disabled 控制表单控件的禁用状态。
    :checked 单选框或复选框被选中。

    12、以下是CSS3的几种常用前缀

    -webkit
    -moz
    -ms
    -o

    13、CSS3新增的伪类有哪些

    p:last-of-type 选择属于其父元素的最后 <p> 元素的每个 <p> 元素。
    p:only-of-type 选择属于其父元素唯一的<p> 元素的每个 <p> 元素。
    p:only-child 选择属于其父元素的唯一子元素的每个 <p> 元素。
    p:nth-child(2) 选择属于其父元素的第二个子元素的每个 <p> 元素。
    :enabled、:disabled 控制表单控件的禁用状态。
    p:first-of-type 选择属于其父元素的首个 <p> 元素的每个 <p> 元素。
    :checked,单选框或复选框被选中。

    14、CSS3有哪些新特性?

    1. CSS3实现圆角(border-radius),阴影(box-shadow)
    2. 对文字加特效(text-shadow),线性渐变(gradient),旋转(transform)
    3. transform:rotate(9deg) scale(0.85,0.90) translate(0px,-30px) skew(-9deg,0deg);// 旋转,缩放,定位,倾斜
    4. 增加了更多的CSS选择器 多背景 rgba
    5. 在CSS3中唯一引入的伪类是 ::selection.
    6. 媒体查询,多栏布局
    7. border-image

    15、为什么要初始化CSS样式。

    因为浏览器的兼容问题,不同浏览器对有些标签的默认值是不同的,如果没对CSS初始化往往会出现浏览器之间的页面显示差异。当然,初始化样式会对SEO有一定的影响,但求影响最小的情况下初始化。

    16、解释下浮动和它的工作原理?清除浮动的技巧

    由于浮动元素不再占用原文档流的位置,所以它会对后面的元素排版产生影响,清除浮动的本质:主要为了解决父级元素因为子级浮动引起内部高度为0的问题。

    1. 使用空标签清除浮动。
      这种方法是在所有浮动标签后面添加一个空标签 定义css clear:both. 弊端就是增加了无意义标签。
    2. 使用overflow。
      给包含浮动元素的父标签添加css属性 overflow:auto; zoom:1; zoom:1用于兼容IE6。
    3. 使用after伪对象清除浮动。
      该方法只适用于非IE浏览器。
      一、该方法中必须为需要清除浮动元素的伪对象中设置 height:0,否则该元素会比实际高出若干像素;
      可以给父元素设置overflow:auto或者hidden

    #JS的面试问题:
    0、如何判断一个变量是对象还是数组?

    1、我们能够使用typeof判断变量的身份,判断字符串得到string,数字和NaN得到number,函数会得到function等,但是判断数组,对象和null时都会得到object,这就是typeof的局限性,
    2、使用instanceof(比较运算符)可以用来判断一个变量是数组还是对象
    3、constructor(构造函数)
    4、Object.prototype.toString.call()
    总结:判断简单数据类型可以用typeof,判断数组,对象使用instanceofconstructorObject.prototype.toString.call(),最好使用Object.prototype.toString.call(),更加精准

    1.闭包

    闭包就是能够读取其他函数内部变量的函数。
    外部函数调用之后其变量对象本应该被销毁,但闭包的存在使我们仍然可以访问外部函数的变量对象
    创建闭包最常见方式,就是在一个函数内部创建另一个函数。
    闭包的缺点:滥用闭包函数会造成内存泄露,因为闭包中引用到的包裹函数中定义的变量都永远不会被释放
    在退出函数之前,将不使用的局部变量全部删除。可以使变量赋值为null;

    2.数据类型

    基本数据类型:String( 字符串),Boolean(布尔),number(数值),Null(空值),undefined(未定义)
    引用数据类型:Object(Array,Date,RegExp,Function)

    3.javascript 中 == 和 === 的区别是什么?举例说明。

    ===会自动进行类型转换,==不会

    4.请尽可能详尽的解释 ajax 的工作原理

    思路:先解释异步,再解释 ajax 如何使用
    Ajax 的原理简单来说通过 XmlHttpRequest 对象来向服务器发异步请求,从服务器获得数据,然后用JS来操作DOM而更新页面。XMLHttpRequest 是 ajax 的核心机制,它是在 IE5 中首先引入的,是一种支持异步请求的技术。简单的说,也就是 javascript 可以及时向服务器提出请求和处理响应,而不阻塞用户。达到无刷新的效果。
    特点:Ajax 可以实现异步通信效果,实现页面局部刷新,带来更好的用户体验;按需获取数据,节约带宽资源

    ajax是什么?

    1. 通过异步模式,提升了用户体验
    2. 优化了浏览器和服务器之间的传输,减少不必要的数据往返,减少了带宽占用
    3. Ajax 在客户端运行,承担了一部分本来由服务器承担的工作,减少了大用户量下的服务器负载。

    Ajax 的缺点:

    1. Ajax 不支持浏览器 back 按钮
    2. 安全问题 Ajax 暴露了与服务器交互的细节
    3. 对搜索引擎的支持比较弱
    4. 破坏了程序的异常机制
    5. 不容易调试

    HTTP协议类型题目:
    5. HTTP 状态消息

    200:请求已成功,请求所希望的响应头或数据体将随此响应返回。
    302:请求的资源临时从不同的 URI 响应请求。由于这样的重定向是临时的,客户端应当
    继续向原有地址发送以后的请求。只有在Cache-Control或 Expires中进行了指定的情况下,
    这个响应才是可缓存的
    304:如果客户端发送了一个带条件的 GET 请求且该请求已被允许,而文档的内容(自上
    次访问以来或者根据请求的条件)并没有改变,则服务器应当返回这个状态码。304 响应禁
    止包含消息体,因此始终以消息头后的第一个空行结尾。
    403:服务器已经理解请求,但是拒绝执行它。
    404:请求失败,请求所希望得到的资源未被在服务器上发现。
    500:服务器遇到了一个未曾预料的状况,导致了它无法完成对请求的处理。一般来说,这个问题都会在服务器端的源代码出现错误时出现。

    6.说一下什么是Http协议

    对客户端和服务器端之间数据传输的格式规范,格式简称为“超文本传输协议”

    7.什么是Http协议无状态协议?怎么解决Http协议无状态协议?

    (1)、无状态协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息
    (2)、无状态协议解决办法: 通过1、Cookie 2、通过Session会话保存。

    8.Http协议中有哪些请求方式?

    GET:用于请求访问已经被URI(统一资源标识符)识别的资源,可以通过URL传参给服务器,从指定的资源请求数据
    POST:用于传输信息给服务器, 向指定的资源提交要处理的数据
    PUT:传输文件,报文主体中包含文件内容,保存到对应URI位置
    HEAD:获得报文首部,与GET方法类似,只是不返回报文主体,一般用于验证URI是否有效
    DELETE:删除文件,与PUT方法相反,删除对应URI位置的文件
    OPTIONS:查询响应URI支持的HTTP方法

    区别:

    Get 是通过地址栏来传值,而 Post 是通过提交表单来传值。

    在这里插入图片描述

    9.Http协议由什么组成?

    请求报文包括三部分:
    (1).请求行:包含请求方法,URI,HTTP版本协议 (2).请求首部字段 (3).请求内容实体
    响应报文包含三部分:
    (1).状态行:包含HTTP版本,状态码,状态码原因短语 (2).响应首部字段 (3).响应内容实体

    10.HTTP协议的工作原理?

    HTTPS在传输数据之前需要客户端(浏览器)与服务端(网站)之间进行一次握手,在握手过程中将确立双方加密传输数据的密码信息,通常情况下会配合数字证书实现。

    13.ajax的同步和异步区别:

    1. 同步:提交请求 -> 等待服务器处理 -> 处理完毕返回,这个期间客户端浏览器不能干任何事
    2. 异步:请求通过事件触发 -> 服务器处理(这是浏览器仍然可以作其他事情)-> 处理完毕
      ajax.open方法中,第3个参数是设同步或者异步。

    14.跨域? ?

    理解跨域的概念:协议、域名、端口都相同才同域,否则都是跨域

    14-1、什么情况下会碰到跨域问题?有哪些解决方法?

    跨域是指a页面想获取b页面资源,如果a、b页面的协议、域名、端口、子域名不同,或是a页面为ip地址,b页面为域名地址,所进行的访问行动都是跨域的,而浏览器为了安全问题一般都限制了跨域访问,也就是不允许跨域请求资源。
    解决方法:1. JSONP方法:JSONP是服务器与客户端跨源通信的常用方法,Jsonp 需要目标服务器配合一个callback函数网页通过添加一个(script)元素,向服务器请求JSON数据,这种做法不受同源政策限制;服务器收到请求后,将数据放在一个指定名字的回调函数里传回来。
    首先,网页动态插入(script)元素,由它向跨源网址发出请求。
    2.通过修改document.domain来跨子域
    3.使用window.name来进行跨域
    4.通过CORS解决AJAX跨域

    15.简述 ajax 的过程。

    1. 创建 XMLHttpRequest 对象,也就是创建一个异步调用对象
    2. 创建一个新的 HTTP 请求,并指定该 HTTP 请求的方法、URL 及验证信息
    3. 设置响应 HTTP 请求状态变化的函数
    4. 发送 HTTP 请求
    5. 获取异步调用返回的数据
    6. 使用 JavaScript 和 DOM 实现局部刷新

    16.axios和ajax的区别

    axios是通过promise实现对ajax技术的一种封装,就像jQuery实现ajax封装一样。
    简单来说: ajax技术实现了网页的局部数据刷新,axios实现了对ajax的封装。

    ②axios特征:
    1.自动转换JSON数据
    2.从 node.js 创建 http 请求
    3.支持 Promise API
    4.客户端支持防止CSRF
    5.提供了一些并发请求的接口
    PS:防止CSRF:就是让你的每个请求都带一个从cookie中拿到的key,根据浏览器同源策略,假冒的网站是拿不到你cookie中得到key的,这样,后台就可以轻松辨别出这个请求是否是用户在假冒网站上的误导输入,从而采取正确的策略

    17.JavaScript 链 原型,原型链 ? 有什么特点?

    1.原型对象也是普通的对象,是对象一个自带隐式的 _ proto_ 属性,原型也有可能有自己的原型,如果一个原型对象的原型不为null 的话,我们就称之为原型链
    2. 原型链是由一些用来继承和共享属性的对象组成的(有限的)对象链。

    3.每一次获取对象中的属性都是一次查询过程,如果在自有属性中找不到就会去原型对象中查找,如果原型对象中还查不到,就回去原型对象的原型中查找,也就是按照原型链查找,直到查找到原型链的顶端,也就是Object的原型。

    作用域链:
      一般情况下,变量取值到 创建 这个变量 的函数的作用域中取值。
      但是如果在当前作用域中没有查到值,就会向上级作用域去查,直到查到全局作用域,这么一个查找过程形成的链条就叫做作用域链。

    一、作用域
      在 Javascript 中,作用域分为 全局作用域 和 函数作用域
      全局作用域:
        代码在程序的任何地方都能被访问,window 对象的内置属性都拥有全局作用域。
      函数作用域:
        在固定的代码片段才能被访问

    18、JS创建对象有几种方法?

    1.new Object()
    2.使用字面量
    3.工厂模式
    4.构造函数模式(constructor)
    5.原型模式(prototype)
    6.构造函数+原型模式
    还是点击下面链接讲解的比较详细吧 ↓
    https://www.jianshu.com/p/1fb0447db852
    在这里插入图片描述

    19、虚拟dom和实体dom的区别?

    DOM的本质:
    浏览器概念,浏览器从服务器端读取html页面,浏览器将html解析成一棵元素嵌套关系的dom树,用对象来表示页面上的元素,并提供操作dom对象的api。
    虚拟DOM:
    框架概念,程序员用js对象来模拟页面上dom元素的嵌套关系( 本质 ),为了实现页面元素的高效更新( 目的 )
    区别:1、虚拟DOM不会进行重排与重绘操作;
    2、虚拟DOM进行频繁修改,然后一次性比较并修改真实DOM中需要修改的部分,最后进行重排和重绘,减少过多DOM节点重排和重绘损耗。
    3、虚拟DOM有效降低大面积(真实DOM节点)的重排和重绘,因为最终与真实DOM比较差异,可以局部渲染

    20、描述一下事件冒泡机制

    当你使用事件冒泡时,子级元素先触发,父级元素后触发,即p先触发,div后触发。

    21、请描述一下cookies,sessionStorage和localStorage的区别

    cookie(储存在用户本地终端上的数据)是网站为了标识用户身份而储存在用户本地终端上的数据,cookie数据始终在同源的http请求中携带,只会在浏览器和服务器间来回传递。另外两个不会自动把数据发给服务器,仅在本地保存。
    在这里插入图片描述

    22、js阻止事件冒泡的两种方法

    event.stopPropagation( )
    event.target

    23、JS的内置对象
    在这里插入图片描述
    24、函数调用的四种方式

    函数调用模式
    方法调用模式
    构造器调用模式
    间接调用模式,通过call()和apply()进行

    25、JS中常见的几种继承方法

    1.原型链继承
    原型链实现继承的思想:利用原型让一个引用类型继承另一个引用类型的属性和方法。
    原型链的基本概念: 当一个原型对象等于另一个类型的实例,此时的原型对象将包含一个指向另一个指向另一个原型的指针。同时,另一个原型中也包含着一个指向另一个构造函数的指针。如果另一个原型是另一个类型的实例,此时实例和原型就构成了原型链
    原型链存在的问题
    1)包含引用类型值的原型属性会被所有实例共享,这会导致对一个实例的修改会影响另一个实例。在通过原型来实现继承时,原型实际上会变成另一个类型的实例。原先的实例属性就变成了现在的原型属性
    2)在创建子类型的实例时,不能向超类型的构造函数中传递参数

    2.构造函数继承(经典继承)
    借用构造函数的基本思想,即在子类型构造函数的内部调用超类型构造函数。函数只不过是在特定环境中执行代码的对象,因此通过使用apply()和call()方法可以在新创建的对象上执行构造函数
    借用构造函数的优势:可以在子类型构造函数中向超类型构造函数传递参数
    借用构造函数的问题:
    1)无法避免构造函数模式存在的问题,方法都在构造函数中定义,因此无法复用函数。
    2)在超类型的原型中定义的方法,对子类型而言是不可见的。因此这种技术很少单独使用。

    3.组合方式继承(构造函数 + 原型链)
    组合继承:指的是将原型链和借用构造函数的技术组合到一起。思路是使用原型链实现对原型方法的继承,而通过借用构造函数来实现对实例属性的继承。这样,既通过在原型上定义方法实现了函数的复用,又能够保证每个实例都有它自己的属性。
    组合继承的优势
    避免了原型链和借用构造函数的缺点,融合了他们的优点,是JavaScript中最常用的继承模式。instanceof和isprototypeOf()也能够用于识别基于组合继承创建的对象

    4.es6方法继承

    27、JS运行机制

    JS为什么是单线程?

    • JS的单线程,与它的用途有关。作为浏览器脚本语言,JavaScript的主要用途是与用户互动,以及操作DOM。这决定了它只能是单线程,否则会带来很复杂的同步问题。

    JS的运行机制:

    • 因为JavaScript是单线程,意味着任务要一个接着一个完成,但是,如果前一个任务执行时间很长,那么后面的任务就得一直阻塞着,这样用户体验十分差。
      JavaScript的设计者考虑到了这一点,所以他将JavaScript的任务分为两种,在主线程上执行的任务"同步任务",被主线程挂载起来的任务"异步任务",后者一般是放在一个叫任务队列的数据结构中。
      只有当所有同步任务都执行完了才会,开始观察任务队列中被挂载起来的任务,并且按照队列的特性,先进先出的依次执行。

    28、DOM是什么?

    DOM是Document Object Model,即文档对象模型,它允许脚本控制Web页面、窗口和文档。

    29、DOM事件流(event flow )存在三个阶段:事件捕获阶段、处于目标阶段、事件冒泡阶段。

    事件捕获(event capturing):通俗的理解就是,当鼠标点击或者触发dom事件时,浏览器会从根节点开始由外到内进行事件传播,即点击了子元素,如果父元素通过事件捕获方式注册了对应的事件的话,会先触发父元素绑定的事件。
    事件冒泡(dubbed bubbling):与事件捕获恰恰相反,事件冒泡顺序是由内到外进行事件传播,直到根节点。
    无论是事件捕获还是事件冒泡,它们都有一个共同的行为,就是事件传播,
    dom标准事件流的触发的先后顺序为:先捕获再冒泡,即当触发dom事件时,会先进行事件捕获,捕获到事件源之后通过事件传播进行事件冒泡。

    30、数组去重的方法

    1.ES6 Set去重

    var arr = [1,2,3,3,2,1,5,1];
    var arr2 = Array.from(new Set(arr))
    console.log(arr2)
    
    var arr = [1,2,3,3,2,1,5,1];
    let a = [...new Set(arr)]
    console.log(a)
    

    2.利用for嵌套for,然后splice去重
    3.利用indexOf去重

    var arr = [1,3,4,5,6,7,4,3,2,4,5,6,7,3,2];
    function find(){
    var newArr = [];
    for (var i = 0; i < arr.length; i++) {
    if (newArr.indexOf(arr[i]) == -1 ) { //也可以换成if(newArr.indexOf(arr[i])<0)
    newArr.push(arr[i]);
      }
    }
    consoloe.log(newArr); // [1, 3, 4, 5, 6, 7, 2]
    }
    find(arr); //调用这个方法  indexOf对大小写敏感
    

    4.利用filter
    filter(x,index,self)可以为数组提供过滤功能,其中x代表元素,index是与X一同传入元素的索引,而self代表数组本身。

    var arr = [1, 2, 2, 3, 4, 5, 5, 6, 7, 7];
    var arr2 = arr.filter(function(x, index,self) {
    return self.indexOf(x)===index;
    }); 
    console.log(arr2); //[1, 2, 3, 4, 5, 6 ,7]
    

    32、事件委托

    简介:事件委托指的是,不在事件的发生地(直接dom)上设置监听函数,而是在其父元素上设置监听函数,通过事件冒泡,父元素可以监听到子元素上事件的触发,通过判断事件发生元素DOM的类型,来做出不同的响应。
    举例:最经典的就是ul和li标签的事件监听,比如我们在添加事件时候,采用事件委托机制,不会在li标签上直接添加,而是在ul父元素上添加。
    好处:比较合适动态元素的绑定,新添加的子元素也会有监听函数,也可以有事件触发机制。

    34、DOM操作——怎样添加、移除、移动、复制、创建和查找节点。

    在这里插入图片描述

    35、null和undefined的区别?

    null是一个表示"无"的对象,转为数值时为0
    undefined是一个表示"无"的原始值,转为数值时为NaN
    当声明的变量还未被初始化时,变量的默认值为undefined
    null用来表示尚未存在的对象,常用来表示函数企图返回一个不存在的对象
    undefined表示 “缺少值”,就是此处应该有一个值,但是还没有定义。典型用法是:

    • 1.变量被声明了,但没有赋值时,就等于 undefined
      2. 调用函数时,应该提供的参数没有提供,该参数等于 undefined
      3. 对象没有赋值的属性,该属性的值为 undefined
      4. 函数没有返回值时,默认返回 undefined
    • null表示“没有对象”,即该处不应该有值。典型用法是:
      1. 作为函数的参数,表示该函数的参数不是对象
      2. 作为对象原型链的终点

    36、哪些操作会造成内存泄漏?

    内存泄漏指任何对象在您不再拥有或需要它之后仍然存在。
    垃圾回收器定期扫描对象,并计算引用了每个对象的其他对象的数量。如果一个对象的引用数量为 0(没有其他对象引用过该对象),或对该对象的惟一引用是循环的,那么该对象的内存即可回收。

    • setTimeout 的第一个参数使用字符串而非函数的话,会引发内存泄漏。
    1. 闭包
    2. 控制台日志
    3. 循环(在两个对象彼此引用且彼此保留时,就会产生一个循环)

    37、typeof null返回什么?为什么?

    不同的对象在底层都表示为二进制,在javascript中二进制前三位都为0的话会被判断为object类型,
    null的二进制表示全0,自然前三位也是0,所以执行typeof时会返回“object”

    39、ES6中…运算符能做什么

    1.复制数组 2.合并数组 3. 扩展运算符可以与解构赋值结合起来,用于生成数组。 4.扩展运算符还可以将字符串转为真正的数组

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

    第一种——调用localStorage
    在一个标签页里面使用 localStorage.setItem(key,value)添加(修改、删除)内容;
    在另一个标签页里面监听 storage 事件。
    即可得到 localstorge 存储的值,实现不同标签页之间的通信。

    第二种——调用cookie+setInterval()
    将要传递的信息存储在cookie中,每隔一定时间读取cookie信息,即可随时获取要传递的信息。

    43、数据类型的自动转换和隐式转换你知道哪些?

    隐式类型转换:
    1 == ‘1’
    ‘1’ + 1
    ‘1’ - 1
    显示类型转换
    parseInt(str,radix)/parseFloat(str,radix)/Number()转变成数字。
    Boolean(param)转变成布尔值
    subString()转变成字符串

    VUE方面的问题:
    1.谈谈你对MVVM开发模式的理解

    Vue是一个 MVVM框架,其各层的对应关系如下:
    View层:在Vue中是绑定dom对象的HTML(代表UI视图,负责数据的展示;)
    ViewModel层:在Vue中是实例的vm对象 (负责监听 Model 中数据的改变并且控制视图的更新,处理用户交互操作;)
    Model层:在Vue中是data、computed、methods等中的数据(代表数据模型,数据和业务逻辑都在Model层中定义;)
    在 Model 层的数据变化时,View层会在ViewModel的作用下,实现自动更新

    2、Vue的响应式原理?

    Vue响应式底层实现方法是 Object.defineProperty() 方法,该方法中存在一个getter和setter的可选项,可以对属性值的获取和设置造成影响
    Vue中编写了一个wather来处理数据,在使用getter方法时,总会通知wather实例对view层渲染页面,同样的,在使用setter方法时,总会在变更值的同时,通知wather实例对view层进行更新

    3、Vue的生命周期

    1.beforeCreate --创建前
    触发的行为:vue实例的挂载元素$el和数据对象data都为undefined,还未初始化。
    在此阶段可以做的事情:加loading事件
    2.created --创建后
    触发的行为:vue实例的数据对象data有了,$el还没有
    在此阶段可以做的事情:解决loading,请求ajax数据为mounted渲染做准备
    3.beforeMount --渲染前
    触发的行为:vue实例的$el和data都初始化了,但还是虚拟的dom节点,具体的data.filter还未替换
    在此阶段可以做的事情:。。。
    4.mounted --渲染后
    触发的行为:vue实例挂载完成,data.filter成功渲染
    在此阶段可以做的事情:配合路由钩子使用
    5.beforeUpdate --更新前
    触发的行为:data更新时触发
    在此阶段可以做的事情:。。。
    6.updated —更新后
    触发的行为:data更新时触发
    在此阶段可以做的事情:数据更新时,做一些处理(此处也可以用watch进行观测)
    7.beforeDestroy —销毁前
    触发的行为:组件销毁时触发
    在此阶段可以做的事情:可向用户询问是否销毁
    8.destroyed —销毁后
    触发的行为:组件销毁时触发,vue实例解除了事件监听以及和dom的绑定(无响应了),但DOM节点依旧存在
    在此阶段可以做的事情:组件销毁时进行提示

    4、请详细说下你对vue生命周期的理解?

    答:总共分为8个阶段:创建前 / 后,载入前 / 后,更新前 / 后,销毁前 / 后。
    创建前/后: 在beforeCreated阶段,vue实例的挂载元素$el和数据对象data都为undefined,还未初始化。
    载入前/后:在beforeMount阶段,vue实例的$el和data都初始化了,但还是挂载之前为虚拟的dom节点,data.message还未替换。在mounted阶段,vue实例挂载完成,data.message成功渲染。
    更新前/后:当data变化时,会触发beforeUpdateupdated方法。
    销毁前/后:在执行destroy方法后,对data的改变不会再触发周期函数,说明此时vue实例已经解除了事件监听以及和dom的绑定,但是dom结构依然存在

    5、vue生命周期在真实场景下的业务应用

    created: 进行ajax请求异步数据的获取、初始化数据
    mounted: 挂载元素内dom节点的获取
    nextTick: 针对单一事件更新数据后立即操作dom
    updated: 任何数据的更新,如果要做统一的业务逻辑处理
    watch: 监听具体数据变化,并做相应的处理

    7、Vue中双向数据绑定是如何实现的?

    Vue在组件和实例初始化的时候,会将data里的数据进行数据劫持(object.definepropty对数据做处理)。被解除过后的数据会有两个属性:一个叫getter,一个叫setter
    getter是使用数据的时候触发,setter是在修改数据的时候触发,修改数据的时候触发setter,同时也触发了底层的watcher(可以收到属性的变化通知并执行相应的函数,从而更新视图。)监听,通知dom修改刷新。

    8、父组件与子组件传值

    父向子传值:属性传值,父组件通过给子组件标签上定义属性,子组件通过props方法接收数据;
    子向父传值:事件传值,子组件通过$emit(‘自定义事件名’,值),父组件通过子组件上的@自定义事件名=“函数”接收 ($emit方法传递参数)

    10、 如何让css只在当前组件中起作用

    将当前组件的 (style)修改为(styple scoped)

    11、第一次加载页面会触发哪几个钩子

    第一次加载会触发 beforeCreatecreatedbeforeMountmounted四个钩子

    12、Vuex是什么?

    Vuex是专门为Vue服务,用于管理页面的数据状态、提供统一数据操作的生态系统
    vuex:是vue提供的状态管理工具,简单解释就是vue各个组件直接的变量是不能直接共享的,组件直接的参数传递才多层的时候变得异常复杂,所以就诞生了vuex的状态管理工具,保证了状态的统一和可追踪
    ①:这个状态自管理应用包含以下几个部分:
    state,驱动应用的数据源;
    view,以声明方式将 state 映射到视图;
    actions,响应在 view 上的用户输入导致的状态变化。
    ②:使用vuex管理数据的好处:
    能够在vuex中集中管理共享的数据,便于开发和后期进行维护
    能够高效的实现组件之间的数据共享,提高开发效率
    存储在vuex中的数据是响应式的,当数据放生改变时,页面中的数据会同步更新
    ③:vuex中的数据和data中的数据与什么区别?
    vuex中的数据是全局的,共享的,data中的数据是私有的
    vuex中的数据是响应式的,只要vuex中的数据发生改变,引用vuex中的数据的文件会同步更新
    vuex中的数据是单向的,想要修改vuex中的数据必须在mutation中修改

    13、router是什么?

    1.routerthis.$router 是路由【导航对象】,用它 可以方便的 使用 JS 代码,实现路由的 前进、后退、 跳转到新的 URL 地址
    2.routes:指创建vue-router路由实例的配置项。用来配置多个route路由对象
    3.routethis.$route 是路由【参数对象】,所有路由中的参数, params, query 都属于它

    14、vue单页面应用及优缺点

    vue核心是一个响应的数据绑定系统,mvvm,数据驱动,组件化,轻量,简洁,高效,快速,模块友好。
    缺点:不支持低版本浏览器,最低到IE9,不利于SEO的优化,首页加载时间较长,不可以使用浏览器的导航按钮需要自行实现前进后退。

    15、vue生命周期的作用是什么?

    它的生命周期中有多个事件钩子,让我们在控制整个Vue实例的过程时更容易形成好的逻辑。

    16、vue.nextTick()的用处?

    nextTick可以使我们在下次DOM更新循环结束之后执行延迟回调,用于获得更新后的DOM。

    18、兄弟组件之间如何传值?

    可以用过一个vue实例Bus作为媒介,要相互通信的兄弟组件之中,都引入Bus,之后通过分别调用Bus事件触发 e m i t 和 监 听 emit和监听 emiton来实现组件之间的通信和参数传递,类似window的全局自定义事件。类似与子传父,只不过是利用一个新的vue示例作为媒介,而不是当前vue示例(this)

    19、jquery和vue的控制DOM元素的主要区别是什么?

    jquery操作的是直接dom元素。vue操作的是dom元素对象。
    vue.js优势是(视图-模型)双向绑定,简化了dom的操作(不用重写大量的html标签),提高dom的复用率(以最少代码实现更多的功能),倾向于数据读写,虽然看上去使用比较繁琐,但是利于后期的维护。
    jquery优势是jquery语义化,容易理解,比较简单,可拓展的插件多。
    总结:如果dom操作频繁,不需要动画效果,就使用vue.js。如果dom操作不频繁,但又需要复杂的动画效果,就使用jquery. vue.js比较适合于后台管理页面,jquery比较适合于前台用户交互页面。

    20、vue2模版template的四种写法?

    1.写在构造器里的:
    2.写在(template)标签里
    3.写在(script type=“x-template”)标签里
    在这里插入图片描述

    21、var let const声明的变量的区别

    let不允许在相同作用域内,重复声明同一个变量。let声明的变量只在其所在代码块内有效
    const是定义常量的,而且定义一次以后不能再进行更改, 否者会报错;
    使用const定义的常量, 拥有let一样的特性(无声明提前, 有块状作用域, 重复声明)

    • let:* 声明的变量只在它所在的代码块有效; * 需要先声明然后再使用,否则报错
    • var:* 声明的变量在全局范围内都有效;
    • var定义的变量可以修改,如果不初始化会输出undefined,不会报错
    • const: * 声明一个只读的常量,一旦声明,常量的值就不允许改变;
    • 一旦声明了变量,就必须初始化,不能留到以后赋值;
    • 只在声明所在的块级作用域内有效;
      在这里插入图片描述

    22、如何理解JSON?

    JSON是一种轻量级的数据交换格式,作用:通常用于服务端向页面传输数据。
    JSON 是 一个 JS 对象,有 2 个 API
    JSON.stringify() 方法用于将 JavaScript 值转换为 JSON 字符串。
    JSON.parse() 方法用于将一个 JSON 字符串转换为对象。

    23、函数声明和函数表达式的区别(作用域)

    1.以函数声明的方法定义的函数,函数名是必须的,而函数表达式的函数名是可选的.
    2.以函数声明的方法定义的函数,函数可以在函数声明之前调用,而函数表达式的函数只能在声明之后调用.
    3.以函数声明的方法定义的函数并不是真正的声明,它们仅仅可以出现在全局中,或者嵌套在其他的函数中,但是它们不能出现在循环,条件或者try/catch/finally中,而函数表达式可以在任何地方声明.

    24、关于动态路由

    不能传递参数的是静态路由,可以传递参数,但是其对应的路由数量是不确定的,叫动态路由
    在参数名前面加上:,然后将参数写在路由的path内
    这是无参数跳转在这里插入图片描述

    query和params两者都可以传递参数,区别是什么?
    1.query 传参配置的是path,而params传参配置的是name,在params中配置path无效
    2.query在路由配置不需要设置参数,而params必须设置
    3.query传递的参数会显示在地址栏中
    4.params传参刷新会无效,但是query会保存传递过来的值,刷新不变

    25、vue是什么?跟JS有什么区别?

    vue就是一个js库,并且无依赖别的js库,跟jquery差不多。vue的核心库只关注视图层,非常容易与其它库或已有项目整合。Vue.js是一个轻巧、高性能、可组件化的MVVM库,同时拥有非常容易上手的API。
    区别:在传统web开发中,我们搭建项目都以html结构为基础,然后通过jquery或者js来添加各种特效功能,需要去选中每一个元素进行命令,这样太繁琐了
    vue的好处:1.数据绑定:vue会根据对应的元素,进行设置元素数据,通过输入框,以及get获取数据等多种方式进行数据的实时绑定,进行网页及应用的数据渲染 。
    2.组件式开发:通过vue的模块封装,它可以将一个web开发中设计的各种模块进行拆分,变成单独的组件,然后通过数据绑定,调用对应模版组件,同时传入参数,即可完成对整个项目的开发。
    一句话概括:用数据绑定的思想,vue可以简单写单个页面,也可以写一个大的前端系统,也可以做手机app的界面。

    26、Vue-CLi是啥?

    它是一个vue.js的脚手架工具。说白了就是一个自动帮你生成好项目目录,配置好Webpack,以及各种依赖包的工具

    27、vue是怎么渲染的?

    1.原有模板语法,挂载渲染:就是对使用Vue标签语法的hmtl进行渲染。
    2.使用render属性,createElement函数直接渲染:原本无html,通过JavaScript 的完全编程的能力生成页面。
    3.使用render属性,配合组件的template属性,createElement函数渲染
    4.使用render属性,配合单文件组件,createElement函数渲染

    28、vue常用的5个事件修饰符
    .stop: 阻止事件冒泡;
    .prevent: 阻止默认事件;
    .capture: 实现捕获触发事件的机制 ;
    .self: 实现只有点击当前元素时候,才会触发事件处理函数 ;
    .once: 事件只触发一次;

    26、vue-router 有哪几种导航钩子?

    第一种:全局导航钩子
    第二种:单独路由独享钩子
    第三种:组件内的钩子

    29、vue-router 路由模式有几种?

    Hash: 使用URL的hash值来作为路由。支持所有浏览器。
    History: 以来HTML5 History API 和服务器配置。参考官网中HTML5 History模式
    Abstract: 支持所有javascript运行模式。如果发现没有浏览器的API,路由会自动强制进入这个模式。

    30、Vue组件通信的六种方法

    • 1.父组件向子组件传值: props/$emit
    • 2.子组件向父组件传值(通过事件形式) $ emit/$on
    • 3.vuex
    • 4.$ attrs/$ listeners
      $ attrs:包含了父作用域中不被 prop 所识别 (且获取) 的特性绑定 (class 和 style 除外)。当一个组件没有声明任何 prop 时,这里会包含所有父作用域的绑定 (class 和 style 除外),并且可以通过 v-bind="$ attrs" 传入内部组件。通常配合 interitAttrs 选项一起使用。
      $ listeners:包含了父作用域中的 (不含 .native 修饰器的) v-on 事件监听器。它可以通过 v-on="$listeners" 传入内部组件
    • 5.provide/inject
    • 6.$parent / $childrenref
      ref:如果在普通的 DOM 元素上使用,引用指向的就是 DOM 元素;如果用在子组件上,引用就指向组件实例
      $parent / $children:访问父 / 子实例

    31、veu中的三要素

    响应式:vue如何监听到 data 每个属性变化?
    vue的响应式原理:Vue在组件和实例初始化的时候,会将data里的数据进行数据劫持(object.definepropty对数据做处理)。被解除过后的数据会有两个属性:一个叫getter,一个叫setter
    getter是使用数据的时候触发,setter是在修改数据的时候触发,修改数据的时候触发setter,同时也触发了底层的watcher(可以收到属性的变化通知并执行相应的函数,从而更新视图。)监听,通知dom修改刷新。

    模板引擎:vue的模板如何被解析,指令如何处理?
    . 本质就是个字符串。模板最终必须转换成JS代码。因为:
    . 有逻辑,如(v-if v-for),必须用JS才能实现
    . 转换为html渲染页面,必须用JS才能实现
    . 因此,模板最重要转化成JS函数(render函数)

    渲染:vue 的模板如何被渲染成 html?
    模板解析成render函数---->返回JS模拟的虚拟DOM结构:模板是一段字符串,模板解析生成render函数,执行render函数返回为vnode,vnode表明了各个节点的层级关系、特性、样式、绑定的事件。
    2、 vnode---->html:通过 updateComponent函数调用vm._update()传入vnode,利用基于snabbdom的patch()方法改造的生成真实DOM节点并渲染页面。

    32、v-if跟v-show的区别

    v-if是通过控制dom节点的存在与否来控制元素的显隐;v-show是通过设置DOM元素的display样式,block为显示,none为隐藏;
    v-if判断是否加载,可以减轻服务器的压力,在需要时加载,但有更高的切换开销;
    v-show调整DOM元素的CSS的dispaly属性,可以使客户端操作更加流畅,但有更高的初始渲染开销。
    如果需要非常频繁地切换,则使用 v-show 较好;如果在运行时条件很少改变,则使用 v-if 较好。

    33、在ES6中,Promise对象只有三种状态

    异步操作“未完成”(pending)
    异步操作“已完成”(resolved,又称fulfilled)
    异步操作“失败”(rejected)

    34、箭头函数和普通函数的区别

    ,不需要通过function关键字创建函数,并且可以省略return关键字.但函数体内的this对象指的是定义时所在的对象,而不是使用时所在的对象;
    ①不绑定this,箭头函数的this永远指向其父作用域,任何方法都改变不了,包括call,apply,bind。
    普通函数的this指向调用它的那个对象。
    ②箭头函数不能作为构造函数,不能使用new
    ③箭头函数不绑定arguments
    ④箭头函数通过callapply调用,不会改变this指向,只会传入参数
    ⑤箭头函数没有原型属性

    35、ES6有哪些新特性

    1.模板字符串:模板字符串是为了解决使用+号拼接字符串的不便利而出现的
    在这里插入图片描述
    2.解析结构
    在这里插入图片描述

    1. 函数默认参数

    在这里插入图片描述
    4.展开运算符
    在这里插入图片描述
    5.class类

    展开全文
  • 新增数据 先创建一张表   多数据插入 只要写一次insert指令,但是可以直接插入多条记录 基本语法:insert into 表名 [(字段列表)] values(值列表), (值列表)…; 主键冲突 主键冲突:在有的表中,使用的...

    新增数据

    先创建一张表

     

    多数据插入

    只要写一次insert指令,但是可以直接插入多条记录

    基本语法:insert into 表名 [(字段列表)] values(值列表), (值列表)…;

    主键冲突

    主键冲突:在有的表中,使用的是业务主键(字段有业务含义),但是往往在进行数据插入的时候,又不确定数据表中是否已经存在对应的主键。

    先创建一张带业务主键的表

     

    主键冲突的解决方案:

    插入数据 :

    当我们知道主键有哪些值的时候这样插入当然没问题,但是举个例子,想一想:比如我是一个学校录入学生信息的老师,录入张三信息的时候,学号录的张三的学号004,其它年龄,姓名等信息却录的李四的,此时我拿着张三的信息对比李四的修改是不是过于麻烦了,这时候就可以应用下面的主键冲突替换(容易点)或者主键冲突更新,我再次录入信息,学号为004,信息录张三,当主键相同时,会把原来的错误信息更新为新的

    1、 主键冲突更新:

    类似插入数据语法,如果插入的过程中主键冲突,那么采用更新方法。(记住update后面不要惯性的加了set)

    Insert into 表名 [(字段列表)] values(值列表) on duplicate key update 字段 = 新值,字段=新值...;

    如下当我不确定插入的数据是否业务主键重复,但确定插入数据无误时可以使用如下主键冲突更新

    2、 主键冲突替换:

    当主键冲突之后,干掉原来的数据,重新插入进去。

    Replace into [(字段列表)] values(值列表);

    把主键为003的其它字段替换掉:

     

    蠕虫复制

    蠕虫复制:一分为二,成倍的增加。从已有的数据中获取数据,并且将获取到的数据插入到数据表中。

    基本语法:

    Insert into 表名 [(字段列表)] select */字段列表 from 表;

    注意:

    1、 蠕虫复制的确通常是重复数据,没有太大业务意义:可以在短期内快速增加表的数据量,从而可以测试表的压力,还可以通过大量数据来测试表的效率(索引)

    2、 蠕虫复制虽好,但是要注意主键冲突。

    展开全文
  • 最近一直在折腾大表的更新问题,今天终于有了突破。兴奋之余发个帖子跟大家分享一下心得,并且讨论一下是否还可能进一步提高处理速度。 问题是这样的:一张5亿条记录的表,没有分区。由于增加了一个冗余字段,需要...
  • 今天,为了更多了解下,mybatis批量新增和批量更新在simple/batch模式 + MySQL的rewriteBatchedStatements下效率有什么区别,做了一次实验。 实验结果,让人意想不到,如果没有亲自测试,可能一直会被网上帖子误导...
  • 近期遇到一个问题,就是当 添加、修改、删除 三个业务,都写入controller(控制层)...a、添加的数据一般uuid为空; b、修改的数据拥有uuid; c、不变的数据toString()结果是相同的; 因此,又以上a、b、c三项可以得出如下...
  • MySQL 面试题

    万次阅读 多人点赞 2019-09-02 16:03:33
    降低数据排序的成本,降低CPU消耗:索引之所以查的,是因为先将数据排好序,若该字段正好需要排序,则正好降低了排序的成本。 ? 索引有什么坏处? 占用存储空间:索引实际上也是一张表,记录了主键与索引...
  • 为了实现电子地图数据的动态更新,以支持日新月异的交通路网的地理信息服务,提出一...实验结果表明,该算法可快捷地自动发现新增道路,新增道路最发现时间小于5 min,是解决目前交通道路图层更新滞后问题的一种有效方法。
  • 近期总结一一些面试题 都是企业的面试题笔记题 感觉薪资10k下的都会出笔试题 ...同时分享一个自己录制的CSS3动画特效经典案例【推荐教程】--后期会更新vue框架 微信小程序等内容。 https://ke.qq.com/cou...
  • 数据打交道,可以是数据库操作,也可以是文件读写操作,甚至是redis缓存操作,总之与数据操作有关的都放在这里,也有人叫做dal或者数据持久层都差不多意思。为什么没有daoImpl,因为我们用的是mybatis,所以可以...
  • mybatis批量更新数据三种方法效率对比

    万次阅读 多人点赞 2019-03-19 18:44:02
    探讨批量更新数据三种写法的效率问题。 实现方式有三种, 一种用for循环通过循环传过来的参数集合,循环出N条sql, 另一种 用mysql的case when 条件判断变相的进行批量更新 还有一个是用ON DUPLICATE KEY ...
  • 消息中间件MQ与RabbitMQ面试题(2020最新版)

    万次阅读 多人点赞 2020-03-01 11:11:21
    Java面试总结(2021优化版)已发布在...文章持续更新中… 序号 内容 链接地址 1 Java基础知识面试题(2020最新版) https://thinkwon.blog.csdn.net/article/details/104390612 2 Java集合容器面试题(2020最新版) ...
  • vue面试题

    千次阅读 多人点赞 2019-08-12 17:02:53
    都有virtual DOM,组件化开发,通过props参数进行父子组件数据的传递,都实现webComponent规范 数据驱动视图 都有支持native的方案,react native,Vue的weex 都有管理状态,react有redux,vue有自己的VueX 不同点:...
  • Oracle入门到实战

    万次阅读 多人点赞 2019-11-09 11:12:07
    person2_add_pid before insert on person2 ---在插入数据前触发,因为需要修改 pid 的 null值 for each row ---行级触发器 declare begin ---打印语句,可以删除 dbms_output.put_line('新增员工名称为:'||:new....
  • 1.出现问题在做数据库开发的时候,经常会遇到这样的一种情景:当一条数据不存在的时候,插入这条数据,如果这条数据的主键已经在数据库中存在,那么更新这条数据。你们一般怎么做呢?先根据主键查询数据,然后判断...
  • 前端面试题

    万次阅读 多人点赞 2019-08-08 11:49:01
    完成函数showImg(),要求能够动态根据下拉列表的选项变化,更新图片的显示 71 截取字符串abcdefg的efg 72 列举浏览器对象模型BOM里常用的至少4个对象,并列举window对象的常用方法至少5个 72 简述列举文档对象...
  • 测试开发笔记

    万次阅读 多人点赞 2019-11-14 17:11:58
    48 七、补充提高 49 第六章 C语言 49 C语言中的存储 50 数据类型 50 常量 53 结构体 54 条件/分支逻辑 54 Switch 54 If 55 循环 55 For 55 while 56 do…while 56 函数 56 第七章 Windows环境搭建 59 一、名词注解...
  • 【数据库学习】数据库总结

    万次阅读 多人点赞 2018-07-26 13:26:41
    1,数据库 1)概念 ...数据库是长期存储在...(数据的最小存取单位是数据项) ②数据库系统的特点 数据结构化 数据的共享性,冗余度,易扩充 数据独立性高 逻辑数据独立性(logical data...
  • 数据库面试

    千次阅读 多人点赞 2019-02-13 09:03:42
    数据定义DDL:Create Table,Alter Table,Drop Table, Create/Drop Index等 数据操纵DML:Select ,insert,update,delete, 数据控制DCL:grant,revoke 2. 内联接,外联接区别? 内连接是保证两个表中所有的行都要满足...
  • HashMap

    千次阅读 多人点赞 2018-09-25 12:09:44
    4)如果根据hash值定位的数组索引有Node,并且Node中的key和需要新增的key相等,则将对应的value值更新。 5)如果在已有的table中根据hash找到Node,其中Node中的hash值和新增的hash相等,但是key值不相等的,...
  • update gd_name set gdurl = concat (`gdurl`,'www.baidu.com|百度测试') where gdid = 1440 update 表 set `字段` = concat (`字段`,'aaaasadsdsadafdsafdasfdfsafa') where 字段=条件
  • C#基础教程-c#实例教程,适合初学者

    万次阅读 多人点赞 2016-08-22 11:13:24
    //为C#语言新增解释方法,解释到本行结束 class Welcome//类定义,类的概念见下一节 { /*解释开始,和C语言解释用法相同 解释结束*/ static void Main()//主程序,程序入口函数,必须在一个类中定义 { Console....
  • JAVA处理数据不存在插入存在更新

    千次阅读 2019-01-19 14:52:38
    这个锁不是阻塞的,并发时有一个拿到了锁去走insert,另一个没拿到走了update,如果update走的比insert就会造成update操作更新不到数据 stringRedisTemplate.delete(REDISKEY + token);这个解锁操作。如果解锁了...
  • 七款非常好用的电脑数据恢复软件推荐

    万次阅读 多人点赞 2018-11-03 19:54:02
    目前网络上有非常多的数据恢复软件供用户选择,但不同版本的数据恢复软件使用功能不一,且免费的版本较少,本文为大家推荐介绍了几款比较好用的数据恢复软件,需要的朋友可以前来阅读下载。 数据恢复软件哪个比较...
  • 用 Python 让 Excel 快速按条件筛选数据 本文即使用python实现excel快速筛选数据 有一张 12 个月份的产品销售情况表。 安装所需的 Python 第三方库 xlwings 的特色: ...开源免费,一直在更新 导入 xlwings: i
  • ![图片说明](https://img-ask.csdn.net/upload/201803/02/1519966936_581903.png)![![图片说明](https://img-ask.csdn.net/upload/201803/02/1519966424_539301.png)图片说明]...
  • 而第二次传入的数据中包含了第一次的数据,同时在前100W条数据中有100条数据修改,现在我不知道100万的数据中有哪几条数据修改,怎么进行更新的时候,准确的找到修改和增加的数据进行更新,而不是全量更新?...
  • 1第一种就是普通的循环每条数据进行更新,这种方式最大的问题就是效率问题,逐条更新,每次都会连接数据库,然后更新,再释放连接资源(虽然通过连接池可以将频繁连接数据的效率大大提高,抗不住数据量大),这中...
  • 通过 事务控制 的方式解决 (Android) SQLite 中大数据新增/修改 出现的性能瓶颈 一、新增SQLite中的新增默认是单个事务控制的,一次新增就是一次数据库操作,一次事务。如果几千次for循环操作,必然存在效率问题...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 119,433
精华内容 47,773
关键字:

更新数据快还是新增快