对 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 相关文章推荐
Google韩国首页图标动画效果
Aug 26 Javascript
多个表单中如何获得这个文件上传的网址实现js代码
Mar 25 Javascript
js 文本滚动效果的实例代码
Aug 17 Javascript
js 页面元素的几个用法总结
Nov 18 Javascript
javasript实现密码的隐藏与显示
May 08 Javascript
AngularJS入门教程引导程序
Aug 18 Javascript
AngularJS 与Bootstrap实现表格分页实例代码
Oct 14 Javascript
利用JS判断鼠标移入元素的方向
Dec 11 Javascript
Node.js和Express简单入门介绍
Mar 24 Javascript
Angular动画实现的2种方式以及添加购物车动画实例代码
Aug 09 Javascript
vue 实现通过vuex 存储值 在不同界面使用
Nov 11 Javascript
Vue组件跨层级获取组件操作
Jul 27 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
这部好评如潮的动漫 知名梗频出 但是画风劝退很多人
2020/03/08 日漫
PHP实现递归复制整个文件夹的类实例
2015/08/03 PHP
thinkphp5 URL和路由的功能详解与实例
2017/12/26 PHP
phpstudy2018升级MySQL5.5为5.7教程(图文)
2018/10/24 PHP
js 新浪的一个图片播放图片轮换效果代码
2008/07/15 Javascript
js操作二级联动实现代码
2010/07/27 Javascript
js 页面关闭前的出现提示的实现代码
2011/05/25 Javascript
jquery对table中各数据的增加、保存、删除操作示例
2014/05/14 Javascript
用NODE.JS中的流编写工具是要注意的事项
2016/03/01 Javascript
Fullpage.js固定导航栏-实现定位导航栏
2016/03/17 Javascript
javascript面向对象程序设计高级特性经典教程(值得收藏)
2016/05/19 Javascript
JS获取checkbox的个数简单实例
2016/08/19 Javascript
Angular 4依赖注入学习教程之InjectToken的使用(八)
2017/06/04 Javascript
vue使用element-ui的el-input监听不了回车事件的解决方法
2018/01/12 Javascript
详解如何在微信小程序中愉快地使用sass
2018/07/30 Javascript
原生JS实现随机点名项目的实例代码
2019/04/30 Javascript
Python正则表达式匹配HTML页面编码
2015/04/08 Python
浅谈Python中函数的参数传递
2016/06/21 Python
使用python爬虫实现网络股票信息爬取的demo
2018/01/05 Python
PyQt5 pyqt多线程操作入门
2018/05/05 Python
python3文件复制、延迟文件复制任务的实现方法
2019/09/02 Python
通过cmd进入python的步骤
2020/06/16 Python
如何使用 Python 读取文件和照片的创建日期
2020/09/05 Python
记录一下scrapy中settings的一些配置小结
2020/09/28 Python
pycharm Tab键设置成4个空格的操作
2021/02/26 Python
浅析rem和em和px vh vw和% 移动端长度单位
2016/04/28 HTML / CSS
俄罗斯EPL钻石珠宝店:ЭПЛ
2019/10/22 全球购物
日本酒店、民宿、温泉旅馆、当地旅行团中文预订:e路东瀛
2019/12/09 全球购物
意大利和国际奢侈品牌购物网站:Suitnegozi.com
2021/01/15 全球购物
Java中的异常处理机制的简单原理和应用
2013/04/27 面试题
优秀驾驶员先进事迹材料
2014/05/04 职场文书
奉献演讲稿范文
2014/05/21 职场文书
节能标语大全
2014/06/21 职场文书
《狮子和鹿》教学反思
2016/02/16 职场文书
mysql定时自动备份数据库的方法步骤
2021/07/07 MySQL
JVM钩子函数的使用场景详解
2021/08/23 Java/Android