对 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 相关文章推荐
原来Jquery.load的方法可以一直load下去
Mar 28 Javascript
js DOM的学习笔记
Dec 22 Javascript
js 浏览器事件介绍
Mar 30 Javascript
javascript dom追加内容实现示例
Sep 21 Javascript
浅谈javascript 函数属性和方法
Jan 21 Javascript
JavaScript人脸识别技术及脸部识别JavaScript类库Tracking.js
Sep 14 Javascript
Vue.js进行查询操作的实例详解
Aug 25 Javascript
Vue 2.5 Level E 发布了: 新功能特性一览
Oct 24 Javascript
element-ui 限制日期选择的方法(datepicker)
May 16 Javascript
vue响应式系统之observe、watcher、dep的源码解析
Apr 09 Javascript
简单分析js中的this的原理
Aug 31 Javascript
vue实现虚拟列表功能的代码
Jul 28 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 array_push()数组函数:将一个或多个单元压入数组的末尾(入栈)
2011/07/12 PHP
Php图像处理类代码分享
2012/01/19 PHP
基于header的一些常用指令详解
2013/06/06 PHP
PHP中替换键名的简易方法示例详解
2014/01/07 PHP
在php和MySql中计算时间差的方法详解
2015/03/27 PHP
js获取当前select 元素值的代码
2010/04/19 Javascript
JS将所有对象s的属性复制给对象r(原生js+jquery)
2014/01/25 Javascript
JS实现仿腾讯微博无刷新删除微博效果代码
2015/10/16 Javascript
jquery插件bootstrapValidator数据验证详解
2016/11/09 Javascript
js Canvas绘制圆形时钟教程
2017/02/06 Javascript
深入理解JavaScript 参数按值传递
2017/05/24 Javascript
Vue.js学习笔记之常用模板语法详解
2017/07/25 Javascript
angularJs中json数据转换与本地存储的实例
2018/10/08 Javascript
tensorflow入门之训练简单的神经网络方法
2018/02/26 Python
pyspark 读取csv文件创建DataFrame的两种方法
2018/06/07 Python
详解Python 定时框架 Apscheduler原理及安装过程
2019/06/14 Python
calendar在python3时间中常用函数举例详解
2020/11/18 Python
python实现文件+参数发送request的实例代码
2021/01/05 Python
使用Python获取爱奇艺电视剧弹幕数据的示例代码
2021/01/12 Python
20行代码教你用python给证件照换底色的方法示例
2021/02/05 Python
西班牙多品牌鞋店连锁店:Krack
2018/11/30 全球购物
瑞典在互联网上最大的宠物商店:Animail
2020/10/31 全球购物
温泉秘密:Onsen Secret
2020/07/06 全球购物
C#基础面试题
2016/10/17 面试题
医院护理人员的自我评价分享
2013/10/04 职场文书
综合办公室主任职责
2013/12/16 职场文书
服装设计行业个人的自我评价
2013/12/20 职场文书
医药专业应届毕业生求职信范文
2014/01/01 职场文书
计算机专业职业生涯规划范文
2014/01/19 职场文书
婚假请假条格式及范文
2014/04/10 职场文书
个人工作主要事迹
2014/05/08 职场文书
2014年“四风”问题个人整改措施
2014/09/17 职场文书
党员群众路线自我剖析材料
2014/10/06 职场文书
公司行政主管岗位职责
2015/04/09 职场文书
工作态度检讨书范文
2015/05/06 职场文书
放牛班的春天观后感
2015/06/01 职场文书