1.描述call、apply和bind的区别。

(1)bind会有一个返回值,返回值是函数体,因此需要加上()才能调用。
(2)call、apply是没有返回值的,当改变函数this指向时侯,函数就会执行,不需要加()调用。
(3)call传递参数的时候是一个一个传递的,apply是传递一个转数组。
(4)如果call和apply的第一个参数是null,那么this在node环境下指向的是global对象,在HTML中指向的是window对象

2.描述函数return 如果一个代码没有return回出现什么问题?

(1)return的作用就是跳出函数,后面的的代码都不会再执行
(2)如果没有return,就会一直在函数内部执行,直到运行完内部所有代码

3.什么是闭包?作用、优点和缺点。

(1)闭包:闭包就是能够读取其他函数内部变量的函数
(2)闭包的作用:
    a.可以读取函数内部的变量
    b.变量的值始终保存在内存中
(3)优点:可以读取函数内部的变量,增加变量的使用。
(4)缺点:由于变量的值始终保存在内存中,这会导致内存消耗很大。
(5)闭包生成的三个条件
    a.函数嵌套函数
    b.内部函数引用了外部函数中的数据(属性、函数)
    c.参数和变量不会被回收

4.continue和break的区别

(1)break 跳出循环后就不再执行
(2)continue 跳出当前循环,进行下一次循环

5.说一说ECMAScript和JavaScript的关系,说明目前最新版本的JavaScript是那个版本

ECMAScript是javaScript的实现标准。目前最新的javaScript是9

6.描述什么是变量提升?会出现什么结果?

(1)只有var声明的才会产生变量提升问题
(2)js在变量声明提升的时候会将var声明的变量以及用关键字函数声明函数,都会提升到当前作用域的顶端,赋值语句在原地等待赋值。
(3)会出现undefined

7.JavaScript的组成部分

(1)ECMAScript:描述了该语言的语法和基本对象
(2)文档对象模型(DOM): 描述处理网页内容的方法和接口
(3)浏览器对象模型(BOM):描述与浏览器进行交互的方法和接口。

8.JavaScript可以运行在什么地方?

(1)浏览器
(2)nodejs

9.JavaScript特点

(1)解释型语言 js->nodejs(解释器)
(2)弱类型语言 变量的数据类型取决于值的数据类型
(3)顺序解释执行
(4)既可以作为前端脚本语言,也可以作为后端语言,取决于应用平台和使用的框架。

9.在body和head中使用JavaScript的区别

(1)在body部分中的JavaScript会在页面加载的时候被执行,在head部分中的JavaScript会在被调用的时候才执行。
(2)因为浏览器解析html是从上到下的。如果把JavaScript放在head里的话,则先被解析,但这时body还没有解析,所有会返回空值。
(3)一般都会绑定一个监听,当全部的html文档解析完之后再执行代码
window.onload = function(){
    //这里放执行的代码
}

10.JavaScript的数据类型

(1)基本数据类型:字符串(String)、数字(Number)、布尔(Boolean)、对空(Null)、未定义(Undefined)
(2)引用数据类型:对象(Object)、数组(Array)、函数(Function)

11.undefined和null关系

(1)undefined继承null,所以undefined==null结果为true。但是null表示空对象,undefined表示未定义。所以undefined===null为false
(2)null与undefined用途不同,null可以用来表示一个空对象,但是没有必要把一个变量的值显式设置为undefined。

12.什么是深拷贝和浅拷贝,怎么样进行浅拷贝?

(1)浅拷贝只是拷贝了引用地址,数据在内存中,如果引用的对象发生了变化,该变量也会同步变化
(2)深拷贝相当于把内存上的数据拷贝了份,即地址和内容都拷贝。此时修改变量不会影响原来的变量。同理修改原来的变量也不会影响现在的变量
(3)通过赋值=实现浅拷贝

13.实现深拷贝的方法

(1)通过JSON对象实现深拷贝(JSON.stringify,JSON.parse)
(2)Object.assign()拷贝
(3)lodash函数库实现深拷贝
(4)递归的方式实现深拷贝

14.算数运算符(5个)

+ - * / %

15.一元运算符(8种)

(1) +
(2) -
(3) !
(4) ++
(5) --
(6) delete
(7) typeof
(8)    void

16.检测对象属性(3种)

(1)in 检测某属性是否是某对象的自有属性或者是继承属性
(2)Object.prototype.hasOwnProperty() 检测给定的属性是否是对象对象的自有属性,对于继承属性返回false
(3)Object.prototype.propertyIsEnumerable() 检测自身属性和可枚举属性

17.对象(Object)原型中常用的方法

(1)constructor 保存用户创建当前对象的函数,与原型对象对应的构造函数
(2)hasOwnProperty(propertyName) 检查给定的属性在当前对象实例中是否存在
(3)propertyIsEnumerable(propertyName) 检查给定的属性在当前对象实例中式否存在
(4)valueOf() 返回对象的字符串,数值,布尔值的表示
(5)toLocaleString() 返回对象的字符串表示,该字符串与执行环境的地区对应
(6)toString() 返回对象的字符串表示
(7)isPrototypeOf(object) 检查传入的对象的原型

18.对象的数据属性特性

(1)configurable 是否可通过delete删除
(2)enumerable 是否可以通过for-in循环返回属性
(3)writable 是否可写
(4)value 包含这个属性的数据值
以上需要通过Object.defineProperty(对象,属性名,描述的函数)来进行修改

19.对象中读取属性的特性

(1)Object.getOwnPropertyDescriptor(对象,属性名称)
(2)Object. getOwnPropertyDescriptors(obj)

20.函数的作用

(1)功能的封装
(2)直接调用
(3)代码复用率提高

21.函数内部的属性:arguments,解释什么是arguments

(1)arguments是一个类数组对象,包含着传入函数中的所有参数
(2)arguments主要用途是保存函数参数,该对象还有一个名为callee的属性,该属性是一个指针,指向拥有这个arguments对象的函数。callee属性是 arguments对象的一个成员,仅当相关函数正在执行时才可用。

22.this指向问题

(1)在方法中,this表示该方法所属的对象
(2)如果单独使用,this表示全局对象
(3)在函数中,this表示全局对象
(4)在事件中,this表示接收事件的元素
(5)在显示函数绑定时,我们可以自己决定this的指向

23.IIFE(立即执行函数)

作用
    (1)页面加载完成后只执行一次的设置函数
    (2)将设置函数中的变量包裹在局部作用域中,不会泄露成全局变量。

24.函数声明和IIFE的区别?

(1)在函数声明中,我们首先看到的是function关键字,而IIFE我们首先看到的是左边的(。也就是一对()将函数的声明括起来,使得JS编译器不再认为这是一个函数声明,而是一个IIFE。即需要立刻执行声明得函数
(2)两者达到得目的是相同的,都是为了声明一个函数并且随后调用函数。

25.为什么需要IIFE?

IIFE的出现是为了弥补JS(ES5)在作用域方面的缺陷:JS只有全局作用域、函数作用域,从ES6开始才有块级作用域。

26.作用域

(1)函数作用域
    在JavaScript函数中声明的变量,会成为函数的局部变量
    函数内部声明的变量,在函数外部不能访问
(2)全局作用域
    函数之外声明的变量,会成为全局变量
    函数外部声明的变量,在函数内部可以访问
    当函数嵌套,在这个时候,内部函数与外部函数的这个变量就组成了闭包
(3)作用域最大的好处就是隔离变量,不同作用域下同名变量不会有冲突。

27.回调函数的作用

(1)回调函数一般都用在耗时操作上面
(2)因为主函数不用等待回调函数执行完,就可以接着执行自己的代码
(3)比如Ajax请求,处理文件等

28.数组的属性和方法

(1)toString() 在默认情况下都会以逗号分隔字符串的形式返回数组项
(2)join() 使用指定的字符串用来分隔数组字符串
(3)Array.isArray() 用来判断某个变量是否是一个数组对象
(4)Array.from() 从类数组对象或可迭代对象中创建一个新的数组实例
(5)Array.of() 根据一组参数来创建新的数组实例,支持任意的参数数量和类型
(6)Array.prototype.push() 向数组的末尾添加一个或多个元素,并返回新的长度。
(7)Array.prototype.pop() 删除数组的最后一个元素并返回删除的元素
(8)Array.prototype.shift() 把数组的第一个元素从其中删除,并返回第一个元素的值
(9)Array.prototype.unshift() 向数组的开头添加一个或更多元素,并返回新的长度
(10)Array.prototype.reverse() 颠倒数组中元素的顺序
(11) Array.prototype.sort() 用于对数组的元素进行排序
(12) Array.prototype.concat() 用于连接两个或多个数组
(13) Array.prototype.slice() 可从已有的数组中返回选定的元素
(14) Array.prototype.splice() 用于添加或删除数组中的元素
(15) Array.prototype.indexOf() 返回数组中某个指定的元素位置
(16) Array.prototype.lastIndexOf() 返回一个指定的元素在数组中最后出现的位置,从该字符串的后面向前查找。
(17)Array.prototype.every() 用于检测数组所有元素是否都符合指定条件
(18)Array.prototype.some() 用于检测数组中的元素是否满足指定条件(函数提供)
(19)Array.prototype.filter() 创建一个新的数组,新数组中的元素是通过检查指定数组中符合条件的所有元素。
(20)Array.prototype.map() 返回一个新数组,数组中的元素为原始数组元素调用函数处理后的值
(21)Array.prototype.forEach() 用于调用数组中的每个元素,并将元素传递给回调函数

29.什么是正则表达式?

(1)正则表达式时由一个字符序列形成的搜索模式
(2)当你在文本中搜索数据时,你可以用搜索模式来描述你要查询的内容。
(3)正则表达式可以是一个简单的字符,或一个更复杂的模式
(4)正则表达式可用于所有文本搜索和文本替换

30.正则表达式的实例方法

(1)exec() 可用来匹配字符串中符合正则表达式的字符串,匹配到时时,返回值一个数组:[匹配的内容,index:在str中匹配的起始位置,input:参数字符串,groups:undefined],匹配不到返回Null。
(2)test() 用来测试待检测的字符串中是否有可以匹配到正则表达式的字符串,如果有返回true,否则返回false。
(3)toString() 把正则表达式的内容转化成字面量形式字符串
(4)toLocaleString() 把正则表达式的内容转化成有本地特色的字符串(JS中没效果)
(5)valueOf() 返回正则表达式本身

31.正则表达式的实例属性

(1)lastIndex 当没设置全局匹配时,改属性值始终为0,开启了全局匹配后,每次正则查找的起点就是lastIndex。
(2)ignoreCase 是否忽略大小写
(3)global 全局匹配
(4)multiline 多行匹配
(5)source 返回字面量形式的正则表达式

32.String对正则表达式的支持

(1)search() 查找字符串中是否有匹配正则的字符串,有则返回字符串第一次出现的位置,无则返回null。
(2)match() 匹配字符串中符合正则表达式的字符串,并返回该字符串的一个数组,其中包括字符串内容、位置
(3)split() 以某种形式分割字符串
(4)replace() 满足正则表达式条件的内容将被替换掉。

33.基本包装类型为多少

(1)Boolean
(2)Number
(3)String

34.JS什么时候会自动创建一个对应的基本包装类型?

(1)取决于当前执行的代码是否是为了获取他的值。
(2)每当读取一个基本类型的值,也就是我们需要从内存中获取到它的值时(这个过程称为读取模式),这时,后台就会自动创建一个基本包装类型

35.引用类型和基本包装类型有什么不同呢?

(1)引用类型:使用new操作符创建的引用类型实例,在执行流离开当前作用域之前一直都保存在内存中。
(2)基本包装类型:只存在一行代码的执行瞬间,然后立即销毁。

36.怎么样才能给基本类型添加方法或者属性呢?

(1)增加对应的包装对象的原型方法
(2)使用new运算符创建String/Number对象

37.Number类型的内置属性和内置方法(常用)

内置属性
(1)MAX_VALUE 可表示的最大的数
(2)MIN_VALUE 可表示的最小的数
(3)NaN 非数字值
(4)NEGATIVE_INFINITY 负无穷大,溢出时返回该值
(5)POSITIVE_INFINITY 正无穷大,溢出时返回该值
(6)prototype 使您有能力向对象添加属性和方法
内置方法
(1)toString() 把数字转换为字符串,使用指定的基数
(2)toLocaleString() 把数字转换为字符串,使用本地数字格式顺序
(3)toFixed() 把数字转换为字符串,结果的小数点后有指定位数的数字
(4)toExponential() 把对象的值转换为指数计数法
(5)toPrecision() 方法可在对象的值超出指定位数时将其转换为指数计数法
(6)valueOf() 返回一个Number对象的基本数字值

38.String类型的对象属性和方法(常用)

对象属性
(1)constructor 对创建该对象的函数的引用
(2)length 字符串的长度
(3)prototype 允许您向对象添加属性和方法
对象方法
(1)charAt(index) 返回指定索引位置的字符串
(2)charCodeAt(index) 以Unicode编码形式返回指定索引位置的字符串
(3)concat() 连接字符串
(4)slice() 提取字符串,并以新的字符串返回被提取的部分
(5)substring() 提取字符串中两个指定的索引号之间的字符
(6)substr() 从起始索引号提取自负串中指定数目的字符
(7)indexOf(str,n)从n开始搜索的索引值返回
(8)lastIndexOf(str,n) 从n开搜索最后一个str,并将搜索的索引值返回
(9)toLowerCase() 把字符串转换为小写
(10)toUpperCase() 把字符串转换为大写
(11)toLocaleLowerCase() 把字符串转换为小写。本地化
(12)toLocaleUpperCase() 把字符串转换为大写。本地化
(13)match() 找到一个或多个正则表达式的匹配
(14)replace() 替换于正则表达式匹配的子串
(15)search() 检索与正则表相匹配的值
(16)split() 把字符串分割为字符数组

39.Math对象常用的属性和方法

内置属性
(1)E 返回算术常量 e,即自然对数的底数(约等于2.718)
(2) LN2 返回 2 的自然对数(约等于0.693)
(3) LN10 返回 10 的自然对数(约等于2.302)
(4) LOG2E 返回以 2 为底的 e 的对数(约等于 1.414)
(5) LOG10E 返回以 10 为底的 e 的对数(约等于0.434)
(6) PI 返回圆周率(约等于3.14159)
(7) SQRT1_2 返回返回 2 的平方根的倒数(约等于 0.707)
(8) SQRT2 返回 2 的平方根(约等于 1.414)
对象方法
(1) Math.min() 求一组数中的最小值
(2) Math.max() 求一组数中的最大值
(3) Math.ceil() 向上舍入
(4) Math.floor() 向下舍入
(5) Math.round() 四舍五入
(6) Math.random() 随机数 返回大于0小于1的一个随机数[0,1)

40.什么是工厂模式 ?

工厂模式是一种众所周知的设计模式,广泛应用于软件工程领域,用于抽象创建特定对象的过程。工厂模式是一种创建型模式,简单来说,工厂模式就是创建对象的一种方式

41.工厂模式有什么用?

作用:
(1)创建对象
(2)降低代码冗余度

42. 为什么用工厂模式?

从工厂模式的作用来看,工厂模式的主要作用就是用来生对象的。

43.用字面量的方式创建对象有什么缺点?

用字面量的方式来创建对象,最大的缺点就是,这个对象是一次性的,如果有四十个同学,这个代码就要写四十次,有点小麻烦。

44.用构造函数创建对象有什么缺点?

可以发现它是先实例化了一个对象,然后再为对象添加属性,这样就看不出来是一个整体(像用字面量创建的话,属性都在一个大括号里面,这样就很好看出是一个整体)。
因此,我们为了使创建对象更加方便(不像字面量创建那样一次性),也为了写的代码更像个整体,就可以交给工厂模式来做。

45.工厂模式的优缺点?

(1)优点:只要我们往工厂函数里面塞参数,工厂函数就会像生产产品一样造个人出来。
(2)缺点:这种方式本质上是将创建的对象进行了封装,本质并没有改变,我们创建一个student时无法知道其具体的数据类型,只知道这是一个对象,往往实际开发中我们需要确定这个对象到底是个Person的实例还是Dog的实例

46.js里面的内置函数及对象有哪些

(1)对象:Array Object Date String Number Boolean ... RegExp 
(2)函数:slice() splice()  join()  toString()  sort() concat() reverse()  isNaN() isFinite()

47.css3布局机制

(1)静态布局(static)
(2)浮动布局(float)
(3)定位布局(position)
(4)弹性布局(flex)
(5)网格布局(grid)

48.写出10条linux常用命令并解释

(1)who am i              //查看当前用户
(2)adduser 用户名        //添加用户
(3)addgroup 组名         //添加组
(4)cat /etc/passwd       //查看用户信息
(5)cat /etc/group       //查看组信息
(6)su                  //切换用户
(7)pwd                  //查看当前所在路径
(8)cd                  //切换到指定目录中
(9)ls                  //查看当前目录下的目录或者文件
(10)touch 文件名        //创建文件或者更改最近访问时间

49.写出5条常用git命令并解释

(1)git init    //初始化
(2)git add . //提交文件到缓存区
(3)git commit -m "提交页面备注" --no-verify     //提交备注
(4)git pull origin master      //更新状态
(5)git push -u origin master      //提交状态

50.阿里云在我们开发中扮演什么角色

阿里云可以提供一个远程服务器,可以使用它进行linux学习,js学习,也可以用于搭建个人网站。
阿里云等云服务器一般作为项目的部署服务器,需要在阿里云上安装一些项目部署的环境,需要掌握基本的命令操作和vim操作。

51.简述事件流和事件冒泡

事件流描述的是从页面中接收事件的顺序。事件发生时会在元素节点与根节点之间按照特定的顺序传播,路径所经过的所有节点都会收到该事件,这个传播过程即DOM事件流
IE的事件流叫做事件冒泡(event bubbling),即事件开始时有最具体的元素(文档中嵌套层次最深的那个节点)接收,然后逐级向上传播到较为不具体的节点

52.事件代理机制

事件代理机制利利用冒泡的原理,把事件加到父级上,通过判断事件来源的子集,执行相应的操作。可以只使用一个事件处理程序来管理一种类型的事件

53.对一个数组使用算法排序 var arr=[1,3,5,7,6,9];

arr.sort(function(a, b){
    return a-b;
})

54.写出5个Math实例可以调用得方法

(1)Math.sqrt() //求平方根
(2)Math.min() //求一组数中的最小值
(3)Math.max()    //求一组数中的最大值
(4)Math.ceil() //向上舍入
(5)Math.floor()    //向下舍入
(6)Math.round() //四舍五入
(7)Math.random() //随机数

54.函数的调用方式有几种,并说明他们的区别?

(1)作为函数调用
(2)作为方法调用
(3)作为构造函数调用
(4)作为函数方法调用

55.==和===有什么区别?

    ==只要值相等即可为真,而===则不仅要值相等,还要类型相同。

56.DOM中怎样追加、插入、移除、复制和获取节点

(1)追加:document.body.appendChild(p);
(2)插入: parentDiv.insertBefore(new, old);
(3)移除:span1.parentNode.removeChild(span1);
(4)复制:var dupNode = node.cloneNode(deep);
(5)获取:document.getElementById(id)
         document.getElementsByTagName(name)
         document.getElementsByClassName(name)
         document.querySelector()
         document.querySelectorAll()

57.谈谈你对于原型和原型链的理解?

js通过原型链来继承,在原型链中的方法,实例可以调用。

58.ajax是什么?你在开发中如何使用ajax?

ajax是异步的JavaScript和XML。用来进行异步请求。浏览器可以向服务器发送一个ajax请求,进行页面的局部刷新

59.typeof返回值

number string boolean undefined function object NaN

60.简述CSS盒子模型

margin(外边距)、border(边框)、padding(内边距)、content(内容)
内容盒子:width和height仅表示内容区域所占的宽高
    内容宽:width
    内容高:height
    盒子宽:width+paddingLeft+paddingRight+borderLeft+borderRight
    盒子高:height+paddingTop+paddingBottom+borderTop+borderBottom
    占屏宽:width+paddingLeft+paddingRight+borderLeft+borderRight+marginLeft+marginRight
    占屏高:height+paddingTop+paddingBottom+borderTop+borderBottom+marginTop+marginBottom
边框盒子:width和height表示整个盒子的宽高
    内容盒子:width和height仅表示内容区域所占的宽高
    内容宽:width-paddingLeft-paddingRight-borderLeft-borderRight
    内容高:height-paddingTop-paddingBottom-borderTop-borderBottom
    盒子宽:width
    盒子高:height
    占屏宽:width+marginLeft+marginRight
    占屏高:height+marginTop+marginBottom

61.css选择器的优先级如何计算?

    间接选中(继承)
        如果是间接选中, 那么就是谁离目标标签比较近就听谁的
    相同选择器(直接选中)
        如果都是直接选中, 并且都是同类型的选择器, 那么就是谁写在后面就听谁的
    不同选择器(直接选中)
        如果都是直接选中, 并且不是相同类型的选择器, 那么就会按照选择器的优先级来层叠
        id>类>标签>通配符>继承>浏览器默认
    !important

流走的年华
7 声望1 粉丝

« 上一篇
DOM
下一篇 »
DOM事件机制