对 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 相关文章推荐
解析使用js判断只能输入数字、字母等验证的方法(总结)
May 14 Javascript
JS 实现点击a标签的时候让其背景更换
Oct 15 Javascript
使用Bootstrap框架制作查询页面的界面实例代码
May 27 Javascript
把普通对象转换成json格式的对象的简单实例
Jul 04 Javascript
JS遍历ul下的li点击弹出li的索引的实现方法
Sep 19 Javascript
3种不同的ContextMenu右键菜单实现代码
Nov 03 Javascript
JavaScript 过滤关键字
Mar 20 Javascript
jQuery实现的页面遮罩层功能示例【测试可用】
Oct 14 jQuery
jQuery+ajax读取json数据并按照价格排序示例
Mar 28 jQuery
用vue快速开发app的脚手架工具
Jun 11 Javascript
vue中promise的使用及异步请求数据的方法
Nov 08 Javascript
微信小程序停止其他视频播放当前视频的实例代码
Dec 25 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无限分类且支持输出树状图的详细介绍
2013/06/19 PHP
CI框架文件上传类及图像处理类用法分析
2016/05/18 PHP
Yii框架表单提交验证功能分析
2017/01/07 PHP
thinkphp5.0自定义验证规则使用方法
2017/11/16 PHP
Laravel框架验证码类用法实例分析
2019/09/11 PHP
原生js拖拽(第一课 未兼容)拖拽思路
2013/03/29 Javascript
JSONP获取Twitter和Facebook文章数的具体步骤
2014/02/24 Javascript
JS中自定义定时器让它在某一时刻执行
2014/09/02 Javascript
JavaScript三元运算符的多种使用技巧
2015/04/16 Javascript
基于JS实现的倒计时程序实例
2015/07/24 Javascript
推荐阅读的js快速判断IE浏览器(兼容IE10与IE11)
2015/12/13 Javascript
jQuery 3 中的新增功能汇总介绍
2016/06/12 Javascript
JS中的数组转变成JSON格式字符串的方法
2017/05/09 Javascript
Angularjs的$http异步删除数据详解及实例
2017/07/27 Javascript
浅谈Express异步进化史
2017/09/09 Javascript
使用Dropzone.js上传的示例代码
2017/10/10 Javascript
微信小程序自定义toast实现方法详解【附demo源码下载】
2017/11/28 Javascript
微信小程序基于slider组件动态修改标签透明度的方法示例
2017/12/04 Javascript
手动用webpack搭建第一个ReactApp的示例
2018/04/11 Javascript
mongodb初始化并使用node.js实现mongodb操作封装方法
2019/04/02 Javascript
解决vue props传Array/Object类型值,子组件报错的情况
2020/11/07 Javascript
vue 数据操作相关总结
2020/12/17 Vue.js
在Python下使用Txt2Html实现网页过滤代理的教程
2015/04/11 Python
python中使用序列的方法
2015/08/03 Python
日常整理python执行系统命令的常见方法(全)
2015/10/22 Python
使用python将时间转换为指定的格式方法
2018/11/12 Python
详解如何在Apache中运行Python WSGI应用
2019/01/02 Python
通过Python扫描代码关键字并进行预警的实现方法
2020/05/24 Python
Pytorch mask-rcnn 实现细节分享
2020/06/24 Python
解决python中0x80072ee2错误的方法
2020/07/19 Python
以色列的身体护理及家居香薰品牌:Sabon NYC
2018/02/23 全球购物
台湾专柜女包:KINAZ
2019/12/26 全球购物
不遵守课堂纪律的检讨书
2014/09/24 职场文书
毕业设计答辩开场白
2015/05/29 职场文书
2016年七夕情人节宣传语
2015/11/25 职场文书
创业计划书之奶茶店开店方案范本!
2019/08/06 职场文书