对 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 相关文章推荐
Ajax::prototype 源码解读
Jan 22 Javascript
Javascript 获取链接(url)参数的方法[正则与截取字符串]
Feb 09 Javascript
URL地址中的#符号使用说明
Feb 12 Javascript
jquery禁用右键示例
Apr 28 Javascript
jQery使网页在显示器上居中显示适用于任何分辨率
Jun 09 Javascript
node.js中的fs.close方法使用说明
Dec 17 Javascript
理解javascript正则表达式
Mar 08 Javascript
Angular在一个页面中使用两个ng-app的方法
Feb 20 Javascript
JavaScript实现设置默认日期范围为最近40天的方法分析
Jul 12 Javascript
详解Angular中通过$location获取地址栏的参数
Aug 02 Javascript
通过JavaScript下载文件到本地的方法(单文件)
Mar 17 Javascript
在Vue中创建可重用的 Transition的方法
Jun 02 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
解决dede生成静态页和动态页转换的一些问题,及火车采集入库生成动态的办法
2007/03/29 PHP
PHP 输出URL的快捷方式示例代码
2013/09/22 PHP
PHP的mysqli_query参数MYSQLI_STORE_RESULT和MYSQLI_USE_RESULT的区别
2014/09/29 PHP
PHP 在数组中搜索给定的简单实例 array_search 函数
2016/06/13 PHP
PHPMailer发送邮件
2016/12/28 PHP
PHP中类与对象功能、用法实例解读
2020/03/27 PHP
破除一些网站复制、右键限制
2006/11/04 Javascript
jQuery 定时局部刷新(setInterval)
2010/11/19 Javascript
使用GruntJS构建Web程序之合并压缩篇
2014/06/06 Javascript
jQuery拖动元素并对元素进行重新排序
2015/12/30 Javascript
使用Bootstrap Tabs选项卡Ajax加载数据实现
2016/12/23 Javascript
浅谈js算法和流程控制
2016/12/29 Javascript
完美解决浏览器跨域的几种方法(汇总)
2017/05/08 Javascript
JavaScript你不知道的一些数组方法
2017/08/18 Javascript
打字效果动画的4种实现方法(超简单)
2017/10/18 Javascript
基于React+Redux的SSR实现方法
2018/07/03 Javascript
vue watch深度监听对象实现数据联动效果
2018/08/16 Javascript
vue input输入框关键字筛选检索列表数据展示
2020/10/26 Javascript
微信公众号获取用户地理位置并列出附近的门店的示例代码
2019/07/25 Javascript
Vue实现点击按钮复制文本内容的例子
2019/11/09 Javascript
[01:35]2014DOTA2西雅图邀请赛 专访狐狸妈青春献给刀塔
2014/07/08 DOTA
使用python进行波形及频谱绘制的方法
2019/06/17 Python
Python程序打包工具py2exe和PyInstaller详解
2019/06/28 Python
Django后端接收嵌套Json数据及解析详解
2019/07/17 Python
Django之提交表单与前后端交互的方法
2019/07/19 Python
python时间与Unix时间戳相互转换方法详解
2020/02/13 Python
python 字典item与iteritems的区别详解
2020/04/25 Python
Bluebella德国官网:英国性感内衣和睡衣品牌
2019/11/08 全球购物
大三学生入党思想汇报
2014/01/02 职场文书
教师开学感言
2014/02/14 职场文书
初中升旗仪式演讲稿
2014/05/08 职场文书
2014年教师节演讲稿范文
2014/09/10 职场文书
搞笑婚前保证书
2015/02/28 职场文书
简历自荐信范文
2015/03/09 职场文书
2019年大学生职业生涯规划书最新范文
2019/03/25 职场文书
详解vue中v-for的key唯一性
2021/05/15 Vue.js