对 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 相关文章推荐
在表单提交前进行验证的几种方式整理
Jul 31 Javascript
jquery实现表格本地排序的方法
Mar 11 Javascript
vue,angular,avalon这三种MVVM框架优缺点
Apr 27 Javascript
jQuery调用Webservice传递json数组的方法
Aug 06 Javascript
如何判断出一个js对象是否一个dom对象
Nov 24 Javascript
js 单引号替换成双引号,双引号替换成单引号的实现方法
Feb 16 Javascript
基于jquery实现二级联动效果
Mar 30 jQuery
Node.js如何使用Diffie-Hellman密钥交换算法详解
Sep 05 Javascript
Angularjs自定义指令实现分页插件(DEMO)
Sep 16 Javascript
JavaScript实现的简单加密解密操作示例
Jun 01 Javascript
vue路由跳转传参数的方法
May 06 Javascript
解决使用layui对select append元素无效或者未及时更新的问题
Sep 18 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 urlencode()与urldecode()函数字符编码原理详解
2011/12/06 PHP
php简单实现无限分类树形列表的方法
2015/03/27 PHP
php遍历解析xml字符串的方法
2016/05/05 PHP
PHP 数组遍历foreach语法结构及实例
2016/06/13 PHP
yii2-GridView在开发中常用的功能及技巧总结
2017/01/07 PHP
PHP 断点续传实例详解
2017/11/11 PHP
ThinkPHP3.2框架自定义配置和加载用法示例
2018/06/14 PHP
你可能不再需要JQUERY
2021/03/09 Javascript
推荐30个新鲜出炉的精美 jQuery 效果
2012/03/26 Javascript
去掉gridPanel表头全选框的小例子
2013/07/18 Javascript
利用jquery包将字符串生成二维码图片
2013/09/12 Javascript
jquery 图片缩放拖动的简单实例
2014/01/08 Javascript
js中this用法实例详解
2015/05/05 Javascript
javaScript中with函数用法实例分析
2015/06/08 Javascript
AngularJS控制器controller正确的通信的方法
2016/01/25 Javascript
使用jQuery制作浮动工具栏的实例分享
2016/05/13 Javascript
详解Python中logging日志模块在多进程环境下的使用
2016/12/26 Javascript
vue-resource 拦截器使用详解
2017/02/21 Javascript
Vue.js教程之axios与网络传输的学习实践
2017/04/29 Javascript
利用jQuery实现简单的拖曳效果实例代码
2017/10/20 jQuery
解决vue语法会有延迟加载显现{{xxx}}的问题
2019/11/14 Javascript
JavaScript实现打砖块游戏
2020/02/25 Javascript
[01:15:29]DOTA2上海特级锦标赛主赛事日 - 3 胜者组第二轮#2Secret VS EG第三局
2016/03/04 DOTA
详解python基础之while循环及if判断
2017/08/24 Python
Python:Numpy 求平均向量的实例
2019/06/29 Python
使用opencv中匹配点对的坐标提取方式
2020/06/04 Python
高级Java程序员面试题
2016/06/23 面试题
供应链金融服务方案
2014/05/25 职场文书
市场推广策划方案
2014/06/02 职场文书
双拥工作宣传标语
2014/06/26 职场文书
2016年大学自主招生自荐信范文
2015/03/24 职场文书
保研推荐信范文
2015/03/25 职场文书
护士医德医风心得体会
2016/01/25 职场文书
原生Js 实现的简单无缝滚动轮播图的示例代码
2021/05/10 Javascript
MySQL数据库事务的四大特性
2022/04/20 MySQL
苹果发布了MagSafe固件更新,可以不外接电源实现最高7.5W充电
2022/04/21 数码科技