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 相关文章推荐
JavaScript日历实现代码
Sep 12 Javascript
javascript + jquery实现定时修改文章标题
Mar 19 Javascript
JavaScript中停止执行setInterval和setTimeout事件的方法
May 14 Javascript
Js和JQuery获取鼠标指针坐标的实现代码分享
May 25 Javascript
Bootstrap3学习笔记(二)之排版
May 20 Javascript
jQuery自定义图片缩放拖拽插件imageQ实现方法(附demo源码下载)
May 27 Javascript
Vue服务器渲染Nuxt学习笔记
Jan 31 Javascript
vuejs项目打包之后的首屏加载优化及打包之后出现的问题
Apr 01 Javascript
Vue中插入HTML代码的方法
Sep 21 Javascript
jQuery实现侧边栏隐藏与显示的方法详解
Dec 22 jQuery
swiper实现异形轮播效果
Nov 28 Javascript
vue实现输入框自动跳转功能
May 20 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
PHP计算2点经纬度之间的距离代码
2013/08/12 PHP
Destoon模板制作简明教程
2014/06/20 PHP
PHP生成指定长度随机数最简洁的方法
2014/07/14 PHP
php读取csv文件并输出的方法
2015/03/14 PHP
PHP获取指定日期是星期几的实现方法
2016/11/30 PHP
Laravel5.5 手动分页和自定义分页样式的简单实现
2019/10/15 PHP
JQuery 网站换肤功能实现代码
2009/11/02 Javascript
json2.js的初步学习与了解
2011/10/06 Javascript
JavaScript自动设置IFrame高度的小例子
2013/06/08 Javascript
jQuery的选择器中的通配符使用介绍
2014/03/20 Javascript
纯javascript响应式树形菜单效果
2015/11/10 Javascript
JQuery实现简单的服务器轮询效果实例
2016/03/31 Javascript
jQuery Mobile 触摸事件实例
2016/06/04 Javascript
详谈JS中实现种子随机数及作用
2016/07/19 Javascript
AngularJS基础 ng-mousemove 指令简单示例
2016/08/02 Javascript
ajax接收后台数据在html页面显示
2017/02/19 Javascript
node.js实现回调的方法示例
2017/03/01 Javascript
JS使用tofixed与round处理数据四舍五入的区别
2017/10/25 Javascript
小程序实现抽奖动画
2020/04/16 Javascript
基于JavaScript实现控制下拉列表
2020/05/08 Javascript
vue使用video插件vue-video-player的示例
2020/10/03 Javascript
Node快速切换版本、版本回退(降级)、版本更新(升级)
2021/01/07 Javascript
python和shell变量互相传递的几种方法
2013/11/20 Python
Python EOL while scanning string literal问题解决方法
2020/09/18 Python
python实现求特征选择的信息增益
2018/12/18 Python
用Python将结果保存为xlsx的方法
2019/01/28 Python
Python属性和内建属性实例解析
2020/01/14 Python
Sneaker Studio法国:购买运动鞋
2018/06/08 全球购物
超级英雄、电影和电视、乐队和音乐T恤:Loud Clothing
2019/09/01 全球购物
C语言面试题
2013/05/19 面试题
个人银行贷款担保书
2014/04/01 职场文书
平安工地汇报材料
2014/08/19 职场文书
酒会邀请函
2015/01/31 职场文书
工程部部长岗位职责
2015/02/12 职场文书
经典搞笑版检讨书
2015/02/19 职场文书
使用goaccess分析nginx日志的详细方法
2021/07/09 Servers