对 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 流畅动画实现原理
Sep 08 Javascript
JavaScript 学习笔记(七)字符串的连接
Dec 31 Javascript
一个很有趣3D球状标签云兼容IE8
Aug 22 Javascript
jQuery实现响应浏览器缩放大小并改变背景颜色
Oct 31 Javascript
AngularJS基础学习笔记之指令
May 10 Javascript
jQuery通过改变input的type属性实现密码显示隐藏切换功能
Feb 08 Javascript
js实现文字跑马灯效果
Feb 23 Javascript
node.js 抓取代理ip实例代码
Apr 30 Javascript
详解Vue中状态管理Vuex
May 11 Javascript
微信小程序实现选项卡功能
Jun 19 Javascript
AngularJS实现的生成随机数与猜数字大小功能示例
Dec 25 Javascript
关于angular浏览器兼容性问题的解决方案
Jul 26 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
ThinkPHP实现带验证码的文件上传功能实例
2014/11/01 PHP
Thinkphp+smarty+uploadify实现无刷新上传
2015/07/30 PHP
PHP实现的简单留言板功能示例【基于thinkPHP框架】
2018/12/07 PHP
JavaScript 函数调用规则
2009/09/14 Javascript
js 获取子节点函数 (兼容FF与IE)
2010/04/18 Javascript
jQuery之折叠面板的深入解析
2013/06/19 Javascript
jQuery级联操作绑定事件实例
2014/09/02 Javascript
详解js闭包
2014/09/02 Javascript
JavaScript编程中容易出BUG的几点小知识
2015/01/31 Javascript
jQuery实现指定内容滚动同时左侧或其它地方不滚动的方法
2015/08/08 Javascript
jQuery插件之Tocify动态节点目录菜单生成器附源码下载
2016/01/08 Javascript
详谈js中window.location.search的用法和作用
2017/02/13 Javascript
webpack使用 babel-loader 转换 ES6代码示例
2017/08/21 Javascript
ReactNative之FlatList的具体使用方法
2017/11/29 Javascript
jQuery中ajax获取数据赋值给页面的实例
2017/12/31 jQuery
Vue中使用方法、计算属性或观察者的方法实例详解
2018/10/31 Javascript
用node开发并发布一个cli工具的方法步骤
2019/01/03 Javascript
浅谈JavaScript 代码简洁之道
2019/01/09 Javascript
vue全局自定义指令-元素拖拽的实现代码
2019/04/14 Javascript
微信小程序 扭蛋抽奖机css3动画实现详解
2019/07/19 Javascript
你知道JavaScript Symbol类型怎么用吗
2020/01/08 Javascript
bootstrap实现嵌套模态框的实例代码
2020/01/10 Javascript
js实现点赞效果
2020/03/16 Javascript
通过angular CDK实现页面元素拖放的步骤详解
2020/07/01 Javascript
Node.js 中如何收集和解析命令行参数
2021/01/08 Javascript
python 域名分析工具实现代码
2009/07/15 Python
编程语言Python的发展史
2014/09/26 Python
Python实现简单文本字符串处理的方法
2018/01/22 Python
对pandas将dataframe中某列按照条件赋值的实例讲解
2018/11/29 Python
对python opencv 添加文字 cv2.putText 的各参数介绍
2018/12/05 Python
python读取ini配置文件过程示范
2019/12/23 Python
Python打开文件、文件读写操作、with方式、文件常用函数实例分析
2020/01/07 Python
HTML5 Geolocation API的正确使用方法
2018/12/04 HTML / CSS
什么是.net
2015/08/03 面试题
解除租房协议书
2014/12/03 职场文书
2014年青年志愿者工作总结
2014/12/09 职场文书