对 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 相关文章推荐
[原创]网络复制内容时常用的正则+editplus
Nov 30 Javascript
情人节专属 纯js脚本1k大小的3D玫瑰效果
Feb 11 Javascript
jquery的相对父元素和相对文档定位示例代码
Aug 02 Javascript
javascript删除字符串最后一个字符
Jan 14 Javascript
基于javascript实现图片预加载
Jan 05 Javascript
学习JavaScript设计模式之模板方法模式
Jan 20 Javascript
详解JavaScript数组和字符串中去除重复值的方法
Mar 07 Javascript
js中json处理总结之JSON.parse
Oct 14 Javascript
Angular的$http与$location
Dec 26 Javascript
基于angular6.0实现的一个组件懒加载功能示例
Apr 12 Javascript
vue组件表单数据回显验证及提交的实例代码
Aug 30 Javascript
javascript this指向相关问题及改变方法
Nov 19 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
索尼SONY ICF-7600A(W)电路分析
2021/03/01 无线电
php中突破基于HTTP_REFERER的防盗链措施(stream_context_create)
2011/03/29 PHP
网页的标准,IMG不支持onload标签怎么办
2006/06/29 Javascript
弹出广告特效(一个IP只弹出一次)的代码
2007/07/27 Javascript
JavaScript开发规范要求(规范化代码)
2010/08/16 Javascript
iframe的父子窗口之间的对象相互调用基本用法
2013/09/03 Javascript
javascript中定义私有方法说明(private method)
2014/01/27 Javascript
jquery提交form表单简单示例分享
2014/03/03 Javascript
Javascript添加监听与删除监听用法详解
2014/12/19 Javascript
15款jQuery分布引导插件分享
2015/02/04 Javascript
jQuery Ajax使用FormData对象上传文件的方法
2016/09/07 Javascript
Angular 输入框实现自定义验证功能
2017/02/19 Javascript
angularjs过滤器--filter与ng-repeat配合有奇效
2017/04/20 Javascript
Javascript实现基本运算器
2017/07/15 Javascript
jQuery实现验证表单密码一致性及正则表达式验证邮箱、手机号的方法
2017/12/05 jQuery
JS实现的文件拖拽上传功能示例
2018/05/21 Javascript
详解JavaScript的数据类型以及数据类型的转换
2019/04/20 Javascript
js使用文件流下载csv文件的实现方法
2019/07/15 Javascript
详解vue-router 动态路由下子页面多页共活的解决方案
2019/12/22 Javascript
js+css实现全屏侧边栏
2020/06/16 Javascript
Python使用ctypes调用C/C++的方法
2019/01/29 Python
详解Python3之数据指纹MD5校验与对比
2019/06/11 Python
python中字符串数组逆序排列方法总结
2019/06/23 Python
python求质数列表的例子
2019/11/24 Python
Python hashlib加密模块常用方法解析
2019/12/18 Python
python可视化text()函数使用详解
2020/02/11 Python
python 基于opencv操作摄像头
2020/12/24 Python
森海塞尔美国官网:Sennheiser耳机与耳麦
2017/07/19 全球购物
Under Armour瑞典官方网站:美国高端运动科技品牌
2018/11/21 全球购物
日语专业毕业生求职信
2013/12/04 职场文书
表彰先进集体通报
2014/01/12 职场文书
新学期红领巾广播稿
2014/10/04 职场文书
党员带头倡议书
2015/04/29 职场文书
信用卡催款律师函
2015/05/27 职场文书
初一军训感言
2015/08/01 职场文书
机械原理课程设计心得体会
2016/01/15 职场文书