JS面试题讲解
面试题
1. js中使用 typeof 能得到的类型有哪些
简答:
undefined、string、number、boolean、object、function
就这么样就结束了吗?
解析:
1 | // 数据类型有哪些? |
之前:
六大数据类型
- 基本数据类型(简单数据类型)
- number 数值型(NaN)
- string 字符串
- boolean 布尔型
- undefined 未定义
- null 空引用
- 引用数据类型(复杂数据类型)
- object
百度:
1 | Null类型是第二个只有一个值的数据类型,这个特殊的值是null,从逻辑角度来看,null值表示一个空对象指针,而这也正是使用typeof操作符检测null值会返回“object”的原因,如下面的例子所示: |
2. 何时使用 === 何时使用 ==
简答:
当仅需要比较值是否相等时,用==;
当需要比较类型和值时,用===。
就这么样就结束了吗?
解析:
1 | // 有何区别? |
####百度:
1 | 如果 x 或 y 中有一个为 NaN,则返回 false; |
3. js变量按照存储方式分为哪些类型,并描述其特点
简答:
简单数据类型、复杂数据类型(值、引用)。
值类型:简单类型, 变量在存储简单类型的时候,存储的是值本身。
引用类型:复杂类型,变量在存储复杂类型的时候,只会存储这个对象的地址,并不会存储对象的值。
???
解析:
1 | //简单类型(值类型) |
4. 数组的常用api有哪些
简答:
push() 、pop() 、unshift() 、shift();
es6:filter()、 forEach()、 some() 、every() 、map()等
???
解析:
1 | // push() pop() unshift() shift() |
5. 如何准确判断一个变量是数组类型
简答:
可以通过 instanceof
来判断, 用arr instanceof Array;
。
???
解析:
1 | // instanceof 操作符 |
之前:
js基础阶段对instanceof作用的描述 : 判断一个对象是否是某个构造函数的实例
现在我们学习了原型,也学习了原型链,所以我们现在可以更严谨的描述他的作用:
判断一个函数的原型对象,是否在实例对象的原型链上
6. 描述 new 一个对象的过程
简答:
1 | 1. 创建一个对象; |
???(这次还说吗?)
7. 说一下变量提升的理解?
简答:
- 变量定义、函数声明提升(同名提升问题)
- 因为在es6之前没有块级作用域,早起提出一个预解析的方案,但是实际使用的时候,并没有想的那么好。
- es6中的let和const可以拥有块级作用域。
解析:
- 声明提升
1 | // 1.变量提升 |
- 作用域(es6中的let和const)
1 | //es6之前 |
8. 说明 this 几种不同的使用场景?
简答:
构造函数(new出来的过程)、对象方法、普通函数、借用方法模式(上下文调用模式)
解析:
1 | // this的指向要在函数执行的时候才能确定,函数定义时是无法确认(就是只看函数是如何被调用的,而不看函数是如何定义的) |
9. 如何理解作用域?
简答:
- es6之前的作用域只有全局作用域和函数作用域(词法作用域)
- es6出现了块级作用域({})
- 作用域出现是历史原因
解析:
1 | //es6之前 |
10. 实际开发中闭包的应用?
简答:
- 私有化数据。
- 数据保持。
解析:
1 | function main(){ |
缺点:
由于内部的函数使用了外部函数的变量,导致外部这个函数无法被回收掉.如果代码中大量的存在闭包,可能会导致内存泄露 (不要刻意使用闭包)。
笔试题
1.打印结果是什么?
1 | console.log(1); |
2. 打印结果是什么?
1 | function add(x, y) { |
3.打印结果是什么?
1 | // 1. |
##4. 结果是什么?
1 | // 1、考察原型链 |
5. 统计一个字符串中每个字符出现的次数
1 | var str = 'asdfssaaasasasasaa'; |
6. 获取随机数,要求是长度一致的字符串格式
1 | // Math.random() 生成[0,1)的随机数,小数点后面数值个数不定 |
7. 去掉一个数组的重复元素
1 | var arr = [1, 2, 3, 1, 43, 12, 12, 1, 2, 3, 4, 5]; |
8. 完成下列要求,函数返回扁平化后的数组如:[1, [2, [ [3, 4], 5], 6]] => [1, 2, 3, 4, 5, 6]。
1 | var arr = [1, [2, [ [3, 4], 5], 6]]; |
9.求数组中:最小的x坐标、最大的y坐标
1 | var arr = [ |
拓展
git学习笔记
学习目的
在实际工作开发中,并不是一个人敲代码,需要团队的协作,用版本控制工具会提高我们程序员的项目开发效率。所以目的之一就是让大家在初次搭建项目的时候就能熟悉以后工作时候的环境,培养一个好的团队合作习惯。
自己项目可以试着推送到自己的git上,算是自己成长的积累。
面试有的时候会要求在git上有自己的作品,有自己的项目。作为一个有多年工作经验的程序员,很多都会在git上传自己的作品。
学习要求
- 了解git是什么?
- 使用git的作用是什么?
- 会使用常用的git命令。
- 能将自己写的项目推到远程仓库中。
git的安装
注意:1. 不要安装在中文目录
:以后安装软件都要注意这一点,很多软件安装路径存在中文会出错。
2. 不要使用桌面管理软件
:使用桌面管理软件以后,右键出现的菜单会被管理,会隐藏我们要使用的功能按钮。
安装很简单,一直下一步即可。在任意的目录下右键,能够出现 Git GUI Here
和 Git Bash Here
,表示安装成功了。
例子
- 当我们做甲项目时,做到了一半。
- 此时Boss说你手头的项目先停一停,先做乙项目,马上要上线了,此时你停下手头的事开始做乙项目。
- 当乙项目做到一半的时候,Boss又说你做甲项目去吧,乙项目延后了,这时候你又去做甲项目了。
- 但是甲项目已经被你同事做了一大半了,此时你很高兴,然后接着往后做。(你们此时怎么配合)
- 当甲项目做了一大半的时候,万恶项目经理说你们做的不好,要你从你之前写到一半的地方重新写。(你怎么办)
- 当你甲项目改了到一大半的时候,此时万恶的产品经理又说客户的需求改了,之前写的就很好,要你复原之前的项目(。。。)
- 。。。。。。。。
- 告辞!(我要删库!!)(项目经理怎么办)
在实例开发过程中,与团队的配合协作往往会花很多的时间与经历,并且每一次手动保存很耗时间和精力,为了将我们的精力都用在开发上,现在公司开发项目都会用到版本控制工具。
为什么要有版本控制系统?
- 在开发过程中,经常需要对一个文件进行修改甚至删除,但是我们又希望能够保存这个文件的历史记录,如果通过备份,那么管理起来会非常的复杂和繁琐。
- 在多人开发时,如果需要多人合作开发一个页面,那么修改以及合并也会非常的棘手。容易出现冲突。
##什么是版本控制系统?
版本控制系统(Version Control System):是一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统。版本控制系统不仅可以应用于软件源代码的文本文件,而且可以对任何类型的文件进行版本控制。
常见的版本控制系统有:cvs、svn、git
版本控制系统的分类
本地版本控制系统
本地版本控制系统就是在一台机器上,记录版本的不同变化,保证内容不会丢失。
缺点:如果多人开发,每个人都在不同的系统和电脑上开发,没办法协同工作。
集中式版本控制系统
svn/cvs都是集中式的版本控制系统。
- 需要一个中央服务器来管理代码的的版本和备份。
- 所有的用户电脑都是从中央服务器获取代码或者是将本地的代码提交到中央服务器。
- 依赖与网络环境,如果连不上中央服务器,就无法提交和获取代码。
- 如果中央服务器宕机,所有人都无法工作。
分布式版本控制系统
git是分布式的版本控制系统。
- 需要一台服务器作为代码仓库。
- 每个用户电脑都是一个服务器(代码仓库),并且和代码仓库是镜像的,用户修改和获取代码都是提交到自己的服务器当中。
- 不需要网络就可以进行工作。
- 当连接网络时,用户可以选择将自己的服务器与代码仓库进行同步。
git介绍
Git是一款免费、开源的分布式 版本控制系统 ,用于敏捷高效地处理任何或小或大的项目。
Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。
git的使用方式
git是用法方式主要有两种。
- git gui,即图形化界面的方式。
- git bash,(cmi)命令行的方式。
给window用户的忠告:git的命令必须使用linux风格的shell来运行Git命令,不能使用window风格的shell运行git命令
- 在任意文件夹中,都可以使用右键,通过git bash here打开命令行窗口,此时的路径就是当前目录。
- 窗口上右键,通过options–>Text–>select可以调整字体的大小。
bash入门(了解)
bash是许多linux系统默认的shell(命令行工具)。
cmd和powershell是window系统默认的shell(命令行工具)。
二者的功能都一样,通过命令行来操作计算机的功能。
为什么要学习bash?
- 必须使用linux风格的shell来运行git命令
- 工作过程中,项目都是部署在linux系统中,了解一些常用的bash命令也是有必要的。
1 | # cd 改变目录 (change directory) |
试一试:
- 在桌面新建一个
test
文件夹 - 在test文件夹中打开git命令窗口
- 创建 css images js 三个文件夹
- 新建index.html文件,在css文件中新建index.css文件, 在images中新建index.png文件,在js文件中新建index.js
- 把index.html重命名为index2.html
- 把index.css文件挪到js文件中
git初体验
在第一次使用的时候,需要配置你的用户邮箱和用户名称,这两条配置是很重要的,每次提交git代码都会引用这两条信息,记录了谁提交了代码,会永久的记录在历史记录中。
1 | # git config user.name 你的目标用户名 |
- 初始化git仓库
git init
- 查看当前git仓库的状态
git status
- 将文件添加到git的暂存区
git add 文件名
- 将文件由暂存区提交到仓库区
git commit -m '提交说明'
- 查看提交日子
git log
1 | # 要对某个项目使用git进行管理,需要使用git init命令初始化git仓库 |
git的三个区
工作区、暂存区、本地仓库区
工作区:我们书写代码的地方,工作的目录就叫工作区。
暂存区:使用add命令,在.git
目录中的一个索引文件,记录修改的文件
本地仓库区:将保存在暂存区域的内容永久转储到 Git 仓库中,生成版本号。生成版本号之后,就可以任何的回退到某一个具体的版本。
git命令详解
git add(重点)
- 作用:让git追踪一个新的文件,并且将文件由 工作区 添加到 暂存区,暂存文件
- 命令:
git add 文件名/目录名
- 例如:
git add index.html
- 例如:
git add --all
或者git add -A
获取git add .
(简写) 添加所有文件git add a.txt b.txt
同时添加两个文件git add *.js
添加当前目录下的所有js文件git add css/
添加css目录下所有的文件
git checkout 文件名
- 作用:暂存区的内容恢复到工作区。
git checkout 1.txt
将暂存区中1.txt文件恢复到工作区
git commit(重点)
- 作用:将文件由 暂存区 添加到 仓库区,生成版本号(历史记录,以后可以回退到某一个版本号)
git commit -m "提交说明"
git status
- 作用:查看文件的状态
- 命令:
git status
- 命令:
git stauts -s
简化日志输出格式
git log
- 作用:查看提交日志
git log
只能查看当前head以及以前的日志git log --oneline
简洁的日志信息,如果提交的日志非常多了git reflog
查看所有的提交变更日志
git reset
- 作用:版本回退,将代码恢复到已经提交的某一个版本中。
git reset --hard 版本号
将代码回退到某个指定的版本(版本号只要有前几位即可)git reset --hard head~1
将版本回退到上一次提交- ~1:上一次提交
- ~2:上上次提交
- ~0:当前提交
远程仓库
所有的程序员都可以通过远程仓库来进行版本的共享,达到所有人的代码一致的效果。
github
git与github没有直接的关系。
- git是一个版本控制工具。
- github是一个代码托管平台,是git的一个远程代码仓库。
- 将来工作时,公司会有自己的代码仓库。
1 | 1. gitHub是一个面向开源及私有软件项目的托管平台,因为只支持git 作为唯一的版本库格式进行托管,故名gitHub。 |
在github上创建一个项目,获取到仓库的地址。然后就可以将本地的代码推送到远程的服务器上。
注册步骤:
打开github官网:
填写信息,进行注册:
登录:
远程仓库相关命令
git push
- 作用:将本地仓库中代码提交到远程仓库
git push 仓库地址 master
在代码提交到远程仓库,注意master分支必须写,不能省略- 例子:
git push https://github.com/ruiweitang/gitStudy.git master
如果第一次使用,需要填写github的用户名和密码 - 在git push之前,先git pull: 保证先把远程仓库代码先拉取到本地
git pull
- 作用:将远程的代码下载到本地
git pull 代码地址 master
将远程的代码中master分支下载到本地- 通常在push前,需要先pull一次。
git clone
- 作用:克隆远程仓库的代码到本地
- git clone [远程仓库地址]
git clone https://github.com/ruiweitang/gitStudy.git
会在本地新建一个gitStudy
文件夹,在gitStudy中包含了一个.git
目录,用于保存所有的版本记录,同时gitStudy文件中还有最新的代码,你可以直接进行后续的开发和使用。- git克隆默认会使用远程仓库的项目名字,也可以自己指定。需要是使用以下命令:
git clone [远程仓库地址] [本地项目名]
(gitStudy->自己想要的名字)
git remote
每次push和pull操作都需要带上远程仓库的地址,非常的麻烦,我们可以给仓库地址设置一个别名
git remote add 仓库别名 仓库地址
使用仓库别名替代仓库地址。仓库别名相当于一个js变量,仓库地址就是对应的值。git remote add rwt https://github.com/ruiweitang/gitStudy.git
设置了一个rwt的仓库别名,以后push和pull都可以不用仓库地址,而用rwt,origin
git remote remove rwt
删除rwt这个仓库别名。git remote
查看所有的仓库别名- 如果使用了
git clone
命令从远程仓库获取下来的,那么这个本地仓库会自动添加一个 origin的远程地址,指向的就是克隆的远程地址。
SSH免密码登录
git支持多种数据传输协议:
- https协议:
https://github.com/ruiweitang/gitStudy.git
需要输入用户名和密码 - ssh协议:`git@github.com:ruiweitang/gitStudy.git` 可以配置免密码登录
每次push或者pull代码,如果使用https协议,那么都需要输入用户名和密码进行身份的确认,非常麻烦。
- github为了账户的安全,需要对每一次push请求都要验证用户的身份,只有合法的用户才可以push
- 使用ssh协议,配置ssh免密码,可以做到免密码往github推送代码
SSH免密码登录配置
注意:这些命令需要在bash中敲
- 创建SSH Key:
ssh-keygen -t rsa
- 在文件路径
C:\用户\当前用户名\
找到.ssh
文件夹 - 文件夹中有两个文件:
- 私钥:
id_rsa
- 公钥:
id_rsa.pub
- 私钥:
- 在
github -> settings -> SSH and GPG keys
页面中,新创建SSH key - 粘贴 公钥
id_rsa.pub
内容到对应文本框中 - 在github中新建仓库或者使用现在仓库,拿到`git@github.com:用户名/仓库名.git`
- 此后,再次SSH方式与github“通信”,不用输入密码确认身份了