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 相关文章推荐
自动更新作用
Oct 08 Javascript
javascript div 弹出可拖动窗口
Feb 26 Javascript
一些经常会用到的Javascript检测函数
May 31 Javascript
js 判断控件获得焦点的示例代码
Mar 04 Javascript
JavaScript中的数组操作介绍
Dec 30 Javascript
jQuery多级手风琴菜单实例讲解
Oct 22 Javascript
javascript实现根据汉字获取简拼
Sep 25 Javascript
Bootstrap在线电子商务网站实战项目5
Oct 14 Javascript
jQuery双向列表选择器DIV模拟版
Nov 01 Javascript
vue2.0项目中使用Ueditor富文本编辑器示例代码
Aug 14 Javascript
jQuery实现手机号正则验证输入及自动填充空格功能
Jan 02 jQuery
js制作提示框插件
Dec 24 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 404错误页面实现代码
2009/06/22 PHP
mysql 查询指定日期时间内sql语句实现原理与代码
2012/12/16 PHP
JavaScript 弹出窗体点击按钮返回选择数据的实现
2010/04/01 Javascript
JavaScript之appendChild、insertBefore和insertAfter使用说明
2010/12/30 Javascript
js对数字的格式化使用说明
2011/01/12 Javascript
JQuery入门——事件切换之hover()方法应用介绍
2013/02/05 Javascript
js 判断控件获得焦点的示例代码
2014/03/04 Javascript
javascript trim函数在IE下不能用的解决方法
2014/09/12 Javascript
JavaScript中Date对象的常用方法示例
2015/10/24 Javascript
jquery中ajax处理跨域的三大方式
2016/01/05 Javascript
轻松实现js图片预览功能
2016/01/18 Javascript
JS中的进制转换以及作用
2016/06/26 Javascript
jQuery实现每隔几条元素增加1条线的方法
2016/06/27 Javascript
Angularjs 制作购物车功能实例代码
2016/09/14 Javascript
基于JS+Canves实现点击按钮水波纹效果
2016/09/15 Javascript
jQuery实现点击后高亮背景固定显示的菜单效果【附demo源码下载】
2016/09/21 Javascript
jQuery实现弹出窗口弹出div层的实例代码
2017/01/09 Javascript
js单页hash路由原理与应用实战详解
2017/08/14 Javascript
jQuery 1.9版本以上的浏览器判断方法代码分享
2017/08/28 jQuery
详解tween.js的使用教程
2017/09/14 Javascript
nodejs实现简单的gulp打包
2017/12/21 NodeJs
Javascript网页抢红包外挂实现分享
2018/01/11 Javascript
手把手教你vue-cli单页到多页应用的方法
2018/05/31 Javascript
vue里如何主动销毁keep-alive缓存的组件
2019/03/21 Javascript
刷新页面后让控制台的js代码继续执行
2019/09/20 Javascript
VUE 单页面使用 echart 窗口变化时的用法
2020/07/30 Javascript
Python中urllib2模块的8个使用细节分享
2015/01/01 Python
教你用Type Hint提高Python程序开发效率
2016/08/08 Python
师范应届生教师求职信
2013/11/05 职场文书
大三学生做职业规划:给未来找个方向
2014/02/24 职场文书
马智宇结婚主持词
2014/04/01 职场文书
2014年五四青年节演讲稿范文
2014/04/22 职场文书
中秋节国旗下演讲稿
2014/09/05 职场文书
教学质量月活动总结
2015/05/11 职场文书
2015年度学校卫生工作总结
2015/05/12 职场文书
关于vue中如何监听数组变化
2021/04/28 Vue.js