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 相关文章推荐
利用onresize使得div可以随着屏幕大小而自适应的代码
Jan 15 Javascript
文字溢出实现溢出的部分再放入一个新生成的div中具体代码
May 17 Javascript
js选项卡的实现方法
Feb 09 Javascript
node.js抓取并分析网页内容有无特殊内容的js文件
Nov 17 Javascript
浅谈javascript 函数表达式和函数声明的区别
Jan 05 Javascript
浅谈javascript中的数据类型转换
Dec 27 Javascript
jQuery扩展_动力节点Java学院整理
Jul 05 jQuery
jQuery实现获取table中鼠标click点击位置行号与列号的方法
Oct 09 jQuery
vue+vue-router转场动画的实例代码
Sep 01 Javascript
JS事件绑定的常用方式实例总结
Mar 02 Javascript
Element Rate 评分的使用方法
Jul 27 Javascript
利用js实现简易红绿灯
Oct 15 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 strtok()函数的优点分析
2010/03/02 PHP
兼容各大浏览器带关闭按钮的漂浮多组图片广告代码
2014/06/05 PHP
php防止用户重复提交表单
2015/11/02 PHP
PHP通过反射动态加载第三方类和获得类源码的实例
2015/11/27 PHP
使用JS或jQuery模拟鼠标点击a标签事件代码
2014/03/10 Javascript
JS数组的遍历方式for循环与for...in
2014/07/31 Javascript
使用jQuery设置disabled属性与移除disabled属性
2014/08/21 Javascript
对象题目的一个坑 理解Javascript对象
2015/12/22 Javascript
Bootstrap table使用方法总结
2017/05/10 Javascript
angular使用post、get向后台传参的问题实例
2017/05/27 Javascript
详解在AngularJS的controller外部直接获取$scope
2017/06/02 Javascript
AngularJS学习笔记之表单验证功能实例详解
2017/07/06 Javascript
Angularjs自定义指令实现分页插件(DEMO)
2017/09/16 Javascript
vue mintui-Loadmore结合实现下拉刷新和上拉加载示例
2017/10/12 Javascript
jquery如何实现点击空白处隐藏元素
2017/12/05 jQuery
Angular自定义组件实现数据双向数据绑定的实例
2017/12/11 Javascript
vue ssr 指南详读
2018/06/29 Javascript
一步一步的了解webpack4的splitChunk插件(小结)
2018/09/17 Javascript
实例讲解JS中pop使用方法
2019/01/27 Javascript
[55:44]OG vs NAVI 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/17 DOTA
python3实现随机数
2018/06/25 Python
python交换两个变量的值方法
2019/01/12 Python
Python实现实时数据采集新型冠状病毒数据实例
2020/02/04 Python
pytorch实现Tensor变量之间的转换
2020/02/17 Python
python 解决print数组/矩阵无法完整输出的问题
2020/02/19 Python
Python图像处理库PIL的ImageFilter模块使用介绍
2020/02/26 Python
什么是类的返射机制
2016/02/06 面试题
毕业生个人求职信范例分享
2013/12/17 职场文书
高三生物教学反思
2014/01/25 职场文书
策划创业计划书
2014/02/06 职场文书
预备党员的自我评价
2014/03/12 职场文书
学员自我鉴定
2014/03/19 职场文书
社区党的群众路线教育实践活动总结材料
2014/10/31 职场文书
开会迟到检讨书范文
2015/05/06 职场文书
2016年离婚协议书范文
2016/03/18 职场文书
golang 接口嵌套实现复用的操作
2021/04/29 Golang