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 相关文章推荐
学习ExtJS(二) Button常用方法
Oct 07 Javascript
基于jquery的不规则矩形的排列实现代码
Apr 16 Javascript
JS中三目运算符和if else的区别分析与示例
Nov 21 Javascript
layer实现弹窗提交信息
Dec 12 Javascript
AngularJS之ionic 框架下实现 Localstorage本地存储
Apr 22 Javascript
JavaScript实现图片拖曳效果
Sep 08 Javascript
swiper4实现移动端导航切换
Oct 16 Javascript
Vue过渡效果之CSS过渡详解(结合transition,animation,animate.css)
Feb 05 Javascript
基于JavaScript实现控制下拉列表
May 08 Javascript
JS时间戳与日期格式互相转换的简单方法示例
Jan 30 Javascript
vue.js实现点击图标放大离开时缩小的代码
Jan 27 Vue.js
Vue基本指令实例图文讲解
Feb 25 Vue.js
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
剖析 PHP 中的输出缓冲
2006/12/21 PHP
php多进程应用场景实例详解
2019/07/22 PHP
ASP中用Join和Array,可以加快字符连接速度的代码
2007/08/22 Javascript
用户注册常用javascript代码
2009/08/29 Javascript
理解JavaScript中的对象 推荐
2011/01/09 Javascript
深入分析js中的constructor和prototype
2012/04/07 Javascript
JavaScript日期时间格式化函数分享
2014/05/05 Javascript
JS仿淘宝实现的简单滑动门效果代码
2015/10/14 Javascript
jQuery div拖拽用法实例
2016/01/14 Javascript
javascript时间戳和日期字符串相互转换代码(超简单)
2016/06/22 Javascript
文本溢出插件jquery.dotdotdot.js使用方法详解
2017/06/22 jQuery
js获取html页面代码中图片地址的实现代码
2018/03/05 Javascript
详解如何在你的Vue项目配置vux
2018/06/04 Javascript
JavaScript 下载svg图片为png格式
2018/06/21 Javascript
vue3.0 CLI - 1 - npm 安装与初始化的入门教程
2018/09/14 Javascript
vue基础之v-bind属性、class和style用法分析
2019/03/11 Javascript
如何基于JS截获动态代码
2019/12/25 Javascript
记录微信小程序 height: calc(xx - xx);无效问题
2019/12/30 Javascript
总结用Pdb库调试Python的方式及常用的命令
2016/08/18 Python
python使用xslt提取网页数据的方法
2018/02/23 Python
Python使用googletrans报错的解决方法
2018/09/25 Python
使用numba对Python运算加速的方法
2018/10/15 Python
python实现网页自动签到功能
2019/01/21 Python
Python I/O与进程的详细讲解
2019/03/08 Python
PyQt5根据控件Id获取控件对象的方法
2019/06/25 Python
Python 实现try重新执行
2019/12/21 Python
Python GUI编程学习笔记之tkinter控件的介绍及基本使用方法详解
2020/03/30 Python
Python趣味实例,实现一个简单的抽奖刮刮卡
2020/07/18 Python
中外合拍动画首获奥斯卡提名,“上海出品”《飞奔去月球》能否拿下最终大奖?
2021/03/16 国漫
KIKO美国官网:意大利的平价彩妆品牌
2017/05/16 全球购物
酒吧总经理岗位职责
2013/12/10 职场文书
建筑经济管理专业求职信分享
2014/01/06 职场文书
竞选班长演讲稿500字
2014/08/22 职场文书
党支部书记岗位职责
2015/02/15 职场文书
阿凡达观后感
2015/06/10 职场文书
大学生奖学金获奖感言(范文)
2019/08/15 职场文书