Js中使用hasOwnProperty方法检索ajax响应对象的例子


Posted in Javascript onDecember 08, 2014

经常使用百度搜索的同学,一定不会忽视输入框的下拉索引,它是如此方便,然而得天独厚的条件使得这项异步技术多少面临些考验,高并发的服务端请求督促着他们的前端攻城师必须尽可能地减少发送ajax的次数。听起来似乎与本文无关,但并不是这样。首先就暂且让我们为百度免费做个广告吧。在百度首页输入“前端”一词,利用chromebug可以很轻松地看到所发送的响应,结果显示如下:

window.bdsug.sug({q:'前端';,p:false,s:['前端开发','前端工程师','前端总线','前端开发工程师','前端框架','前端总线频率','前端面试题','前端分析','前端开发工具','前端观察']});

百度试图通过返回一个带有obj参数的sug方法,来进行对下拉数据的渲染,当你在不刷新页面的情况下再次输入“前端”,类似的请求并没有发生,这说明他们很可能建立了一个缓存对象,它的作用是临时存储请求过来的object,当后面输入同样的词汇时,会首先检索缓存对象的键,匹配成功后,直接读取该对象的值,并不再向服务端发送请求,这样就可以有效地节约成本了。

抛砖引玉,接下来谈谈真正的主角:hasOwnProperty方法。

相信jser们对hasOwnProperty并不陌生,我在此也只是江边卖水了。

它是对象的专属,用来判断一个属性是否存在于某对象的键中,return的是一个boolean值。这是一个例子:

var test0 = Array.prototype.hasOwnProperty('split'); //false,因为数组不存在split方法

var test1 = String.prototype.hasOwnProperty('split'); //true,因为split是String对象的内置方法

当你知道这些的时候,似乎还不足以看到hasOwnProperty的作用力,那么下面简单地重现一下百度下拉的例子:

var data = {}, saveObj = function(val){

 if(data.hasOwnProperty(val)){ //如果提交的值存在于data对象中,则不发送请求

  var len = data[val].length;

  for(var i = 0; i < len; i++){

   console.log(data[val][i]);

  }

 }else{

  var url = 'http://suggestion.baidu.com/su?wd=' + val;

  $.ajax({ //为了示例清晰,此处用jquery的ajax为例

   url : url + '&p=3&cb=window.bdsug.sug&sid=1421_1513_1541_1542_1582&t=1353756355137', //最后面一个参数t是一个时间戳

   dataType : 'jsonp',

   type : 'GET',

   success : function(res){

    var msg = res.data, len = msg.length;

    msg == null && (msg = []);

    if(len > 0){

     data[val] = msg; //缓存搜索结果

     for(var i = 0; i < len; i++){

      console.log(msg[i]); //打印出请求结果

     }

    }

   }, error : function(){

    alert('error');

   }

  });

 }

};

有同事质疑,这样一来,缓存对象data占用的内存将会随着存储键值的越多而越大。那么我想说这是不可避免的,要节约服务端的请求,就必然要牺牲其它,而事实上缓存对象占据的空间通常情况下是可以忽略的,因为它并非“常驻内存”,一旦页面刷新它将销毁。然而我们可以给出另一个解决方案,给此对象约定一个峰值,比如最多它只允许存储100个键值对,当超过100的数量时,通过delete运算符删除前十条存储的键或者干脆就不存储,这样就可以避免此问题了。

hasOwnProperty方法在对象的检测中用得尤为普遍,当然有兴趣的同学也可以去了解下propertyIsEnumerable方法,它是hasOwnProperty的增强版,能检测自有属性且该属性的可枚举性,本文就不再做详细说明了。

Javascript 相关文章推荐
jquery select(列表)的操作(取值/赋值)
Aug 06 Javascript
JQuery Tips(3) 关于$()包装集内元素的改变
Dec 14 Javascript
自定义ExtJS控件之下拉树和下拉表格附源码
Oct 15 Javascript
判断浏览器的内核及版本号方法汇总
Jan 05 Javascript
基于socket.io+express实现多房间聊天
Mar 17 Javascript
JS在Chrome浏览器中showModalDialog函数返回值为undefined的解决方法
Aug 03 Javascript
vue快捷键与基础指令详解
Jun 01 Javascript
angular过滤器实现排序功能
Jun 27 Javascript
搭建vue开发环境
Jul 19 Javascript
vue 监听屏幕高度的实例
Sep 05 Javascript
vue ssr 实现方式(学习笔记)
Jan 18 Javascript
JavaScript oncopy事件用法实例解析
May 13 Javascript
ECMAScript5中的对象存取器属性:getter和setter介绍
Dec 08 #Javascript
JavaScript对象之深度克隆介绍
Dec 08 #Javascript
SeaJS 与 RequireJS 的差异对比
Dec 08 #Javascript
JavaScript中的ArrayBuffer详细介绍
Dec 08 #Javascript
JS实现仿京东淘宝竖排二级导航
Dec 08 #Javascript
js继承call()和apply()方法总结
Dec 08 #Javascript
ANGULARJS中用NG-BIND指令实现单向绑定的例子
Dec 08 #Javascript
You might like
1.PHP简介
2006/10/09 PHP
php单例模式实现(对象只被创建一次)
2012/12/05 PHP
降低PHP Redis内存占用
2017/03/23 PHP
Laravel构建即时应用的一种实现方法详解
2017/08/31 PHP
jQuery.autocomplete 支持中文输入(firefox)修正方法
2011/03/10 Javascript
fmt:formatDate的输出格式详解
2014/01/09 Javascript
js中小数转换整数的方法
2014/01/26 Javascript
php,js,css字符串截取的办法集锦
2014/09/26 Javascript
Javascript基础教程之while语句
2015/01/18 Javascript
jquery插件jquery.beforeafter.js实现左右拖拽分隔条对比图片的方法
2015/08/07 Javascript
设计模式中的facade外观模式在JavaScript开发中的运用
2016/05/18 Javascript
浅谈angularjs $http提交数据探索
2017/01/20 Javascript
vue watch深度监听对象实现数据联动效果
2018/08/16 Javascript
JS函数内部属性之arguments和this实例解析
2018/10/07 Javascript
vue实现element表格里表头信息提示功能(推荐)
2019/11/20 Javascript
OpenLayers3加载常用控件使用方法详解
2020/09/25 Javascript
Python编程实现双击更新所有已安装python模块的方法
2017/06/05 Python
python+pyqt5实现24点小游戏
2019/01/24 Python
python多进程读图提取特征存npy
2019/05/21 Python
python脚本实现音频m4a格式转成MP3格式的实例代码
2019/10/09 Python
Python中Yield的基本用法
2020/10/18 Python
详解Python流程控制语句
2020/10/28 Python
matplotlib事件处理基础(事件绑定、事件属性)
2021/02/03 Python
五款漂亮的纯CSS3动画按钮的实例教程
2014/11/21 HTML / CSS
CSS3的first-child选择器实战攻略
2016/04/28 HTML / CSS
美国批发零售网站:GearXS
2016/07/26 全球购物
Internet主要有哪些网络群组成
2015/12/24 面试题
语文教育专业推荐信范文
2013/11/25 职场文书
寄语十八大感言
2014/02/07 职场文书
爱国主义主题班会
2015/08/14 职场文书
2016年学校“3.12”植树节活动总结
2016/03/16 职场文书
2019年入党思想汇报
2019/03/25 职场文书
祝福语集锦:给满月宝宝的祝福语
2019/11/20 职场文书
使用Python的开发框架Brownie部署以太坊智能合约
2021/05/28 Python
css让页脚保持在底部位置的四种方案
2022/07/23 HTML / CSS
SpringBoot前端后端分离之Nginx服务器下载安装过程
2022/08/14 Servers