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 相关文章推荐
IE与FireFox的兼容性问题分析
Apr 22 Javascript
基于jQuery的淡入淡出可自动切换的幻灯插件
Aug 24 Javascript
IE的事件传递-event.cancelBubble示例介绍
Jan 12 Javascript
jQuery学习笔记之jQuery构建函数的7种方法
Jun 03 Javascript
详解Javascript动态操作CSS
Dec 08 Javascript
js识别uc浏览器的代码
Nov 06 Javascript
js实现瀑布流的三种方式比较
Jun 28 Javascript
JavaScript程序中的流程控制语句用法总结
May 23 Javascript
以BootStrap Tab为例写一个前端组件
Jul 25 Javascript
swiper插件自定义切换箭头按钮
Dec 28 Javascript
实例解析ES6 Proxy使用场景介绍
Jan 08 Javascript
微信web端后退强制刷新功能的实现代码
Mar 04 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 smarty模版引擎中变量操作符及使用方法
2009/12/11 PHP
PHP 时间转换Unix时间戳代码
2010/01/22 PHP
用PHP实现 上一篇、下一篇的代码
2012/09/29 PHP
Laravel中encrypt和decrypt的实现方法
2017/09/24 PHP
wordpress自定义标签云与随机获取标签的方法详解
2019/03/22 PHP
php与阿里云短信接口接入操作案例分析
2020/05/27 PHP
div移动 输入框不能输入的问题
2009/11/19 Javascript
javascript四舍五入函数代码分享(保留后几位)
2013/12/10 Javascript
jQuery表格列宽可拖拽改变且兼容firfox
2014/09/03 Javascript
jQuery动态效果显示人物结构关系图的方法
2015/05/07 Javascript
dedecms页面如何获取会员状态的实例代码
2016/03/15 Javascript
将json转换成struts参数的方法
2016/11/08 Javascript
手把手教你用Node.js爬虫爬取网站数据的方法
2018/07/05 Javascript
VUE简单的定时器实时刷新的实现方法
2019/01/20 Javascript
JQuery实现简单的复选框树形结构图示例【附源码下载】
2019/07/16 jQuery
LayUI动态设置checkbox不显示的解决方法
2019/09/02 Javascript
微信小程序常用的3种提示弹窗实现详解
2019/09/19 Javascript
详解vue中$nextTick和$forceUpdate的用法
2019/12/11 Javascript
详解Vue3 Composition API中的提取和重用逻辑
2020/04/29 Javascript
Layui弹框中数据表格中可双击选择一条数据的实现
2020/05/06 Javascript
vue的webcamjs集成方式
2020/11/16 Javascript
原生js+canvas实现验证码
2020/11/29 Javascript
Android模拟器无法启动,报错:Cannot set up guest memory ‘android_arm’ Invalid argument的解决方法
2016/07/01 Python
python实现二维插值的三维显示
2018/12/17 Python
python多线程http压力测试脚本
2019/06/25 Python
Python使用monkey.patch_all()解决协程阻塞问题
2020/04/15 Python
Keras之fit_generator与train_on_batch用法
2020/06/17 Python
Keras搭建自编码器操作
2020/07/03 Python
python装饰器三种装饰模式的简单分析
2020/09/04 Python
通俗易懂了解Python装饰器原理
2020/09/17 Python
viagogo英国票务平台:演唱会、体育比赛、戏剧门票
2017/03/24 全球购物
营销总监岗位职责范本
2014/02/26 职场文书
员工激励培训演讲稿
2014/09/16 职场文书
2014国庆黄金周超市促销活动方案
2014/09/21 职场文书
大学生社会实践感想
2015/08/11 职场文书
Python 中数组和数字相乘时的注意事项说明
2021/05/10 Python