面试官:说说var、let、const之间的区别
面试官:说说var、let、const之间的区别
一、var在ES5中,顶层对象的属性和全局变量是等价的,用var声明的变量既是全局变量,也是顶层变量
注意:顶层对象,在浏览器环境指的是window对象,在 Node 指的是global对象
12var a = 10;console.log(window.a) // 10
使用var声明的变量存在变量提升的情况
12console.log(a) // undefinedvar a = 20
在编译阶段,编译器会将其变成以下执行
123var aconsole.log(a)a = 20
使用var,我们能够对一个变量进行多次声明,后面声明的变量会覆盖前面的变量声明
123var a = 20 var a = 30console.log(a) // 30
在函数中使用使用var声明变量时候,该变量是局部的
123456var a = 20function change(){ var a = 30}change()console.log(a) // 20
而如果在函数内不使用var,该变量是全局的
123 ...
面试官:说说你对Git的理解?
面试官:说说你对Git的理解?
一、是什么git,是一个分布式版本控制软件,最初目的是为更好地管理Linux内核开发而设计
分布式版本控制系统的客户端并不只提取最新版本的文件快照,而是把代码仓库完整地镜像下来。这么一来,任何一处协同工作用的服务器发生故障,事后都可以用任何一个镜像出来的本地仓库恢复
项目开始,只有一个原始版仓库,别的机器可以clone这个原始版本库,那么所有clone的机器,它们的版本库其实都是一样的,并没有主次之分
所以在实现团队协作的时候,只要有一台电脑充当服务器的角色,其他每个人都从这个“服务器”仓库clone一份到自己的电脑上,并且各自把各自的提交推送到服务器仓库里,也从服务器仓库中拉取别人的提交
github实际就可以充当这个服务器角色,其是一个开源协作社区,提供Git仓库托管服务,既可以让别人参与你的开源项目,也可以参与别人的开源项目
二、工作原理当我们通过git init创建或者git clone一个项目的时候,项目目录会隐藏一个.git子目录,其作用是用来跟踪管理版本库的
Git 中所有数据在存储前都计算校验和,然后以校验和来引用,所以在我们修改或 ...
面试官:说说Git 中 HEAD、工作树和索引之间的区别?
面试官:说说Git 中 HEAD、工作树和索引之间的区别?
一、HEAD在git中,可以存在很多分支,其本质上是一个指向commit对象的可变指针,而Head是一个特别的指针,是一个指向你正在工作中的本地分支的指针
简单来讲,就是你现在在哪儿,HEAD 就指向哪儿
例如当前我们处于master分支,所以HEAD这个指针指向了master分支指针
然后通过调用git checkout test切换到test分支,那么HEAD则指向test分支,如下图:
但我们在test分支再一次commit信息的时候,HEAD指针仍然指向了test分支指针,而test分支指针已经指向了最新创建的提交,如下图:
这个HEAD存储的位置就在.git/HEAD目录中,查看信息可以看到HEAD指向了另一个文件
12345$ cat .git/HEADref: refs/heads/master$ cat .git/refs/heads/master7406a10efcc169bbab17827aeda189aa20376f7f
这个文件的内容是一串哈希码,而这个哈希码正是master分支上最新的 ...
面试官:说说你对版本管理的理解?常用的版本管理工具有哪些?
面试官:说说你对版本管理的理解?常用的版本管理工具有哪些?
一、是什么版本控制(Version control),是维护工程蓝图的标准作法,能追踪工程蓝图从诞生一直到定案的过程。此外,版本控制也是一种软件工程技巧,借此能在软件开发的过程中,确保由不同人所编辑的同一程序文件都得到同步
透过文档控制,能记录任何工程项目内各个模块的改动历程,并为每次改动编上序号
一种简单的版本控制形式如下:赋给图的初版一个版本等级“A”。当做了第一次改变后,版本等级改为“B”,以此类推
版本控制能提供项目的设计者,将设计恢复到之前任一状态的选择权
简言之,你的修改只要提到到版本控制系统,基本都可以找回,版本控制系统就像一台时光机器,可以让你回到任何一个时间点
二、有哪些版本控制系统在当今的软件开发中,被认为是理所当然的配备工具之一,根据类别可以分成:
本地版本控制系统
集中式版本控制系统
分布式版本控制系统
本地版本控制系统结构如下图所示:
优点:
简单,很多系统中都有内置
适合管理文本,如系统配置
缺点:
其不支持远程操作,因此并不适合多人版本开发
集中式版本控制系统结构如下图所示:
...
面试官:说说Git常用的命令有哪些?
面试官:说说Git常用的命令有哪些?
一、前言git 的操作可以通过命令的形式如执行,日常使用就如下图6个命令即可
实际上,如果想要熟练使用,超过60多个命令需要了解,下面则介绍下常见的的git 命令
二、有哪些配置Git 自带一个 git config 的工具来帮助设置控制 Git 外观和行为的配置变量,在我们安装完git之后,第一件事就是设置你的用户名和邮件地址
后续每一个提交都会使用这些信息,它们会写入到你的每一次提交中,不可更改
设置提交代码时的用户信息命令如下:
git config [–global] user.name “[name]”
git config [–global] user.email “[email address]”
启动一个git项目的初始有两个途径,分别是:
git init [project-name]:创建或在当前目录初始化一个git代码库
git clone url:下载一个项目和它的整个代码历史
日常基本操作在日常工作中,代码常用的基本操作如下:
git init 初始化仓库,默认为 master 分支
git add . ...
面试官:说说 git 发生冲突的场景?如何解决?
面试官:说说 git 发生冲突的场景?如何解决?
一、是什么一般情况下,出现分支的场景有如下:
多个分支代码合并到一个分支时
多个分支向同一个远端分支推送
具体情况就是,多个分支修改了同一个文件(任何地方)或者多个分支修改了同一个文件的名称
如果两个分支中分别修改了不同文件中的部分,是不会产生冲突,直接合并即可
应用在命令中,就是push、pull、stash、rebase等命令下都有可能产生冲突情况,从本质上来讲,都是merge和patch(应用补丁)时产生冲突
二、分析在本地主分值master创建一个a.txt文件,文件起始位置写上master commit,如下:
然后提交到仓库:
git add a.txt
git commit -m ‘master first commit’
创建一个新的分支featurel1分支,并进行切换,如下:
1git checkout -b featurel1
然后修改a.txt文件首行文字为 featurel commit,然后添加到暂存区,并开始进行提交到仓库:
git add a.txt
git commit -m ‘fea ...
面试官:说说Git中 fork, clone,branch这三个概念,有什么区别?
面试官:说说Git中 fork, clone,branch这三个概念,有什么区别?
一、是什么forkfork,英语翻译过来就是叉子,动词形式则是分叉,如下图,从左到右,一条直线变成多条直线
转到git仓库中,fork则可以代表分叉、克隆 出一个(仓库的)新拷贝
包含了原来的仓库(即upstream repository,上游仓库)所有内容,如分支、Tag、提交
如果想将你的修改合并到原项目中时,可以通过的 Pull Request 把你的提交贡献回 原仓库
cloneclone,译为克隆,它的作用是将文件从远程代码仓下载到本地,从而形成一个本地代码仓
执行clone命令后,会在当前目录下创建一个名为xxx的目录,并在这个目录下初始化一个 .git 文件夹,然后从中读取最新版本的文件的拷贝
默认配置下远程 Git 仓库中的每一个文件的每一个版本都将被拉取下来
branchbranch,译为分支,其作用简单而言就是开启另一个分支, 使用分支意味着你可以把你的工作从开发主线上分离开来,以免影响开发主线
Git 处理分支的方式十分轻量,创建新分支这一操作几乎能在瞬间完成,并且在不 ...
说说对git pull 和 git fetch 的理解?有什么区别?
说说对git pull 和 git fetch 的理解?有什么区别?
一、是什么先回顾两个命令的定义
git fetch 命令用于从另一个存储库下载对象和引用
git pull 命令用于从另一个存储库或本地分支获取并集成(整合)
再来看一次git的工作流程图,如下所示:
可以看到,git fetch是将远程主机的最新内容拉到本地,用户在检查了以后决定是否合并到工作本机分支中
而git pull 则是将远程主机的最新内容拉下来后直接合并,即:git pull = git fetch + git merge,这样可能会产生冲突,需要手动解决
在我们本地的git文件中对应也存储了git本地仓库分支的commit ID 和 跟踪的远程分支的commit ID,对应文件如下:
.git/refs/head/[本地分支]
.git/refs/remotes/[正在跟踪的分支]
使用 git fetch更新代码,本地的库中master的commitID不变
但是与git上面关联的那个orign/master的commit ID ...
面试官:说说你对git rebase 和 git merge的理解?区别?
面试官:说说你对git rebase 和 git merge的理解?区别?
一、是什么在使用 git 进行版本管理的项目中,当完成一个特性的开发并将其合并到 master 分支时,会有两种方式:
git merge
git rebase
git rebase 与 git merge都有相同的作用,都是将一个分支的提交合并到另一分支上,但是在原理上却不相同
用法上两者也十分的简单:
git merge将当前分支合并到指定分支,命令用法如下:
1git merge xxx
git rebase将当前分支移植到指定分支或指定commit之上,用法如下:
1git rebase -i <commit>
常见的参数有--continue,用于解决冲突之后,继续执行rebase
1git rebase --continue
二、分析git merge通过git merge将当前分支与xxx分支合并,产生的新的commit对象有两个父节点
如果“指定分支”本身是当前分支的一个直接子节点,则会产生快照合并
举个例子,bugfix分支是从master分支分叉出来的,如 ...
面试官:说说你对git reset 和 git revert 的理解?区别?
面试官:说说你对git reset 和 git revert 的理解?区别?
一、是什么git resetreset用于回退版本,可以遗弃不再使用的提交
执行遗弃时,需要根据影响的范围而指定不同的参数,可以指定是否复原索引或工作树内容
git revert在当前提交后面,新增一次提交,抵消掉上一次提交导致的所有变化,不会改变过去的历史,主要是用于安全地取消过去发布的提交
二、如何用git reset当没有指定ID的时候,默认使用HEAD,如果指定ID,那么就是基于指向ID去变动暂存区或工作区的内容
12345// 没有指定ID, 暂存区的内容会被当前ID版本号的内容覆盖,工作区不变git reset// 指定ID,暂存区的内容会被指定ID版本号的内容覆盖,工作区不变git reset <ID>
日志ID可以通过查询,可以git log进行查询,如下:
1234567891011commit a7700083ace1204ccdff9f71631fb34c9913f7c5 (HEAD -> master)Author: linguanghui <lin ...