对 jQuery 中 data 方法的误解分析


Posted in Javascript onJune 18, 2014

今天 谢亮 兄弟和我讨论一个东西的时候,谈到了性能,他用的是 attr 操作自定义属性 data-uid,我说用 data 好,因为是 dataset 实现,然后他去翻了下 jQuery 源码和我说,没有发现这个东西,我就纳闷了。于是我去仔细读了下 data 方法的源码,才发现我一直误会了,再此,向之前问我 data 方法的群友道歉,我 "骗" 了你们,你们来打我吧。

今天我就重新解释下 data 方法,先看下 jQuery 1.11.0 的手册里肿么说的吧,请移步至http://shouce.3water.com/jquery/data.html、
用法这里说的很清楚了,但是内部是怎么实现的呢? 戳我看源码  (看不懂没关系,我会简单分析下他的流程)

其实是这样的,当我们执行例如这样的语句时 $("#id").data("test"); (简化后的过程) 
第一步: jQuery 会获取到 $("#id") 元素,对吧、 
第二步: 执行到 data方法 的时候,他会通过 attributes 取我们要的对应值。 
第三步: 返回结果给我们,然后 jQuery 把值缓存到内部对象里 
第一次取的时候,我们可以得到的 undefined,字符串,数字或者解析后的json。 
 
那有人会说这个和 attr 有什么区别呢? 
当我们第二次执行 $("#id").data("test"); 的时候: 
第一步: jQuery 会获取到 $("#id") 元素,和上面一样。 
第二步: 执行到 data方法 的时候,从 jQuery 的缓存中取值 
第三步: 返回结果给我们 
 
发现第二步不同了,对吧,为什么不是从 attributes 取值,而是从缓存中取呢? 
缓存其实是js的对象,简单说就类似 var cache = {}; jQuery 在第一次取值之后就会保存到这个缓存对象中,这样我们再次操作的时候就非常快了、 
往往性能的损耗都是在 dom 操作上,所以避免重复操作 dom 是非常必要的。 
 
到这,也能看出他和 attr 最大的区别了,比如 <div id="id" data-test="hehe"></div> 
$("#id").data("test", "123"); 执行后依然是 data-test="hehe"
$("#id").attr("data-test", "123"); 执行后会是 data-test="123"
 
那么我们要给一个元素赋值值,或者对象的时候他们有什么区别呢?比如 <div id="id" data-test="hehe"></div> 
$("#id").data("test", {str: "hehe"}); 会把 {str: "hehe"} 赋值给 缓存,元素节点上依然是 data-test="hehe"
$("#id").attr("data-test", {str: "hehe"}); 执行后会是 data-test="[object Object]"
这个应该也有不少人遇到,至少群里有不少人问过这个问题。

其实我之前也没骗你们,自定义属性没必要老是 attr 他,data 是 jQuery 赋予我们的一把瑞士军刀,非常锋利的。

好了,我是懒人,懒的配图,已经写了不少字了,如果有什么说的不对的地方,你们来打我吧

Javascript 相关文章推荐
javascript Object与Function使用
Jan 11 Javascript
jQuery编写widget的一些技巧分享
Oct 28 Javascript
腾讯UED 漂亮的提示信息效果代码
Sep 12 Javascript
Javascript 垃圾收集机制介绍理解
May 14 Javascript
利用JS进行图片的切换即特效展示图片
Dec 03 Javascript
javascript操作table(insertRow,deleteRow,insertCell,deleteCell方法详解)
Dec 16 Javascript
node.js中的定时器nextTick()和setImmediate()区别分析
Nov 26 Javascript
浅谈Node模块系统及其模式
Nov 17 Javascript
AngularJS基于http请求实现下载php生成的excel文件功能示例
Jan 23 Javascript
vue 页面加载进度条组件实例
Feb 05 Javascript
vue+php实现的微博留言功能示例
Mar 16 Javascript
vue组件 keep-alive 和 transition 使用详解
Oct 11 Javascript
浅谈 jQuery 事件源码定位问题
Jun 18 #Javascript
js调试系列 源码定位与调试[基础篇]
Jun 18 #Javascript
js调试系列 控制台命令行API使用方法
Jun 18 #Javascript
js调试系列 初识控制台
Jun 18 #Javascript
ext前台接收action传过来的json数据示例
Jun 17 #Javascript
Ext GridPanel加载完数据后进行操作示例代码
Jun 17 #Javascript
ext中store.load跟store.reload的区别示例介绍
Jun 17 #Javascript
You might like
php中$_REQUEST、$_POST、$_GET的区别和联系小结
2011/11/23 PHP
PHP中的命名空间相关概念浅析
2015/01/22 PHP
javascript this用法小结
2008/12/19 Javascript
围观tangram js库
2010/12/28 Javascript
用jquery等比例控制图片宽高的具体实现
2014/01/28 Javascript
Javascript的setTimeout()使用闭包特性时需要注意的问题
2014/09/23 Javascript
javascript 事件处理示例分享
2014/12/31 Javascript
jQuery中DOM树操作之使用反向插入方法实例分析
2015/01/23 Javascript
简介JavaScript中toUpperCase()方法的使用
2015/06/06 Javascript
用svg制作富有动态的tooltip
2015/07/17 Javascript
浅谈JavaScript的Polymer框架中的事件绑定
2015/07/29 Javascript
百度地图API之本地搜索与范围搜索
2015/07/30 Javascript
jQuery插件FusionCharts实现的MSBar3D图效果示例【附demo源码】
2017/03/23 jQuery
清空元素html(&quot;&quot;) innerHTML=&quot;&quot; 与 empty()的区别和应用(推荐)
2017/08/14 Javascript
JS中创建自定义类型的常用模式总结【工厂模式,构造函数模式,原型模式,动态原型模式等】
2019/01/19 Javascript
微信小程序防止多次点击跳转(函数节流)
2019/09/19 Javascript
vue中在vuex的actions中请求数据实例
2019/11/08 Javascript
Vue中qs插件的使用详解
2020/02/07 Javascript
详解vue3.0 diff算法的使用(超详细)
2020/07/01 Javascript
python实现类的静态变量用法实例
2015/05/08 Python
Python正则简单实例分析
2017/03/21 Python
Python图片裁剪实例代码(如头像裁剪)
2017/06/21 Python
Python函数的定义方式与函数参数问题实例分析
2019/12/26 Python
使用anaconda安装pytorch的实现步骤
2020/09/03 Python
CSS3绘制不规则图形的一些方法示例
2015/11/07 HTML / CSS
Kangol帽子官网:坎戈尔袋鼠
2018/09/26 全球购物
Amara德国:家居饰品、设计师品牌和豪华礼品
2019/05/20 全球购物
英国电子专家:maplin
2019/09/04 全球购物
《学棋》教后反思
2014/04/14 职场文书
说明书格式及范文
2014/05/07 职场文书
大学生就业自我推荐信
2014/05/10 职场文书
大学生个人求职信例文
2014/07/07 职场文书
关于环保的活动方案
2014/08/25 职场文书
趣味运动会新闻稿
2015/07/17 职场文书
离职告别感言
2015/08/04 职场文书
新店开业策划方案怎么书写?
2019/07/05 职场文书