目录
6. 事件委托是什么?如何确定事件源(Event . target 谁调用谁就是事件源)
一、什么是Promise?我们用Promise来解决什么问题?
18. 一个页面从输入 URL 到页面加载显示完成,这个过程中都发生了什么?
19 . Js中 .call() 与 .apply() 区别
22. 什么是jsonp工作原理是什么?他为什么不是真正的ajax
jsonp原理: ( 动态创建scrip t标签,回调函数 )
28. 原型和继承, prototype ,call和apply继承的区别(第一个参数是相同的,第
4 selector1 ,selector2,...,selectorN
8.[attributeN1][attributeN2][attributeN3]
6. jQuery中 .get() 提交和 .post() 提交的区别
11. $(this) 和 this 关键字在 jQuery 中有何不同?
12. jQuery 里的 eac h () 是什么函数?你是如何使用它的?
13. JQuery中的Delegate() 函数有什么作用?
Javascript相关
1. Js基本数据类型有哪些
字符串 String ,数值 Number ,布尔 boolean , null ,undefined ,对象 ,数组
2 . Ajax如何使用
一个完整的AJAX请求包括五个步骤:
( 1)创建XMLHTTPRequest对象
( 2)使用open方法创建http请求,并设置请求地址
xhr.open (get/post ,url ,async ,true (异步), false (同步))经常使用前三个参数
( 3)设置发送的数据,用send发送请求
(4)注册事件(给ajax设置事件)
( 5)获取响应并更新页面
3. 如何判断一个数据是NaN
NaN 非数字 但是用 typeof 检测是 number 类型
利用NaN的定义 用typeof判断是否为number类型并且判断是否满足isnan 利用NaN是唯一一个不等于任何自身的特点 n!==n
利用ES6中提供的Object.is()方法(判断两个值是否相等) n==nan
Js中null与undefined区别
相同点:用 if 判断时,两者都会被转换成 false
不同点:
number转换的值不同 number (null)为0 number (undefined)为NaN
Null表示一个值被定义了,但是这个值是空值
Undefined 变量声明但未赋值
4. 闭包是什么?有什么特性?对页面会有什么影响
闭包可以简单理解成:定义在一个函数内部的函数。其中一个内部函数在包含它们的外部函数之外被调 用时,就会形成闭包。
特点:
函数嵌套函数。
函数内部可以引用外部的参数和变量。
参数和变量不会被垃圾回收机制回收。
使用:
读取函数内部的变量;
这些变量的值始终保持在内存中,不会在外层函数调用后被自动清除。
优点:
变量长期驻扎在内存中;
避免全局变量的污染;
私有成员的存在 ;
缺点: 会造成内存泄露
5 . Js中常见的内存泄漏:
意外的全局变量
被遗忘的计时器或回调函数
脱离DOM的引用
闭包
6. 事件委托是什么?如何确定事件源(Event . target 谁调用谁就是事件源)
JS高程上讲:事件委托就是利用事件冒泡,只制定一个时间处理程序,就可以管理某一类型的所有事 件。
事件委托,称事件代理,是js中很常用的绑定事件的技巧,事件委托就是把原本需要绑定在子元素的响 应事件委托给父元素,让父元素担当事件监听的职务,事件委托的原理是DOM元素的事件冒泡。
7. 什么是事件冒泡?
一个事件触发后,会在子元素和父元素之间传播,这种传播分为三个阶段,
捕获阶段(从window对象传导到目标节点(从外到里),这个阶段不会响应任何事件),目标阶段, (在目标节点上触发),冒泡阶段(从目标节点传导回window对象(从里到外)),事件委托/事件代 理就是利用事件冒泡的机制把里层需要响应的事件绑定到外层
8. 本地存储与cookie的区别
Cookie 是小甜饼的意思。顾名思义, cookie 确实非常小,它的大小限制为4KB左右。它的主要用途有保 存登录信息,比如你登录某个网站市场可以看到“记住密码”,这通常就是通过在 Cookie 中存入一段辨别 用户身份的数据来实现的。
loca lStorage
localStorage 是 HTML5 标准中新加入的技术,它并不是什么划时代的新东西。早在 IE 6 时代,就有一 个叫 userData 的东西用于本地存储,而当时考虑到浏览器兼容性,更通用的方案是使用 Flash。而如 今, localStorage 被大多数浏览器所支持,如果你的网站需要支持 IE6+,那以 userData 作为你方案是 种不错的选择。
se ssionStorage
sessionStorage 与 localStorage 的接口类似,但保存数据的生命周期与 localStorage 不同。做过后端 开发的同学应该知道 Session 这个词的意思,直译过来是“会话”。而 sessionStorage 是一个前端的概 念,它只是可以将一部分数据在当前会话中保存下来,刷新页面数据依旧存在。但当页面关闭后, sessionStorage 中的数据就会被清空。
三者的异同
特 性 | Cook ie | loca lStorage | se ssionStorage |
---|---|---|---|
数 据 的 生 命 期 | 一般由服务器生成,可设置失效时间。如果在浏览器端生成Cookie,默认是关闭浏览器后失效 | 除非被清除,否则永久 保存 | 仅在当前会话下有效,关闭页面或浏览器后被 清除 |
存 放 数 据 大 小 | 4K左右 | 一般为5MB | 一般为5MB |
与 服 务 器 端 通 信 | 每次都会携带在HTTP头中,如果使用cookie保存过多数据会带来性能问题 | 仅在客户端(即浏览器)中保存,不参与和服务器的通信 | 仅在客户端(即浏览器)中保存,不参与和服务器的通信 |
易 用 性 | 需要程序员自己封装,源生的 Cookie接口不友好 | 源生接口可以接受,亦可再次封装来对Object和Array有更好的支持 | 源生接口可以接受,亦可再次封装来对Object和Array有更好的支持 |
9 . ES6 新特性
const和let、模板字符串、箭头函数、函数的参数默认值、对象和数组解构、 for...of 和for...in、 ES6中 的类
10. Let 与 var 与 const 的区别
var声明的变量会挂载在window上,而let和const声明的变量不会
var声明的变量存在变量提升, let和const不存在变量提升
同一作用域下var可以声明同名变量, let和const、不可以
Let和const声明会形成块级作用域
Let暂存死区
const一旦声明必须赋值,不能用null占位,声明后不能再修改,如果声明的是复合类型数据,可以 修改属性
11. 数组方法有哪些请简述
push() 从后面添加元素,返回值为添加完后的数组的长度
arr.pop() 从后面删除元素,只能是一个,返回值是删除的元素
arr.shift() 从前面删除元素,只能删除一个 返回值是删除的元素
arr.unshift() 从前面添加元素, 返回值是添加完后的数组的长度
arr.splice(i,n) 删除从i(索引值)开始之后的那个元素。返回值是删除的元素
arr.concat() 连接两个数组 返回值为连接后的新数组
str.split() 将字符串转化为数组
arr.sort() 将数组进行排序,返回值是排好的数组,默认是按照最左边的数字进行排序,不是按照数 字大小排序的
arr.reverse() 将数组反转,返回值是反转后的数组
arr.slice(start,end) 切去索引值start到索引值end的数组,不包含end索引的值,返回值是切出来 的数组
arr.forEach(callback) 遍历数组,无return 即使有return,也不会返回任何值,并且会影响原来的 数组
arr.map(callback) 映射数组(遍历数组),有return 返回一个新数组 。
arr.filter(callback) 过滤数组,返回一个满足要求的数组
12. 请掌握2种以上数组去重的方式
使用indexof ()方法
使用lastindexof ()方法 和indexof方法一样 indexof从头部开始匹配 lastindexof从尾部匹配 ES6的set结构 set不接受重复数据
使用sort方法先将原数组排序,然后与相邻的比较,如果不同则存入新数组
使用filiter和indexof方法
使用ES6 的set和扩展运算符
使用set和Array.from ()方法 array.from可以将set结构转成数组
用splice和双层循环
使用includes方法
13. 什么是面向对象请简述
面向对象是一种思想,是基于面向过程而言的,就是说面向对象是将功能等通过对象来实现,将功能封 装进对象之中,让对象去实现具体的细节;这种思想是将数据作为第一位,这是对数据一种优化,操作 起来更加的方便,简化了过程。
Js本身是没有class类型的,但是每个函数都有一个prototype属性, prototype指向一个对象,当函数作
为构造函数时, prototype就起到类似于class的作用
面向对象有三个特点:
封装(隐藏对象的属性和实现细节,对外提供公共访问方式)
继承(提高代码复用性,继承是多态的前提)
多态(是父类或接口定义的引用变量可以指向子类或具体实现类的实例对象)
14. 普通函数和构造函数的区别
构造函数也是一个普通函数,创建方式和普通函数一样,但是构造函数习惯上首字母大写
调用方式不一样,普通函数直接调用,构造函数要用关键字new来调用
调用时,构造函数内部会创建一个新对象,就是实例,普通函数不会创建新对象
构造函数内部的this指向实例,普通函数内部的this指向调用函数的对象(如果没有对象调用,默 认为window)
构造函数默认的返回值是创建的对象(也就是实例),普通函数的返回值由return语句决定
构造函数的函数名与类名相同
15. 请简述原型 / 原型链 / (原型)继承
什么是原型 ?
任何对象实例都有一个原型,也叫原型对象,这个原型对象由对象的内置属性proto指向它的构造函数 的prototype指向的对象,即任何对象都是由一个构造函数创建的,但是不是每一个对象都有 prototype,只有方法才有prototype。
什么是原型链?
原型链基本思想是利用原型让一个引用类型继承另一个引用类型的属性和方法。我们知道,每个构造函 数都有一个原型对象,每个原型对象都有一个指向构造函数的指针,而实例又包涵一个指向原型对象的 内部指针。
原型链的核心就是依赖对象的proto的指向,当自身不存在的属性时,就一层层的扒出创建对象的构造函 数,直至到Object时,就没有proto指向了。
因为proto实质找的是prototype,所以我们只要找这个链条上的构造函数的prototype。其中 Object.prototype是没有proto属性的,它==null。
每个构造函数都有一个原型对象,原型对象都包含一个指向构造函数的指针,而实例都包含指向原型对 象内部的指针。我们让原型对象(1)等于另一个原型对象的实例(2) ,
此时原型对象(2)将包含一个指向原型对象(1)的指针,
再让原型对象(2)的实例等于原型对象(3),如此层层递进就构成了实例和原型的链条,这就是原型 链的概念
什么是原型继承 ?
每个构造函数都有一个原型对象,原型对象都包含一个指向构造函数想指针(constructor),而实例对象 都包含一个指向原型对象的内部指针(proto)。如果让原型对象等于另一个原型对象的实例,此时的原型 对象将包含一个指向另一个原型的指针(proto),另一个原型也包含着一个指向另一个构造函数的指针 (constructor)。假如另一个原型又是另一个类型的实例 ……这就构成了实例与原型的链条。也叫原型链 原型继承是js的一种继承方式,原型链作为实现继承的主要方法,其基本思路是利用原型让一个引用类型 继承另一个引用类型的属性和方法,
原型继承:利用原型中的成员可以被和其相关的对象共享这一特性,可以实现继承,这种实现继承的方 式,就叫做原型继承 .
16 . Promise的理解
一、什么是Promise?我们用Promise来解决什么问题?
我们都知道, Promise是承诺的意思,承诺它过一段时间会给你一个结果。
Promise 是一种解决异步编程的方案,相比回调函数和事件更合理和更强大。
从语法上讲, promise是一个对象,从它可以获取异步操作的消息;
二、 promis e有三种状态:
pending 初始状态也叫等待状态
fulfiled成功状态
rejected失败状态
状态一旦改变,就不会再变。创造promise实例后,它会立即执行。
三、 Promis e的两个特点
Promise对象的状态不受外界影响
Promise的状态一旦改变,就不会再变,任何时候都可以得到这个结果,状态不可以逆,
四、 Promise的三个缺点
无法取消Promise,一旦新建它就会立即执行,无法中途取消
如果不设置回调函数, Promise内部抛出的错误,不会反映到外部
当处于pending (等待)状态时,无法得知目前进展到哪一个阶段,是刚刚开始还是即将完成
promise是用来解决两个问题的: