精华内容
下载资源
问答
  • 常见的面试题

    2016-11-15 13:05:13
    「 CSS篇 」 ...position 和 display 取值和各自意思和用法 样式层级关系,选择器优先级,样式冲突,以及抽离样式模块怎么写,说出思路,有无实践经验 CSS3动画效果属性,canvas、svg

    「 CSS篇 」


    1. CSS 盒子模型,绝对定位和相对定位

    2. 清除浮动,什么时候需要清除浮动,清除浮动都有哪些方法

    3. 如何保持浮层水平垂直居中

    4. position 和 display 的取值和各自的意思和用法

    5. 样式的层级关系,选择器优先级,样式冲突,以及抽离样式模块怎么写,说出思路,有无实践经验

    6. CSS3动画效果属性,canvas、svg的区别

    7. px和em的区别


    「 JavaScript 篇 」


    JavaScript 基础 
    
    1. JavaScript 里有哪些数据类型,解释清楚 null 和 undefined,解释清楚原始数据类型和引用数据类型。比如讲一下 1 和 Number(1)的区别

    2. 将一下 prototype 是什么东西,原型链的理解,什么时候用 prototype

    3. 函数里的this什么含义,什么情况下,怎么用。

    4. apply和 call 什么含义,什么区别?什么时候用。(我有篇文章 重点分析过)

    5. 数组和对象有哪些原生方法,列举一下,分别是什么含义,比如连接两个数组用哪个方法,删除数组的指定项和重新组装数组(操作数据的重点)。

    6. 怎样添加、移除、移动、复制、创建和查找节点?


    JavaScript 的面向对象
    
    1. JS 模块包装格式都用过哪些,CommonJS、AMD、CMD。定义一个JS 模块代码,最精简的格式是怎样。

    2. JS 怎么实现一个类。怎么实例化这个类。

    3. 是否了解自定义事件。jQuery里的fire函数是什么意思,什么时候用。

    4. 说一下了解的js 设计模式,解释一下单例、工厂、观察者。

    5. ajax 跨域有哪些方法,jsonp 的原理是什么,如果页面编码和被请求的资源编码不一致如何处理?


    「 开源工具 」


    1)是否了解开源的架构工具 bower、npm、yeoman、gulp、webpack,有无用过,有无写过,一个 npm 的包里的 package.json 具备的必要的字段都有哪些(名称、版本号,依赖)

    2)github常用不常用,关注过哪些项目

    3)会不会用 ps 扣图,png、jpg、gif 这些图片格式解释一下,分别什么时候用。如何优化图像、图像格式的区别

    4)说一下你常用的命令行工具

    5)会不会用Git,说上来几个命令,说一下git和svn的区别,有没有用git解决过冲突


    「 计算机网络基础 」


    1)说一下HTTP 协议头字段说上来几个,是否尽可能详细的掌握HTTP协议。一次完整的HTTP事务是怎样的一个过程?

    2)cookies 是干嘛的,服务器和浏览器之间的 cookies 是怎么传的,httponly 的 cookies 和可读写的 cookie 有什么区别,有无长度限制 
    请描述一下cookies,sessionStorage和localStorage的区别

    3)从敲入 URL 到渲染完成的整个过程,包括 DOM 构建的过程,说的约详细越好。

    4)是否了解Web注入攻击,说下原理,最常见的两种攻击(XSS 和 CSRF)了解到什么程度。

    5)是否了解公钥加密和私钥加密。如何确保表单提交里的密码字段不被泄露。验证码是干嘛的,是为了解决什么安全问题。

    6)编码常识:文件编码、URL 编码、Unicode编码 什么含义。一个gbk编码的页面如何正确引用一个utf8的的资源


    「 前端框架 」


    1) 对MVC、MVVM的理解

    2) jQuery的事件委托方法on、live、delegate之间有什么区别?

    3)前后分离的思想了解吗?

     考察学习能力和方法
    

    1)你每天必须登录的网站(前端技术相关)是什么?

    2)前端技术方面看过哪些书,有无笔记,都有哪些收获。

    3)收藏了哪些代码片段?有想过开源自己的代码嘛?

    4)怎么理解前端技术的大趋势?自己再做哪方面的知识储备?

    5)是否了解或精通其他(后端)的编程语言?

    6)做项目有没有遇到哪些印象深刻的技术攻关,具体遇到什么问题,怎么找答案的,最后怎么解的。

    7)对以后自己的前端职业路线,咋么规划



    展开全文
  • Linux常见的面试题

    千次阅读 2019-02-18 14:38:19
    SQL常见的面试题 Linux常见的面试题 1.绝对路径用什么符号表示?当前目录、上层目录用什么表示?主目录用什么表示?切换目录用什么命令? 绝对路径:如/etc/init.d 当前目录和上层目录:./ ../ 主目录:...

    1.绝对路径用什么符号表示?当前目录、上层目录用什么表示?主目录用什么表示?切换目录用什么命令?

    绝对路径:如/etc/init.d

    当前目录和上层目录:./   ../

    主目录: ~/

    切换目录:cd

    2.怎么查看当前进程,怎么执行退出,怎么查看当前路径?

    查看当前进程:ps

    执行退出:exit

    查看当前路径:pwd

    3.怎么清屏,怎么退出当前命令,怎么执行睡眠,怎么查看当前用户id,查看指定帮助用什么命令?

    清屏:clear

    退出当前命令:ctrl+c   彻底退出

    执行睡眠:Ctrl+z挂起当前进程 fg恢复后台

    查看当前用户id:查看显示目前登录账户的uid和gid及所属分组及用户名

    查看指定帮助:如 man adduser 这个很全,而且有例子:adduser-help这个告诉你一些常用参数:info adduser

    4.LS命令执行什么功能,可以带哪些参数,有什么区别?

    ls执行的功能:列出指定目录中的目录,以及文件

    哪些参数以及区别:  a 所有文件|详情信息,包括大小字节数,可读可写可执行的权限等

    5.建立软链接(快捷方式),以及硬链接的命令

    软链接:In-s slink source

    硬链接:In link source

    6.目录创建用什么命令,创建文件用什么命令,复制文件用什么命令

    创建目录:mkdir

    创建文件:典型的如touch,vi也可以创建文件,其实只要向一个不存在的文件输出,都会创建文件

    复制文件:cp

    7.文件权限修改用什么命令,格式是怎么样的

    文件权限修改:chmod

    格式如下:

    $ chmod u+x file 给 file 的属主增加执行权限
    $ chmod 751 file 给 file 的属主分配读、写、执行(7)的权限,给 file 的所在组分配读、执行(5)的权限,给其他用户分配执行(1)的权限
    $ chmod u=rwx,g=rx,o=x file 上例的另一种形式
    $ chmod =r file 为所有用户分配读权限
    $ chmod 444 file 同上例
    $ chmod a-wx,a+r file同上例
    $ chmod -R u+r directory 递归地给 directory 目录下所有文件和子目录的属主分配读的权限

    8.查看文件内容有哪些命令可以使用

    vi 文件名 #编辑方式查看,可修改
    cat 文件名 #显示全部文件内容
    more 文件名 #分页显示文件内容
    less 文件名 #与 more 相似,更好的是可以往前翻页
    tail 文件名 #仅查看尾部,还可以指定行数
    head 文件名 #仅查看头部,还可以指定行数

    9.随意写文件命令,怎样向屏幕输出带空格的字符串,你如“hello world”

    写文件命令:vi

    向屏幕输出带空格的字符串:echo hello world

    10.终端是哪个文件夹下的哪个文件,黑洞文件是哪个文件夹下的哪个命令

    终端:/dev/tty

    黑洞文件:/dev/null

    11.移动文件用哪个命令,改名用哪个命令

    mv    mv

    12.复制文件用哪个命令,如果需要连同文件夹一块删除呢,删除空文件夹用什么命令

    删除文件的命令:rm

    连同文件夹一块删除:rm -r

    删除空文件夹:rmdir

    14.linux下有哪几种可以使用通配符,分别代表什么含义

    “?”可替代单个字符

    “*”可替代多个字符

    “[charset]”可替代charset集中任何单个字符,如[a-z],[abABC]

    15.用什么命令对一个文件的内容进行统计(行号、单词数、字节数)

    wc命令 - c统计字节数 ,  - l 统计行数,  - w 统计字数

    16.Grep命令有什么用,如何忽略大小写,如何查找不含该串的行

    grep是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来

    grep[stringSTRING] filename        grep [^string] filename

    17.Linux中进程有哪几种状态,在ps显示的信息中,分别用什么符号表示

    1)不可中断状态:进程处于睡眠状态,但是此刻进程是不可中断的。不可中断, 指进程不响应异步信号。

    2)暂停状态/跟踪状态:向进程发送一个 SIGSTOP 信号,它就会因响应该信号 而进入 TASK_STOPPED 状态;当进程正在被跟踪时,它处于 TASK_TRACED 这个特殊的状态。“正在被跟踪”指的是进程暂停下来,等待跟踪它的进程对它进行操作。

    3)就绪状态:在 run_queue 队列里的状态

    4)运行状态:在 run_queue 队列里的状态

    5)可中断睡眠状态:处于这个状态的进程因为等待某某事件的发生(比如等待 socket 连接、等待信号量),而被挂起

    6)zomibie状态(僵尸):父亲没有通过 wait 系列的系统调用会顺便将子进程的尸体(task_struct)也释放掉

    7)退出状态:

    D 不可中断 Uninterruptible(usually IO)
    R 正在运行,或在队列中的进程
    S 处于休眠状态
    T 停止或被追踪
    Z 僵尸进程
    W 进入内存交换(从内核 2.6 开始无效)
    X 死掉的进程

    18.怎么使一个命令在后台自动运行

    一般都是使用&在命令结尾让程序自动运行。(命令后可以不追加空格)

    19.利用ps怎么显示所有进程,怎么利用ps查看指定进程信息

    ps -ef (system v 输出)

    ps -aux bsd 格式输出

    ps -ef | grep pid

    20.那个命令专门用来查看后台任务

    job -l

    21.把后台任务调到前台执行使用什么命令,把停下的后台任务在后台执行起来用什么命令

    把后台任务调到前台执行:fg

    把停下的后台任务在后台执行起来:bg

    22.终止进程用什么命令,用什么参数

    kill[-s<信息名称或者编号>][程序] 或 kill [-l <信息编号>]

    例如:kill -9 pid 

    23.搜索文件用什么命令,格式是怎样的

    find<指定目录><指定条件><指定动作>

    whereis 加参数与文件名

    locate只加文件名

    find直接搜索磁盘,较慢

    find/-name "string"

    24.查看当前谁在使用该主机用什么命令,查找自己所在的终端信息用什么命令

    查找自己所在的终端信息:who am i

    查看当前谁在使用该主机:who

    25.使用什么命令查看用过的命令列表

    history

    26.使用什么命令查看磁盘使用空间,空闲空间

    df -hl

    文件系统 容量 已用 可用 已用% 挂载点
    Filesystem Size Used Avail Use% Mounted on /dev/hda2 45G 19G 24G 44% /
    /dev/hda1 494M 19M 450M 4% /boot

    27.使用什么命令查看网络是否连通

    netstat

    28.查看各类环境变量用什么命令

    env

    查看某个,如home : env $HOME

    29.通过什么命令指定命令提示符

    \u:显示当前用户账号

    \h:显示当前主机名

    \W:只显示当前路径最后一个目录

    \w:显示当前绝对路径(当前用户目录会以~代替)

    $PWD:显示当前全路径

    \$:显示命令行’$'或者’#'符号

    \#:下达的第几个命令

    \d:代表日期,格式为week day month date,例如:"MonAug1"

    \t:显示时间为24小时格式,如:HH:MM:SS

    \T:显示时间为12小时格式

    \A:显示时间为24小时格式:HH:MM

    \v:BASH的版本信息 如export PS1=’[\u@\h\w\#]\$‘

    30.通过什么命令查找执行命令

    which 只能查可执行文件

    whereis 只能查二进制文件、说明文档,源文件等

    31.怎么对命令进行取别名

    alias la="Is-a"

    32.du和df的区别

    du:显示目录或文件的大小

    df:显示每个<文件>所在文件系统的信息,默认是显示所有文件系统。

    (文件系统分配其中的一些磁盘块用来记录它自身的一些数据,如 i 节点,磁盘分布图,间接块,超级块等。这些数据对大多数用户级的程序来说是不可见的,通常称为 Meta Data。) du 命令是用户级的程序,它不考虑 Meta Data,而 df 命令则查看文件系统的磁盘分配图并考虑 Meta Data。
    df 命令获得真正的文件系统数据,而 du 命令只查看文件系统的部分情况。

    33.awk 详解

    awk '{pattern + action}' {filenames}
    #cat /etc/passwd |awk -F ':' '{print $1"\t"$7}' //-F 的意思是以':'分隔 root /bin/bash
    daemon /bin/sh 搜索/etc/passwd 有 root 关键字的所有行

    #awk -F: '/root/' /etc/passwd root:x:0:0:root:/root:/bin/bash

    34.当你需要给命令绑定一个宏或者按键的时候,应该怎么做呢?

    可以使用bind命令,bind可以很方便地在shell中实现宏或按键的绑定。

    在进行按键绑定的时候,我们需要先获取到绑定按键对应的字符序列。

    比如获取F12的字符序列获取方法如下:先按下Ctrl+V,然后按下F12 .我们就可以得到F12的字符序列 ^[[24~。

    接着使用bind进行绑定。

    [root@localhost ~]# bind ‘”\e[24~":"date"'

    注意:相同的按键在不同的终端或终端模拟器下可能会产生不同的字符序列。

    【附】也可以使用showkey -a命令查看按键对应的字符序列。

    35.如果一个linux新手想要知道当前系统支持的所有命令的列表,他需要怎么做?

    使用命令compgen -c,可以打印出所有支持的命令列表。

    [root@localhost ~]$ compgen -c

    l.

    ll

    ls

    which

    if

    then

    else

    elif

    fi

    case

    esac

    for

    select

    while

    until

    do

    done

    36.如果你的助手想要打印出当前的目录栈,你会建议他怎么做?

    使用Linux 命令dirs可以将当前的目录栈打印出来。

    [root@localhost ~]# dirs

    /usr/share/X11

    【附】:目录栈通过pushd popd 来操作。

    37.你的系统目前有许多正在运行的任务,在不重启机器的条件下,有什么方法可以把所有正在运行的进程移除呢?

    使用linux命令 ’disown -r ’可以将所有正在运行的进程移除。

    38.bash shell 中的hash 命令有什么作用?

    linux命令’hash’管理着一个内置的哈希表,记录了已执行过的命令的完整路径, 用该命令可以打印出你所使用过的命令以及执行的次数。

    [root@localhost ~]# hash

    hits command

    2 /bin/ls

    2 /bin/su

    39.哪一个bash内置命令能够进行数学运算

    bash shell 的内置命令let 可以进行整型数的数学运算。

    #! /bin/bash


    let c=a+b

    40.怎样一页一页地查看一个大文件的内容呢?

    通过管道将命令”cat file_name.txt” 和 ’more’ 连接在一起可以实现这个需要.

    [root@localhost ~]# cat file_name.txt | more

    41.数据字典属于哪一个用户的?

    数据字典是属于’SYS’用户的,用户‘SYS’ 和 ’SYSEM’是由系统默认自动创建的

    42.怎样查看一个linux命令的概要与用法?假设你在/bin目录中偶然看到一个你从没见过的的命令,怎样才能知道它的作用和用法呢?

    使用命令whatis 可以先出显示出这个命令的用法简要,比如,你可以使用whatis zcat 去查看‘zcat’的介绍以及使用简要。

    [root@localhost ~]# whatis zcat

    zcat [gzip] (1) – compress or expand files

    43.使用哪一个命令可以查看自己文件系统的磁盘空间配额呢?

    使用命令repquota 能够显示出一个文件系统的配额信息

    【附】只有root用户才能够查看其它用户的配额。

    展开全文
  • 分布式架构常见的面试题,需要用XMind打开。
  • java框架常见的面试题

    万次阅读 多人点赞 2019-03-19 17:53:34
    java框架常见的面试题spring什么是Spring?使用Spring框架的好处是什么?Spring由哪些模块组成?什么是Spring beans?解释Spring支持的几种bean的作用域Spring框架中的单例bean是线程安全的吗?解释Spring框架中bean的...

    java框架常见的面试题

    spring

    什么是Spring?

    spring 是个Java企业级应用的开源开发框架。Spring主要用来开发Java应用,但是有些扩展是针对构建J2EE平台的web应用。Spring 框架目标是简化Java企业级应用开发,并通过POJO为基础的编程模型促进良好的编程习惯。

    使用Spring框架的好处是什么?

    轻量:Spring 是轻量的,基本的版本大约2MB。
    控制反转:Spring通过控制反转实现了松散耦合,对象们给出它们的依赖,而不是创建或查找依赖的对象们。
    面向切面的编程(AOP):Spring支持面向切面的编程,并且把应用业务逻辑和系统服务分开。
    容器:Spring 包含并管理应用中对象的生命周期和配置。

    Spring由哪些模块组成?

    Core module
    Bean module
    Context module
    Expression Language module
    JDBC module
    ORM module
    OXM module
    Java Messaging Service(JMS) module
    Transaction module
    Web module
    Web-Servlet module
    Web-Struts module
    Web-Portlet module
    

    什么是Spring beans?

    Spring beans 是那些形成Spring应用的主干的java对象。它们被Spring IOC容器初始化,装配,和管理。这些beans通过容器中配置的元数据创建。比如,以XML文件中 的形式定义。
    Spring 框架定义的beans都是单件beans。在bean tag中有个属性”singleton”,如果它被赋为TRUE,bean 就是单件,否则就是一个 prototype bean。默认是TRUE,所以所有在Spring框架中的beans 缺省都是单件。

    解释Spring支持的几种bean的作用域

    Spring框架支持以下五种bean的作用域:
    singleton : bean在每个Spring ioc 容器中只有一个实例。
    prototype:一个bean的定义可以有多个实例。
    request:每次http请求都会创建一个bean,该作用域仅在基于web的Spring ApplicationContext情形下有效。
    session:在一个HTTP Session中,一个bean定义对应一个实例。该作用域仅在基于web的Spring ApplicationContext情形下有效。
    global-session:在一个全局的HTTP Session中,一个bean定义对应一个实例。该作用域仅在基于web的Spring ApplicationContext情形下有效。

    缺省的Spring bean 的作用域是Singleton.

    Spring框架中的单例bean是线程安全的吗?

    不,Spring框架中的单例bean不是线程安全的

    解释Spring框架中bean的生命周期

    1、实例化一个Bean--也就是我们常说的new;

    2、按照Spring上下文对实例化的Bean进行配置--也就是IOC注入;

    3、如果这个Bean已经实现了BeanNameAware接口,会调用它实现的setBeanName(String)方法,此处传递的就是Spring配置文件中Bean的id值

    4、如果这个Bean已经实现了BeanFactoryAware接口,会调用它实现的setBeanFactory(setBeanFactory(BeanFactory)传递的是Spring工厂自身(可以用这个方式来获取其它Bean,只需在Spring配置文件中配置一个普通的Bean就可以);

    5、如果这个Bean已经实现了ApplicationContextAware接口,会调用setApplicationContext(ApplicationContext)方法,传入Spring上下文(同样这个方式也可以实现步骤4的内容,但比4更好,因为ApplicationContext是BeanFactory的子接口,有更多的实现方法);

    6、如果这个Bean关联了BeanPostProcessor接口,将会调用postProcessBeforeInitialization(Object obj, String s)方法,BeanPostProcessor经常被用作是Bean内容的更改,并且由于这个是在Bean初始化结束时调用那个的方法,也可以被应用于内存或缓存技术;

    7、如果Bean在Spring配置文件中配置了init-method属性会自动调用其配置的初始化方法。

    8、如果这个Bean关联了BeanPostProcessor接口,将会调用postProcessAfterInitialization(Object obj, String s)方法、;

    注:以上工作完成以后就可以应用这个Bean了,那这个Bean是一个Singleton的,所以一般情况下我们调用同一个id的Bean会是在内容地址相同的实例,当然在Spring配置文件中也可以配置非Singleton,这里我们不做赘述。
    

    9、当Bean不再需要时,会经过清理阶段,如果Bean实现了DisposableBean这个接口,会调用那个其实现的destroy()方法;

    10、最后,如果这个Bean的Spring配置中配置了destroy-method属性,会自动调用其配置的销毁方法。

    依赖注入DI

    在运行期,由外部容器动态的将依赖对象注入到组件中。
    spring 依赖注入方式
    1.Set注入
    2.构造器注入
    3.静态工厂的方法注入
    4.实例工厂的方法注入

    控制反转IOC

    就是应用本身不负责依赖对象的创建和维护,依赖对象的创建和维护都是由外部容器负责的。
    IOC创建对象的几种方式

    1)调用无参数构造器

    2)带参数构造器

    3)工厂创建对象

    工厂类:静态方法创建对象
      工厂类:非静态方法创建对象

    AOP

    AOP中的概念

    面向切面:在运行时,动态地将代码切入到类的指定方法、指定位置上的编程思想就是面向切面的编程

    常用注解
    • @aspect 定义切面
    • @pointcut 定义切点
    • @before 标注Before Advice定义所在的方法
    • @afterreturning 标注After Returning Advice定义所在的方法
    • @afterthrowing 标注After Throwing Advice定义所在的方法
    • @after 标注 After(Finally) Advice定义所在的方法
    • @around 标注Around Advice定义所在的方法

    Aspect(切面): 是通知和切入点的结合,通知和切入点共同定义了关于切面的全
    部内容—它的功能、在何时和何地完成其功能
    joinpoint(连接点):所谓连接点是指那些被拦截到的点。在spring中,这些点指的
    是方法,因为spring只支持方法类型的连接点.
    Pointcut(切入点):所谓切入点是指我们要对哪些joinpoint进行拦截的定义.
    通知定义了切面的”什么”和”何时”,切入点就定义了”何地”.
    Advice(通知):所谓通知是指拦截到joinpoint之后所要做的事情就是通知.通知分
    为前置通知,后置通知,异常通知,最终通知,环绕通知(切面要完成的功能)
    Target(目标对象):代理的目标对象
    Weaving(织入):是指把切面应用到目标对象来创建新的代理对象的过程.切面在
    指定的连接点织入到目标对象
    Introduction(引入):在不修改类代码的前提下, Introduction可以在运行期为类
    动态地添加一些方法或Field.

    Spring中的AOP底层实现原理

    动态代理,照我的理解就是,在不修改原有类对象方法的源代码基础上,通过代理对象实现原有类对象方法的增强,也就是拓展原有类对象的功能。

    spring mvc

    Spring mvc 的执行流程

    1. 客户端发http请求,服务器接收到请求,如果匹配DispatchServlet的请求映射路径(在web.xml中指定),web容器将请求转发交给DispatchServlet处理。
    2. DispatchServlet根据请求的信息(包括URL,http方法,请求报文头,请求参数,cookie等)及HandlerMapping的配置找到处理请求的的处理器(Handler)。
    3. 得到请求的Handler后,通过HandlerAdapter对Handler进行封装,再以统一的适配器接口调用Handler。HandlerAdapter是一个适配器,它用统一的接口对各种Handler方法进行调用
    4. ,处理器完成业务逻辑处理后将返回一个ModelAndView给DispatchServlet, ModelAndView包含了视图逻辑名和模型数据信息。
    5. 当得到真实的视图队形view后,DispatchServlet就使用这个view对象,对ModelAndView中的模型数据进行视图渲染。
    6. 客户端得到响应消息,可能是HTML、xml、json等不同的媒体格式。

    spring boot

    什么是Spring boot,Spring boot 有什么特性?

    Spring boot 不是对Spring功能上的增强,而是提供了一种快速使用Sping的方式
    用来简化spring应用的初始搭建以及开发过程 使用特定的方式来进行配置(properties或yml文件)
    创建独立的spring引用程序 main方法运行
    嵌入的Tomcat 无需部署war文件
    简化maven配置
    自动配置spring添加对应功能starter自动化配置

    Spring boot AOP 设计模式

    动态代理模式
    Spring boot AOP 设计模式

    Spring boot 缓存

    Spring boot 缓存

    什么是YAML?

    AML是一种人类可读的数据序列化语言。它通常用于配置文件。
    与属性文件相比,如果我们想要在配置文件中添加复杂的属性,YAML文件就更加结构化,而且更少混淆。可以看出YAML具有分层配置数据。

    5. Springboot 中application.yml和bootStrap.yml

    加载顺序
    bootstrap.yml(bootstrap.properties)先加载
    application.yml(application.properties)后加载
    bootstrap.yml 用于应用程序上下文的引导阶段。
    bootstrap.yml 由父Spring ApplicationContext加载。
    父ApplicationContext 被加载到使用 application.yml 的之前。
    配置区别
    bootstrap.yml 和application.yml 都可以用来配置参数。
    bootstrap.yml 可以理解成系统级别的一些参数配置,这些参数一般是不会变动的。
    application.yml 可以用来定义应用级别的,如果搭配 spring-cloud-config 使用 application.yml 里面定义的文件可以实现动态替换。
    使用Spring Cloud Config Server时,应在 bootstrap.yml 中指定:
    1.spring.application.name
    2.spring.cloud.config.server.git.uri
    3.一些加密/解密信息

    springboot常用的starter有哪些

    spring-boot-starter-web 嵌入tomcat和web开发需要servlet与jsp支持
    spring-boot-starter-data-jpa 数据库支持
    spring-boot-starter-data-redis redis数据库支持
    spring-boot-starter-data-solr solr支持
    mybatis-spring-boot-starter 第三方的mybatis集成starter

    springboot自动配置的原理

    在spring程序main方法中 添加@SpringBootApplication或者@EnableAutoConfiguration
    会自动去maven中读取每个starter中的spring.factories文件 该文件里配置了所有需要被创建spring容器中的bean

    spring cloud

    什么是Spring cloud,Spring cloud有什么特性

    Spring cloud 就是一套分布式服务治理的框架,它不会提供具体功能的操作,更专注于服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等等。

    Spring boot 和Spring cloud 的区别

    1、Spring boot 是 Spring 的一套快速配置脚手架,可以基于spring boot 快速开发单个微服务;Spring Cloud是一个基于Spring Boot实现的云应用开发工具;
    2、Spring boot专注于快速、方便集成的单个个体,Spring Cloud是关注全局的服务治理框架;
    3、spring boot使用了默认大于配置的理念,很多集成方案已经帮你选择好了,能不配置就不配置,Spring Cloud很大的一部分是基于Spring boot来实现。
    4、Spring boot可以离开Spring Cloud独立使用开发项目,但是Spring Cloud离不开Spring boot,属于依赖的关系。

    dubbo

    dubbo面试题

    Dubbo是什么?

    Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。简单的说,dubbo就是个服务框架,如果没有分布式的需求,其实是不需要用的,只有在分布式的时候,才有dubbo这样的分布式服务框架的需求,并且本质上是个服务调用的东东,说白了就是个远程服务调用的分布式框架
    其核心部分包含:

    1. 远程通讯: 提供对多种基于长连接的NIO框架抽象封装,包括多种线程模型,序列化,以及“请求-响应”模式的信息交换方式。
    2. 集群容错: 提供基于接口方法的透明远程过程调用,包括多协议支持,以及软负载均衡,失败容错,地址路由,动态配置等集群支持。
    3. 自动发现: 基于注册中心目录服务,使服务消费方能动态的查找服务提供方,使地址透明,使服务提供方可以平滑增加或减少机器。

    Dubbo能做什么?

    1.透明化的远程方法调用,就像调用本地方法一样调用远程方法,只需简单配置,没有任何API侵入。
    2.软负载均衡及容错机制,可在内网替代F5等硬件负载均衡器,降低成本,减少单点。
    3. 服务自动注册与发现,不再需要写死服务提供方地址,注册中心基于接口名查询服务提供者的IP地址,并且能够平滑添加或删除服务提供者。

    dubbo的架构

    在这里插入图片描述节点角色说明:
    Provider: 暴露服务的服务提供方。
    Consumer: 调用远程服务的服务消费方。
    Registry: 服务注册与发现的注册中心。
    Monitor: 统计服务的调用次调和调用时间的监控中心。
    Container: 服务运行容器。

    调用关系说明:
    0 服务容器负责启动,加载,运行服务提供者。

    1. 服务提供者在启动时,向注册中心注册自己提供的服务。
    2. 服务消费者在启动时,向注册中心订阅自己所需的服务。
    3. 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
    4. 服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
    5. 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。

    dubbo使用方法

    Dubbo采用全Spring配置方式,透明化接入应用,对应用没有任何API侵入,只需用Spring加载Dubbo的配置即可,Dubbo基于Spring的Schema扩展进行加载。如果不想使用Spring配置,而希望通过API的方式进行调用(不推荐)
    Dubbo采用全Spring配置方式,透明化接入应用,对应用没有任何API侵入,只需用Spring加载Dubbo的配置即可,Dubbo基于Spring的Schema扩展进行加载。

    mybatis

    #{}和${}的区别是什么?

    知识储备:

    ${} 是Properties文件中的变量占位符,它可以用于标签属性值和sql内部,属于静态文本替换,比如${driver}会被静态替换为com.mysql.jdbc.Driver。#{}是sql的参数占位符,Mybatis会将sql中的#{}替换为?号,在sql执行前会使用PreparedStatement的参数设置方法,按序给sql的?号占位符设置参数值,比如ps.setInt(0, parameterValue),#{item.name}的取值方式为使用反射从参数对象中获取item对象的name属性值,相当于param.getItem().getName()
    

    #{}是预编译处理,${}是字符串替换。

    Mybatis在处理{}时,就是把{}替换成变量的值。
    #{}解析传递进来的参数数据
    ${}对传递进来的参数原样拼接在SQL中
    使用#{}可以有效的防止SQL注入,提高系统安全性。

    Xml映射文件中,除了常见的select|insert|updae|delete标签之外,还有哪些标签?`

    <resultMap>、<parameterMap>、<sql>、<include>、<selectKey>,加上动态sql的9个标签,trim|where|set|foreach|if|choose|when|otherwise|bind等,
    其中<sql>为sql片段标签,通过<include>标签引入sql片段,
    <selectKey>为不支持自增的主键生成策略标签。
    

    最佳实践中,通常一个Xml映射文件,都会写一个Dao接口与之对应,请问,这个Dao接口的工作原理是什么?Dao接口里的方法,参数不同时,方法能重载吗?

    Dao接口,就是人们常说的Mapper接口,接口的全限名,就是映射文件中的namespace的值,接口的方法名,就是映射文件中MappedStatement的id值,接口方法内的参数,就是传递给sql的参数。Mapper接口是没有实现类的,当调用接口方法时,接口全限名+方法名拼接字符串作为key值,可唯一定位一个MappedStatement,举例:com.mybatis3.mappers.StudentDao.findStudentById,可以唯一找到namespace为com.mybatis3.mappers.StudentDao下面id = findStudentById的MappedStatement。在Mybatis中,每一个<select>、<insert>、<update>、<delete>标签,都会被解析为一个MappedStatement对象。
    Dao接口里的方法,是不能重载的,因为是全限名+方法名的保存和寻找策略。
    Dao接口的工作原理是JDK动态代理,Mybatis运行时会使用JDK动态代理为Dao接口生成代理proxy对象,代理对象proxy会拦截接口方法,转而执行MappedStatement所代表的sql,然后将sql执行结果返回。

    Mybatis是如何进行分页的?分页插件的原理是什么?

    Mybatis使用RowBounds对象进行分页,它是针对ResultSet结果集执行的内存分页,而非物理分页,可以在sql内直接书写带有物理分页的参数来完成物理分页功能,也可以使用分页插件来完成物理分页。
    分页插件的基本原理是使用Mybatis提供的插件接口,实现自定义插件,在插件的拦截方法内拦截待执行的sql,然后重写sql,根据dialect方言,添加对应的物理分页语句和物理分页参数。
    举例:select * from student,拦截sql后重写为:select t.* from (select * from student)t limit 0,10

    简述Mybatis的插件运行原理,以及如何编写一个插件。

    Mybatis仅可以编写针对ParameterHandler、ResultSetHandler、StatementHandler、Executor这4种接口的插件,Mybatis使用JDK的动态代理,为需要拦截的接口生成代理对象以实现接口方法拦截功能,每当执行这4种接口对象的方法时,就会进入拦截方法,具体就是InvocationHandler的invoke()方法,当然,只会拦截那些你指定需要拦截的方法。
    实现Mybatis的Interceptor接口并复写intercept()方法,然后在给插件编写注解,指定要拦截哪一个接口的哪些方法即可,记住,别忘了在配置文件中配置你编写的插件。

    Mybatis动态sql是做什么的?都有哪些动态sql?能简述一下动态sql的执行原理不?

    Mybatis动态sql可以让我们在Xml映射文件内,以标签的形式编写动态sql,完成逻辑判断和动态拼接sql的功能,Mybatis提供了9种动态sql标签trim|where|set|foreach|if|choose|when|otherwise|bind。
    其执行原理为,使用OGNL从sql参数对象中计算表达式的值,根据表达式的值动态拼接sql,以此来完成动态sql的功能。

    Mybatis是如何将sql执行结果封装为目标对象并返回的?都有哪些映射形式?

    第一种是使用标签,逐一定义列名和对象属性名之间的映射关系。第二种是使用sql列的别名功能,将列别名书写为对象属性名,比如T_NAME AS NAME,对象属性名一般是name,小写,但是列名不区分大小写,Mybatis会忽略列名大小写,智能找到与之对应对象属性名,你甚至可以写成T_NAME AS NaMe,Mybatis一样可以正常工作。
    有了列名与属性名的映射关系后,Mybatis通过反射创建对象,同时使用反射给对象的属性逐一赋值并返回,那些找不到映射关系的属性,是无法完成赋值的。

    Mybatis是否支持延迟加载?如果支持,它的实现原理是什么?

    Mybatis仅支持association关联对象和collection关联集合对象的延迟加载,association指的就是一对一,collection指的就是一对多查询。在Mybatis配置文件中,可以配置是否启用延迟加载lazyLoadingEnabled=true|false。
    它的原理是,使用CGLIB创建目标对象的代理对象,当调用目标方法时,进入拦截器方法,比如调用a.getB().getName(),拦截器invoke()方法发现a.getB()是null值,那么就会单独发送事先保存好的查询关联B对象的sql,把B查询上来,然后调用a.setB(b),于是a的对象b属性就有值了,接着完成a.getB().getName()方法的调用。这就是延迟加载的基本原理。
    当然了,不光是Mybatis,几乎所有的包括Hibernate,支持延迟加载的原理都是一样的。

    JDBC编程有哪些不足之处,MyBatis是如何解决这些问题的?

    ① 数据库链接创建、释放频繁造成系统资源浪费从而影响系统性能,如果使用数据库链接池可解决此问题。
    解决:在SqlMapConfig.xml中配置数据链接池,使用连接池管理数据库链接。

    ② Sql语句写在代码中造成代码不易维护,实际应用sql变化的可能较大,sql变动需要改变java代码。
    解决:将Sql语句配置在XXXXmapper.xml文件中与java代码分离。

    ③ 向sql语句传参数麻烦,因为sql语句的where条件不一定,可能多也可能少,占位符需要和参数一一对应。
    解决: Mybatis自动将java对象映射至sql语句。

    ④ 对结果集解析麻烦,sql变化导致解析代码变化,且解析前需要遍历,如果能将数据库记录封装成pojo对象解析比较方便。
    解决:Mybatis自动将sql执行结果映射至java对象。

    MyBatis编程步骤是什么样的?

    ① 创建SqlSessionFactory
    ② 通过SqlSessionFactory创建SqlSession
    ③ 通过sqlsession执行数据库操作
    ④ 调用session.commit()提交事务
    ⑤ 调用session.close()关闭会话

    为什么说Mybatis是半自动ORM映射工具?它与全自动的区别在哪里?

    Hibernate属于全自动ORM映射工具,使用Hibernate查询关联对象或者关联集合对象时,可以根据对象关系模型直接获取,所以它是全自动的。而Mybatis在查询关联对象或关联集合对象时,需要手动编写sql来完成,所以,称之为半自动ORM映射工具。
    一对一、一对多的关联查询
    association 一对一关联查询
    collection 一对多关联查询

    MyBatis实现一对一有几种方式?具体怎么操作的?

    有联合查询和嵌套查询,联合查询是几个表联合查询,只查询一次, 通过在resultMap里面配置association节点配置一对一的类就可以完成; 嵌套查询是先查一个表,根据这个表里面 的结果的外键id,去再另外一个表里面查询数据,也是通过association配置,但另外一个表的查询通过select属性配置。

    MyBatis实现一对多有几种方式,怎么操作的?

    有联合查询和嵌套查询,联合查询是几个表联合查询,只查询一次,通过在resultMap里面配 置collection节点配置一对多的类就可以完成; 嵌套查询是先查一个表,根据这个表里面的 结果的外键id,去再另外一个表里面查询数据,也是通过配置collection,但另外一个表的查询通过select节点配置。

    Mybatis比IBatis比较大的几个改进是什么?

    (1)有接口绑定,包括注解绑定sql和xml绑定Sql ,
    (2)动态sql由原来的节点配置变成OGNL表达式,
    (3)在一对一,一对多的时候引进了association,在一对多的时候引入了collection 节点,不过都是在resultMap里面配置。

    IBatis和MyBatis在核心处理类分别叫什么?

    IBatis里面的核心处理类交SqlMapClient, MyBatis里面的核心处理类叫做SqlSession

    mybatis一级缓存二级缓存

    1)一级缓存: 基于 PerpetualCache 的 HashMap 本地缓存,其存储作用域为 Session,当 Session flush 或 close 之后,该 Session 中的所有 Cache 就将清空,默认打开一级缓存

    2)二级缓存与一级缓存其机制相同,默认也是采用 PerpetualCache,HashMap 存储,不同在于其存储作用域为 Mapper(Namespace),并且可自定义存储源,如 Ehcache。默认不打开二级缓存,要开启二级缓存,使用二级缓存属性类需要实现Serializable序列化接口(可用来保存对象的状态),可在它的映射文件中配置 ;

    3)对于缓存数据更新机制,当某一个作用域(一级缓存 Session/二级缓存Namespaces)的进行了C/U/D 操作后,默认该作用域下所有 select 中的缓存将被 clear。

    一级缓存

    Mybatis对缓存提供支持,但是在没有配置的默认情况下,它只开启一级缓存,一级缓存只是相对于同一个SqlSession而言。所以在参数和SQL完全一样的情况下,我们使用同一个SqlSession对象调用一个Mapper方法,往往只执行一次SQL,因为使用SelSession第一次查询后,MyBatis会将其放在缓存中,以后再查询的时候,如果没有声明需要刷新,并且缓存没有超时的情况下,SqlSession都会取出当前缓存的数据,而不会再次发送SQL到数据库。

    在这里插入图片描述

    一级缓存的生命周期有多长?

    a、MyBatis在开启一个数据库会话时,会 创建一个新的SqlSession对象,SqlSession对象中会有一个新的Executor对象。Executor对象中持有一个新的PerpetualCache对象;当会话结束时,SqlSession对象及其内部的Executor对象还有PerpetualCache对象也一并释放掉。
    b、如果SqlSession调用了close()方法,会释放掉一级缓存PerpetualCache对象,一级缓存将不可用。
    c、如果SqlSession调用了clearCache(),会清空PerpetualCache对象中的数据,但是该对象仍可使用。
    d、SqlSession中执行了任何一个update操作(update()、delete()、insert()) ,都会清空PerpetualCache对象的数据,但是该对象可以继续使用

    怎么判断某两次查询是完全相同的查询?

    mybatis认为,对于两次查询,如果以下条件都完全一样,那么就认为它们是完全相同的两次查询。

    二级缓存

    MyBatis的二级缓存是Application级别的缓存,它可以提高对数据库查询的效率,以提高应用的性能。
      MyBatis的缓存机制整体设计以及二级缓存的工作模式
    在这里插入图片描述SqlSessionFactory层面上的二级缓存默认是不开启的,二级缓存的开席需要进行配置,实现二级缓存的时候,MyBatis要求返回的POJO必须是可序列化的

    也就是要求实现Serializable接口,配置方法很简单,只需要在映射XML文件配置就可以开启缓存了,如果我们配置了二级缓存就意味着:
    • 映射语句文件中的所有select语句将会被缓存。
    • 映射语句文件中的所欲insert、update和delete语句会刷新缓存。
    • 缓存会使用默认的Least Recently Used(LRU,最近最少使用的)算法来收回。
    • 根据时间表,比如No Flush Interval,(CNFI没有刷新间隔),缓存不会以任何时间顺序来刷新。
    • 缓存会存储列表集合或对象(无论查询方法返回什么)的1024个引用
    • 缓存会被视为是read/write(可读/可写)的缓存,意味着对象检索不是共享的,而且可以安全的被调用者修改,不干扰其他调用者或线程所做的潜在修改。

    1. 启动redis服务,确认服务启动成功(默认端口6379)
    2. ssm中加入redis jedis依赖
    3. 配置redis的信息
    4. 写redis缓存中间类
    5. spring中加载redis的信息并配(加载redis配置信息—配置rdis使用jedispoolconfig连接池,配置连接工厂jedisconnectionfactory,使用中间类注入到工厂中配置mybatis用redis作为第三方缓存—配置序列化方式)
    6. 在mybatis sqlmapconfig.xml中增加cacheenabled属性为true
    7. 在mapper.xml中加入标签

    本文参考网上资料如下:
    https://blog.csdn.net/webzhuce/article/details/72805896
    https://blog.csdn.net/moakun/article/details/82919804

    展开全文
  • React 常见的面试题

    万次阅读 2017-04-09 22:47:32
    之所以标题是《 React 常见的面试题》,其实只是想起一个比《在 React 里面,你可以知道也可以不知道的事, 但是你会发现他们确实很有用》要简单明了的标题而已。http://johannlai.com/2017/04/09/R

    根据记录,问这些问题可能不是深入了解他们在使用 React 方面的经验的最佳方式。http://www.tuicool.com/articles/fqaqqmF

    之所以标题是《 React 常见的面试题》,其实只是想起一个比《在 React 里面,你可以知道也可以不知道的事, 但是你会发现他们确实很有用》要简单明了的标题而已。http://johannlai.com/2017/04/09/React-Interview-Questions/

    原文链接: React Interview Questions

    作者: Tyler.Google Developer Expert and a partner at React Training where we teach React online

    翻译:Johann Lai

    当你调用setState的时候,发生了什么事?

    当调用 setState 时,React会做的第一件事情是将传递给 setState 的对象合并到组件的当前状态。这将启动一个称为和解(reconciliation)的过程。和解(reconciliation)的最终目标是以最有效的方式,根据这个新的状态来更新UI。 为此,React将构建一个新的 React 元素树(您可以将其视为 UI 的对象表示)。

    一旦有了这个树,为了弄清 UI 如何响应新的状态而改变,React 会将这个新树与上一个元素树相比较( diff )。

    通过这样做, React 将会知道发生的确切变化,并且通过了解发生什么变化,只需在绝对必要的情况下进行更新即可最小化 UI 的占用空间。

    在 React 当中 Element 和 Component 有何区别?

    简单地说,一个 React element 描述了你想在屏幕上看到什么。换个说法就是,一个 React element 是一些 UI 的对象表示。

    一个 React Component 是一个函数或一个类,它可以接受输入并返回一个 React element t(通常是通过 JSX ,它被转化成一个 createElement 调用)。

    有关更多信息,请查看 React Elements vs React Components

    什么时候在功能组件( Class Component )上使用类组件( Functional Component )?

    如果您的组件具有状态( state )或生命周期方法,请使用 Class 组件。否则,使用功能组件

    什么是 React 的 refs ,为什么它们很重要?

    refs就像是一个逃生舱口,允许您直接访问DOM元素或组件实例。为了使用它们,您可以向组件添加一个 ref 属性,该属性的值是一个回调函数,它将接收底层的 DOM 元素或组件的已挂接实例,作为其第一个参数。

    class UnControlledForm extends Component {
      handleSubmit = () => {
        console.log("Input Value: ", this.input.value)
      }
      render () {
        return (
          <form onSubmit={this.handleSubmit}>
            <input
              type='text'
              ref={(input) => this.input = input} />
            <button type='submit'>Submit</button>
          </form>
        )
      }
    }
    

    以上注意到我们的输入字段有一个 ref 属性,其值是一个函数。该函数接收我们然后放在实例上的实际的 DOM 元素,以便在 handleSubmit 函数内部访问它。经常误解的是,您需要使用类组件才能使用 ref ,但 ref 也可以通过利用 JavaScript 中的 闭包 与 功能组件( functional components )一起使用。

    function CustomForm ({handleSubmit}) {
      let inputElement
      return (
        <form onSubmit={() => handleSubmit(inputElement.value)}>
          <input
            type='text'
            ref={(input) => inputElement = input} />
          <button type='submit'>Submit</button>
        </form>
      )
    }
    

    React 中的keys是什么,为什么它们很重要?

    keys是什么帮助 React 跟踪哪些项目已更改、添加或从列表中删除。

      return (
        <ul>
          {this.state.todoItems.map(({task, uid}) => {
            return <li key={uid}>{task}</li>
          })}
        </ul>
      )
    }
    

    每个 keys 在兄弟元素之间是独一无二的。我们已经谈过几次关于和解(reconciliation)的过程,而且这个和解过程(reconciliation)中的一部分正在执行一个新的元素树与最前一个的差异。keys 使处理列表时更加高效,因为 React 可以使用子元素上的 keys 快速知道元素是新的还是在比较树时才被移动。

    而且 keys 不仅使这个过程更有效率,而且没有 keys ,React 不知道哪个本地状态对应于移动中的哪个项目。所以当你 map 的时候,不要忽略了 keys 。

    看下面的代码: 如果您在 下创建了一个 React 元素, 的组件定义将如何?

    <Twitter username='tylermcginnis33'>
      {(user) => user === null
        ? <Loading />
        : <Badge info={user} />}
    </Twitter>
    
    import React, { Component, PropTypes } from 'react'
    import fetchUser from 'twitter'
    // fetchUser接收用户名返回 promise
    // 当得到 用户的数据的时候 ,返回resolve 状态
    
    class Twitter extends Component {
      // 在这里写下你的代码
    }
    

    如果你不熟悉渲染回调模式(render callback pattern),这将看起来有点奇怪。在这种模式中,一个组件接收一个函数作为它的 child。注意上面包含在 标签内的内容。 Twitter 组件的 child 是一个函数,而不是你曾经习以为常的一个组件。 这意味着在实现 Twitter 组件时,我们需要将 props.children 作为一个函数来处理。

    以下是我的答案。

    import React, { Component, PropTypes } from 'react'
    import fetchUser from 'twitter'
    
    class Twitter extends Component {
      state = {
        user: null,
      }
      static propTypes = {
        username: PropTypes.string.isRequired,
      }
      componentDidMount () {
        fetchUser(this.props.username)
          .then((user) => this.setState({user}))
      }
      render () {
        return this.props.children(this.state.user)
      }
    }
    

    值得注意的是,正如我上面提到的,我通过调用它并传递给 user 来把 props.children 处理为为一个函数。

    这种模式的好处是我们已经将我们的父组件与我们的子组件分离了。父组件管理状态,父组件的消费者可以决定以何种方式将从父级接收的参数应用于他们的 UI。

    为了演示这一点,我们假设在另一个文件中,我们要渲染一个 Profile 而不是一个 Badge, ,因为我们使用渲染回调模式,所以我们可以轻松地交换 UI ,而不用改变我们对父(Twitter)组件的实现。

    <Twitter username='tylermcginnis33'>
      {(user) => user === null
        ? <Loading />
        : <Profile info={user} />}
    </Twitter>
    

    受控组件( controlled component )与不受控制的组件( uncontrolled component )有什么区别?

    React 的很大一部分是这样的想法,即组件负责控制和管理自己的状态。

    当我们将 native HTML 表单元素( input, select, textarea 等)投入到组合中时会发生什么?我们是否应该使用 React 作为“单一的真理来源”,就像我们习惯使用React一样? 或者我们是否允许表单数据存在 DOM 中,就像我们习惯使用HTML表单元素一样? 这两个问题是受控(controlled) VS 不受控制(uncontrolled)组件的核心。

    受控组件是React控制的组件,也是表单数据的唯一真理来源。

    如下所示, username 不存在于 DOM 中,而是以我们的组件状态存在。每当我们想要更新 username 时,我们就像以前一样调用setState。

    class ControlledForm extends Component {
      state = {
        username: ''
      }
      updateUsername = (e) => {
        this.setState({
          username: e.target.value,
        })
      }
      handleSubmit = () => {}
      render () {
        return (
          <form onSubmit={this.handleSubmit}>
            <input
              type='text'
              value={this.state.username}
              onChange={this.updateUsername} />
            <button type='submit'>Submit</button>
          </form>
        )
      }
    }
    

    不受控制( uncontrolled component )的组件是您的表单数据由 DOM 处理,而不是您的 React 组件。

    我们使用 refs 来完成这个。

    class UnControlledForm extends Component {
      handleSubmit = () => {
        console.log("Input Value: ", this.input.value)
      }
      render () {
        return (
          <form onSubmit={this.handleSubmit}>
            <input
              type='text'
              ref={(input) => this.input = input} />
            <button type='submit'>Submit</button>
          </form>
        )
      }
    }
    

    虽然不受控制的组件通常更容易实现,因为您只需使用引用从DOM获取值,但是通常建议您通过不受控制的组件来支持受控组件。

    主要原因是受控组件 支持即时字段验证 ,允许您有条件地禁用/启用按钮,强制输入格式,并且更多的是 『the React way』。

    在哪个生命周期事件中你会发出 AJAX 请求,为什么?

    AJAX 请求应该在 componentDidMount 生命周期事件中。 有几个原因:

    • Fiber,是下一次实施React的和解算法,将有能力根据需要启动和停止渲染,以获得性能优势。其中一个取舍之一是 componentWillMount ,而在其他的生命周期事件中出发 AJAX 请求,将是具有 “非确定性的”。 这意味着 React 可以在需要时感觉到不同的时间开始调用 componentWillMount。这显然是AJAX请求的不好的方式。

    -您不能保证在组件挂载之前,AJAX请求将无法 resolve。如果这样做,那意味着你会尝试在一个未挂载的组件上设置 StState,这不仅不会起作用,反而会对你大喊大叫。 在 componentDidMount 中执行 AJAX 将保证至少有一个要更新的组件。

    shouldComponentUpdate 应该做什么,为什么它很重要?

    上面我们讨论了 reconciliation ,什么是 React 在 setState 被调用时所做的。在生命周期方法 shouldComponentUpdate 中,允许我们选择退出某些组件(和他们的子组件)的 reconciliation 过程。

    我们为什么要这样做?

    如上所述,“和解( reconciliation )的最终目标是以最有效的方式,根据新的状态更新用户界面”。如果我们知道我们的用户界面(UI)的某一部分不会改变,那么没有理由让 React 很麻烦地试图去弄清楚它是否应该渲染。通过从 shouldComponentUpdate 返回 false,React 将假定当前组件及其所有子组件将保持与当前组件相同。

    您如何告诉React 构建(build)生产模式,该做什么?

    通常,您将使用Webpack的 DefinePlugin 方法将 NODE_ENV 设置为 production。这将剥离像 propType 验证和额外的警告。除此之外,还有一个好主意,可以减少你的代码,因为React使用 Uglify 的 dead-code 来消除开发代码和注释,这将大大减少你的包的大小。

    为什么要使用 React.Children.map(props.children,()=>) 而不是 props.children.map(()=>)

    因为不能保证props.children将是一个数组。

    以此代码为例,

    <Parent>
      <h1>Welcome.</h1>
    </Parent>
    

    在父组件内部,如果我们尝试使用 props.children.map 映射孩子,则会抛出错误,因为 props.children 是一个对象,而不是一个数组。

    如果有多个子元素,React 只会使props.children成为一个数组。就像下面这样:

    <Parent>
      <h1>Welcome.</h1>
      <h2>props.children will now be an array</h2>
    </Parent>
    

    这就是为什么你喜欢 React.Children.map ,因为它的实现考虑到 props.children 可能是一个数组或一个对象。

    描述事件在React中的处理方式。

    为了解决跨浏览器兼容性问题,您的 React 中的事件处理程序将传递 SyntheticEvent 的实例,它是 React 的浏览器本机事件的跨浏览器包装器。

    这些 SyntheticEvent 与您习惯的原生事件具有相同的接口,除了它们在所有浏览器中都兼容。有趣的是,React 实际上并没有将事件附加到子节点本身。React 将使用单个事件监听器监听顶层的所有事件。这对于性能是有好处的,这也意味着在更新DOM时,React 不需要担心跟踪事件监听器。

    createElement 和 cloneElement 有什么区别?

    createElement 是 JSX 被转载到的,是 React 用来创建 React Elements 的内容(一些 UI 的对象表示)cloneElement用于克隆元素并传递新的 props。他们钉住了这两个��的命名。

    可以选择性地传递给 setState 的第二个参数是什么,它的目的是什么?

    一个回调函数,当setState结束并 re-rendered 该组件时将被调用。一些没有说出来的东西是 setState 是 异步 的,这就是为什么它需要一个第二个回调函数。通常最好使用另一个生命周期方法,而不是依赖这个回调函数,但是很高兴知道它存在。

    this.setState(
      { username: 'tylermcginnis33' },
      () => console.log('setState has finished and the component has re-rendered.')
    )
    

    这段代码有什么问题?

    this.setState((prevState, props) => {
      return {
        streak: prevState.streak + props.count
      }
    })
    

    没毛病。但是这种写法很少被使用,并不是众所周知的,就是你也可以传递一个函数给setState,它接收到先前的状态和道具并返回一个新的状态,正如我们在上面所做的那样。它不仅没有什么问题,而且如果您根据以前的状态(state)设置状态,推荐使用这种写法。

    转自http://johannlai.com/2017/04/09/React-Interview-Questions/ 

    展开全文
  • java 继承常见的面试题
  • PHP 常见的面试题汇总

    千次阅读 多人点赞 2018-01-17 16:41:51
    PHP常见的面试题汇总        购物车里面的收藏怎么做  首先在数据库里面建一个收藏表,让它与用户表相关联点击收藏的时候加入到用户所对应的收藏表里面  什么是同步和异步  同步就是客户端发送数据到...
  • 一些常见的面试题

    千次阅读 2015-09-04 16:27:38
    一些常见的面试题(转) 腾讯面试题:tcp三次握手的过程,accept发生在三次握手哪个阶段? 答accept发生在三次握手之后。 第一次握手:客户端发送syn包(syn=j)到服务器。 第二次握手:服务器收到syn包...
  • 30道java常见的面试题

    2019-03-29 11:17:09
    最近在忙着面试 总结了一些面试题,下面的是面试java常见的面试题 大部分都会问到的 1.hashmap底层? 2.Java进程中断怎么处理? 3.介绍下面向对象? 4.介绍下多态? 5.方法重载和重写? 6.这俩哪个属于多态? 7.说下多...
  • 硬核!30 张图解 HTTP 常见的面试题

    千次阅读 2020-11-12 00:01:08
    30 张图解 HTTP 常见的面试题前言正文HTTP 基本概念1. 「协议」2. 「传输」3. 「超文本」GET 与 POST03 HTTP 特性1. 简单2. 灵活和易于扩展3. 应用广泛和跨平台04 HTTP 与 HTTPS 每日一句英语学习,每天进步一点点:...
  • vue常见的面试题

    2020-02-15 01:48:04
    vue面试题汇集 vue面试题汇总二 vue面试总结三 vue面试题汇总四 vue面试题汇总五 vue面试题汇总六 axios是什么?怎么使用?描述使用它来实现登录功能流程 1.axios是基于promise使用浏览器好node.js一个http客服...
  • 数据库常见的面试题

    千次阅读 2021-01-10 22:00:08
    四、数据库面试题总结 4.1 MySQL 4.1.1 什么是MySQL? MySQL是一种关系型数据库,在Java企业级开发中非常常用,因为MySQL是开源免费,并且方便拓展。MySQL默认端口号是3306。 4.1.2 MyISAM和InnoDB区别 MyISAM...
  • Java数组中常见的面试题

    千次阅读 2017-09-06 07:51:56
    Java数组中常见的面试题 标签: java 2014-02-04 17:34 1789人阅读 评论(0) 收藏 举报  分类: java(25)  版权声明:本文为博主原创文章,未经博主允许不得转载。 在java中...
  • Hive常见的面试题

    千次阅读 多人点赞 2019-12-04 19:30:46
    总结下Hive面试点 Hive可考察内容有:基本概念、架构、数据类型、数据组织、DDL... 基本概念一般会以问答题的方式进行考察,比如在面试的时候直接问:说说你对Hive理解?Hive作用有哪些?这种类似问题...
  • mybatis常见的面试题

    千次阅读 2019-06-17 18:01:13
    Mybatis常见面试题 1、#{}和${}区别是什么? 是Properties文件中变量占位符,它可以用于标签属性值和sql内部,属于静态文本替换,比如{}是Properties文件中变量占位符,它可以用于标签属性值和sql内部,属于...
  • ES6常见的面试题

    千次阅读 多人点赞 2019-01-12 23:47:15
    1.es6熟悉吗,说几个es6新增方法 (1)新增声明命令let和const 在es6中通常用 let 和 const 来声明,let 表示变量、const 表示常量。 特点: let 和 const 都是块级作用域。以{}代码块作为作用域范围...
  • mysql常见的面试题

    万次阅读 多人点赞 2017-08-11 13:38:36
     本人是搞java系统开发这块的,数据库是面试笔试的重点,所以特定整理了一些自己遇到的自认为有价值和他人遇到的好的面试题进行整理.这篇就当做题集.会不定期更新此篇题集.   题目1   什么是数据库事务? ...
  • 高并发常见的面试题

    万次阅读 多人点赞 2019-02-28 23:45:06
    进程是指运行中应用程序,每个进程都有自己独立地址空间(内存空间)。 比如用户点击桌面IE浏览器,就启动了一个进程,操作系统就会为该进程分配独立地址空间。当用户再次点击左边IE浏览器,又启动了一个...
  • HashMap常见的面试题

    千次阅读 2020-02-07 17:15:45
    1.HashMap底层是如何实现? 首先底层数据结构是由数组+链表组成链表散列。HashMap先得到key散列值,在通过扰动函数(减少碰撞次数)得到Hash值,接着通过hash & (n -1 ),n位table长度,运算后得到数组...
  • XML常见的面试题

    2017-04-05 11:24:59
    关于XML技术经常会问到的面试题。这些问题并不很难但涵盖了XML技术的一些重要领域,比如DTD,XML Schema,XSLT转换,XPATH检索,XML绑定,XML解析器以及XML的基本知识。  问题1:XML是什么?  答:XML即可扩展...
  • 二叉树中的那些常见的面试题

    千次阅读 2017-02-28 19:28:47
    昨天看了一下关于树中的面试题,发现二叉树中的面试题比较常见的题型大概有下面几个:创建一颗二叉树(先序,中序,后序)、遍历一颗二叉树(先序,中序,后序和层次遍历)、求二叉树中叶子节点的个数、求二叉树的...
  • SpringCloud之Eureka的使用和常见的面试题

    万次阅读 多人点赞 2019-01-23 13:03:01
    netflix在设计Eureka时遵守是AP原则 Eureka是Netfix一个子模块,也是核心模块之一. Eureka是一个基于REST服务,用于定位服务,以实现云端中间层服务发现和故障转移。服务注册与发现对于微服务架构来说是非常重要...
  • spring常见的面试题

    2018-05-20 17:09:52
    实现AOP技术,主要分为两大类:一是采用动态代理技术,利用截取信息方式,对该信息进行装饰,以取代鱼油对象行为执行;二是采用静态织入方式,引入特定语法创建“方面”,从而使得编译器可以在编译期间织...
  • C# 比较常见的面试题

    万次阅读 2018-08-25 11:56:26
    2.我们都知道一个类可以有多个构造函数,并且C#会在我们创建类时候默认提供一个无参构造函数,当我实现了另外一个有参数构造函数时候,我还能调用无参数构造函数吗?请说明原因。...
  • 例如,如果你是一名5年以上专业人士寻找项目经理职位,那么在回答此项目经理面试问题时,描述你出生地,你长大地方以及你大学教育。这些不应超过两三句话。然后,你应该突出显示背景中与你申请
  • 给定一个数组序列,表示股票价格,比如说 100 103 109 102 95 101 110 112 103 110 112 112 113 103 103 93 88 94 91 88 现在问你,哪天买入哪天卖出获得收益最大,输出日期,日期从1开始编号 比如如上序列,...
  • 关于Python爬虫常见的面试题

    千次阅读 多人点赞 2019-11-13 10:55:11
    介绍搜索引擎①搜索引擎主要组成②搜索引擎工作流程(通用爬虫工作流程)③搜索引擎局限性3.介绍http①http协议:超文本传输协议(一个约束发布和接受html页面规范)②http特点③http工作过程...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 23,579
精华内容 9,431
关键字:

常见的面试题