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 相关文章推荐
Valerio 发布了 Mootools
Sep 23 Javascript
JS模拟多线程
Feb 07 Javascript
无语,javascript居然支持中文(unicode)编程!
Apr 12 Javascript
使用jQuery实现input数值增量和减量的方法
Jan 24 Javascript
JavaScript实现当网页加载完成后执行指定函数的方法
Mar 21 Javascript
详解JavaScript中的异常处理方法
Jun 16 Javascript
js获取ip和地区
Mar 10 Javascript
JS实现搜索关键词的智能提示功能
Jul 07 Javascript
vue.js实现只弹一次弹框
Jan 29 Javascript
jQuery HTML获取内容和属性操作实例分析
May 20 jQuery
编写v-for循环的技巧汇总
Dec 01 Javascript
如何用vue实现网页截图你知道吗
Nov 17 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中serialize序列化与json性能测试的示例分析
2013/04/27 PHP
深入HTTP响应状态码速查表的详解
2013/06/07 PHP
深入Memcache的Session数据的多服务器共享详解
2013/06/13 PHP
解析PHP获取当前网址及域名的实现代码
2013/06/23 PHP
PHP函数strip_tags的一个bug浅析
2014/05/22 PHP
PHP中让curl支持sock5的代码实例
2015/01/21 PHP
php实现通用的信用卡验证类
2015/03/24 PHP
PHP模块化安装教程
2016/06/01 PHP
将CKfinder整合进CKEditor3.0的新方法
2010/01/10 Javascript
关于编写性能高效的javascript事件的技术
2014/11/28 Javascript
编写简单的jQuery提示插件
2014/12/21 Javascript
json对象转为字符串,当做参数传递时加密解密的实现方法
2016/06/29 Javascript
js轮盘抽奖实例分析
2020/04/17 Javascript
jQuery滚动监听实现商城楼梯式导航效果
2017/03/06 Javascript
基于vue-ssr服务端渲染入门详解
2018/01/08 Javascript
如何在Vue项目中添加接口监听遮罩
2021/01/25 Vue.js
Python Flask基础教程示例代码
2018/02/07 Python
Python解析、提取url关键字的实例详解
2018/12/17 Python
python 函数内部修改外部变量的方法
2018/12/18 Python
Python深拷贝与浅拷贝用法实例分析
2019/05/05 Python
selenium+python环境配置教程详解
2019/05/28 Python
python实现网站用户名密码自动登录功能
2019/08/09 Python
图解python全局变量与局部变量相关知识
2019/11/02 Python
python实现扑克牌交互式界面发牌程序
2020/04/22 Python
pytorch中 gpu与gpu、gpu与cpu 在load时相互转化操作
2020/05/25 Python
python网络爬虫实现发送短信验证码的方法
2021/02/25 Python
HTML5离线应用与客户端存储的实现
2018/05/03 HTML / CSS
Halston Heritage官网:简洁的日装,稍显奢华的晚装
2018/11/20 全球购物
阿尔卡特(中国)的面试题目
2014/08/20 面试题
为什么要用EJB
2014/04/17 面试题
成人教育自我鉴定
2013/11/01 职场文书
教师实习自我鉴定
2013/12/11 职场文书
秋天的怀念教学反思
2014/04/28 职场文书
中等生评语大全
2014/05/04 职场文书
物流专业自荐信
2014/05/23 职场文书
详解前端任务构建利器Gulp.js使用指南
2021/04/30 Javascript