-
deferred: Exclude jQuery. Deferred. This also removes jQuery. Callbacks. Note that modules that depend on jQuery. Deferred(AJAX, effects, core/ready) will not be removed and will still expect jQuery. Deferred to be there. Include your own jQuery. Deferred implementation or exclude those modules as well (
grunt custom: -deferred, -ajax, -effects, -core/ready
). -
exports/global: Exclude the attachment of global jQuery variables ($ and jQuery) to the window.
-
exports/amd: Exclude the AMD definition.
jQuery 3.x 有哪些新特性
=================
目前所能看到的最新版是 2017年3月21日 发布的 jQuery-3.2.1 .
jQuery 3 运行在 Strict Mode 下
大多数支持jQuery 3的浏览器都支持strict mode,而在本次更新中对此进行了规定。
虽然jQuery 3是写在strict mode中的,但是你需要了解的是你的代码并不需要运行在strict mode中,因此如果你想要把以前的代码迁移到jQuery 3,你不需要对已存在的jQuery代码进行重写。Strict和non-strict mode的JavaScript代码可以和谐共存。
这里有一些例外:某些版本的ASP.NET,因为strict mode的缘故,无法与jQuery 3兼容,如果你的代码涉及到了ASP.NET,你可以查看关于 strict mode的细节 。
for…of
在 jQuery 3.x 中,我们可以用 for...of
循环语句来迭代一个 jQuery 集合中的所有 DOM 元素。这种新的迭代方法是 ECMAScript 2015 规范中的一部分。这个方法可以对 “可迭代对象”(比如 Array
、Map
、Set
等)进行循环。
当使用这种新的迭代方法时,你在循环体内每次拿到的值并不是一个 jQuery 对象,而是一个 DOM 元素(这一点跟 .each()
方法类似)。当你在对一个 jQuery 集合进行操作时,这个新的迭代方法可以少许改善你的代码。
为了搞清楚这种迭代方法到底是怎么工作的,我们来假设一个场景——你需要给页面中的每个 input
元素分配一个 ID。在 jQuery 3 之前,你可能会这样写:
var $inputs = $(‘input’)
for(var i = 0; i < $inputs.length; i++) {
$inputs[i].id = ‘input-’ + i
}
而在 jQuery 3 中,你就可以这样写了:
var $inputs = $(‘input’)
var i = 0
for(var input of $inputs) {
input.id = ‘input-’ + i++
}
jQuery 有一个
.each()
方法,也可以
$.get()
和 $.post()
函数的新签名
jQuery 3 为 $.get()
和 $.post()
这两个工具函数增加了新签名,从而使得它们和 $.ajax()
的接口风格保持一致。新签名是这样的:
$.get([settings])
$.post([settings])
$.get()
和 $.post()
的参数对象与传给 $.ajax()
的参数相比,唯一的区别就是前者的 method
属性总是会被忽略。原因其实也很简单,$.get()
和 $.post()
本身就已经预设了发起 Ajax 请求的 HTTP 方法了(显然 $.get()
就是 GET,而 $.post()
就是 POST)。
假设有以下一段代码:
$.get({
url: ‘/use/info’,
method: ‘POST’ // 这个属性将被忽略
})
不管我们把 method
属性写成什么,这个请求总是会以 GET 的方式发出去。
采用 requestAnimationFrame()
来实现动画
所有现代浏览器(包括 IE10 及以上)都是支持 requestAnimationFrame 的。jQuery 3 将会在内部采用这个 API 来实现动画,以便达到更流畅、更省资源的动画效果。
新的 API 只用于支持它的浏览器,对于那些更老的浏览器(如 IE9)jQuery 使用先前的 API 来作为显示动画的后备方案。
对包含特殊含义的字符串提供转义的新方法
新的 jQuery.escapeSelector()
提供了对在 CSS 中存在特殊含义的字符串或字符进行转义的方法,该方法可使这些字符串或字符能够继续用于 jQuery 选择器中,而无需对那些无法进行正确理解的 JavaScript 解释器进行转义。
这个 示例 可以让你更好的了解这个全新的方法:
举个例子,页面中某个 ID 为 “abc.def” 的元素由于选择器将其解析为 ID为“abc”且包含一个名为“def”的类的对象, 而无法被 $( "#abc.def" )
选定。但是它可以由 $( "#" + $.escapeSelector( "abc.def" ) )
来进行选定。
我无法确定发生中情况的频率,但是假如你碰到过这种类似的情况,这无疑给了你一个解决该问题的简单方法。
unwrap()
方法
jQuery 3 为 unwrap()
方法增加了一个可选的 selector 参数。这个方法的新签名是这样的:
unwrap([selector])
有了这个新特性,你就可以给这个方法传入一个字符串,其内容为选择符表达式,用它来对当前元素的父元素进行匹配。如果匹配,则父元素这一层将被剥除;如果不匹配,则不进行任何操作。
类操作方法支持 SVG
不幸的是,jQuery 3现在还无法完整的支持SVG,但是对于 操作CSS类名称 的jQuery方法,如 .addClass() 和 .hasClass() 现在可以将SVG文档作为目标。这意味着你可以修改(添加、删除、切换)或者查找SVG(可缩放矢量图形)下的jQuery类,然后使用CSS的类样式。( 相关阅读:Styling Scalable Vector Graphic (SVG) with CSS )
对于防止 XSS 攻击的额外保护
jQuery 3 增加一个额外的安全层用户用于防备跨站点脚本(XSS)攻击,它需要开发者指定 $.ajax()
和 $.get()
方法中的选项为 dataType: “script” 。
换言之,如果你想要执行跨站点的脚本请求,你必须在这些方法中做出这样的声明。
新的改变对于当“远程站点传递非脚本内容之后又提供有恶意脚本的服务内容”的情况是非常有效的。这个变化不会影响 $.getScript()
方法,因为它明确的设置了 dataType: “script” 选项。
jQuery 3 中有变更的特性
================
:visible
和 :hidden
jQuery 3 将会修改 :visible
和 :hidden
过滤器的含义。只要元素具有任何布局盒,哪怕宽高为零,也会被认为是 :visible
。举个例子,br
元素和不包含内容的行内元素现在都会被 :visible
这个过滤器选中。
因此,如果你的页面中包含如下的结构:
然后运行以下语句:
console.log($(‘body :visible’).length)
在 jQuery 1.x 和 2.x 中,你得到的结果会是 0;但在 jQuery 3 中,你会得到 2。
data()
方法
另一个重要的变化时跟 data()
方法有关的。现在它的行为已经变得跟 Dataset API 规范 一致了。jQuery 3 将会把所有属性键名转换成驼峰形式。我们来详细看一下,以如下元素为例:
当我们在用 jQuery 3 以前的版本时,如果运行如下代码:
var $elem = $(‘#container’)
$elem.data({
‘my-property’: ‘hello’
})
console.log(#elem.data())
将会在控制台得到如下结果:
{my-property: ‘hello’}
而在 jQuery 3 中,我们将会得到如下结果:
{myProperty: ‘hello’}
请注意,在 jQuery 3 中,属性名已经变成了驼峰形式,横杠已经被去除了;而在以前的版本中,属性名会保持全小写,并原样保留横杠。
Deferred 对象
jQuery 3 还改变了 Deferred
对象的行为。 Deferred
对象可以说是 Promise
对象的前身之一,它实现了对 Promise/A+ 协议 的兼容。这个对象以及它的历史都相当有意思。
在 jQuery 1.x 和 2.x 中,传给 Deferred
的回调函数内如果出现未捕获的异常,会立即中断程序的执行(即静默失败,其实 jQuery 绝大多数回调函数的行为都是这样的)。而原生的 Promise
对象并非如此,它会抛出异常,并不断向上冒泡,直至到达 window.onerror
(通常冒泡的终点是这里)。如果你没有定义一个函数来处理这个错误事件的话(通常我们都不会这么做),那这个异常的信息将会被显示出来,此时程序的执行才会停止。
jQuery 3 将会遵循原生 Promise
对象的模式。因此,回调内产生的异常将会导致失败状态(rejection),并触发失败回调。一旦失败回调执行完毕,整个进程就将继续推进,后续的成功回调将被执行。
为了让你更好的理解这个差异,让我们来看一个小例子。比如我们有如下代码:
var deferred = $.Deferred();
deferred
.then(function() {
throw new Error(‘An error’);
})
.then(
function() {
console.log(‘Success 1’);
},
function() {
console.log(‘Failure 1’);
}
)
.then(
function() {
console.log(‘Success 2’);
},
function() {
console.log(‘Failure 2’);
}
);
deferred.resolve();
在 jQuery 1.x 和 2.x 中,只有第一个函数(也就是抛出错误的那个函数)会被执行到。此外,由于我们没有为 window.onerror
定义任何事件处理函数,控制台将会输出 “Uncaught Error: An error”,而且程序的执行将中止。
而在 jQuery 3 中,整个行为是完全不同的。你将在控制台中看到 “Failure 1” 和 “Success 2” 两条消息。那个异常将会被第一个失败回调处理,并且,一旦异常得到处理,那么后续的成功回调将被调用。
SVG 文档
没有哪一个 jQuery 版本(包括 jQuery 3)曾官方宣称支持 SVG 文档。不过事实上有很多方法是可以奏效的,此外还有一些方法在以前是不行的(比如操作类名的那些方法),但它们在 jQuery 3 中也得到了更新。因此,在 jQuery 3 中,你应该可以放心使用诸如 addClass()
和 hasClass()
这样的方法来操作 SVG 文档了。
jQuery 3 中废弃,移除的方法和属性
=====================
废弃 bind()
、unbind()
、delegate()
和 undelegate()
方法
jQuery 在很久以前就引入了 on()
方法,它提供了一个统一的接口,用以取代 bind()
、delegate()
和 live()
等方法。与此同时,jQuery 还引入了 off()
这个方法来取代 unbind()
、undelegated()
和 die()
等方法。从那时起,bind()
、delegate()
、unbind()
和 undelegate()
就已经不再推荐使用了,但它们还是一直存在着。
jQuery 3 终于开始将这些方法标记为 “废弃” 了,并计划在未来的某个版本(很可能是 jQuery 4)中将它们彻底移除。因此,请在你的项目中统一使用 on()
和 off()
方法,这样你就不用担心未来版本的变更了。
ES6
-
列举常用的ES6特性:
-
箭头函数需要注意哪些地方?
-
let、const、var
-
拓展:var方式定义的变量有什么样的bug?
-
Set数据结构
-
拓展:数组去重的方法
-
箭头函数this的指向。
-
手写ES6 class继承。
微信小程序
-
简单描述一下微信小程序的相关文件类型?
-
你是怎么封装微信小程序的数据请求?
-
有哪些参数传值的方法?
-
你使用过哪些方法,来提高微信小程序的应用速度?
-
小程序和原生App哪个好?
-
简述微信小程序原理?
-
分析微信小程序的优劣势
-
怎么解决小程序的异步请求问题?
其他知识点面试
-
webpack的原理
-
webpack的loader和plugin的区别?
-
怎么使用webpack对项目进行优化?
-
防抖、节流
-
浏览器的缓存机制
-
描述一下二叉树, 并说明二叉树的几种遍历方式?
-
项目类问题
-
笔试编程题:
最后
技术栈比较搭,基本用过的东西都是一模一样的。快手终面喜欢问智力题,校招也是终面问智力题,大家要准备一下一些经典智力题。如果排列组合、概率论这些基础忘了,建议回去补一下。