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 相关文章推荐
使用Jquery搭建最佳用户体验的登录页面之记住密码自动登录功能(含后台代码)
Jul 10 Javascript
基于jquery库的tab新形式使用
Nov 16 Javascript
jQuery之ajax技术的详细介绍
Jun 19 Javascript
javascript类型系统——日期Date对象全面了解
Jul 13 Javascript
Javascript将JSON日期格式化
Aug 23 Javascript
AngularJS控制器controller给模型数据赋初始值的方法
Jan 04 Javascript
微信小程序request请求后台接口php的实例详解
Sep 20 Javascript
详解vue 兼容IE报错解决方案
Dec 29 Javascript
浅谈js中的attributes和Attribute的用法与区别
Jul 16 Javascript
vue编写简单的购物车功能
Jan 08 Vue.js
详解JS ES6编码规范
May 07 Javascript
JavaScript利用html5新方法操作元素类名详解
Nov 27 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
淘宝ip地址查询类分享(利用淘宝ip库)
2014/01/07 PHP
php实现的短网址算法分享
2014/06/20 PHP
php5.3不能连接mssql数据库的解决方法
2014/12/27 PHP
PHP代码实现爬虫记录――超管用
2015/07/31 PHP
PHP数据的提交与过滤基本操作实例详解
2016/11/11 PHP
PHP实现在数据库百万条数据中随机获取20条记录的方法
2017/04/19 PHP
PHP读取CSV大文件导入数据库的实例
2017/07/24 PHP
Yii框架视图、视图布局、视图数据块操作示例
2019/10/14 PHP
js实时监听文本框状态的方法
2011/04/26 Javascript
Node.js:Windows7下搭建的Node.js服务(来玩玩服务器端的javascript吧,这可不是前端js插件)
2011/06/27 Javascript
js流动式效果显示当前系统时间
2016/05/16 Javascript
浅谈jQuery中的checkbox问题
2016/08/10 Javascript
JS实现自动轮播图效果(自适应屏幕宽度+手机触屏滑动)
2017/06/19 Javascript
Node.js事件的正确使用方法
2019/04/05 Javascript
jQuery中DOM常见操作实例小结
2019/08/01 jQuery
JavaScript canvas绘制圆弧与圆形
2020/02/18 Javascript
AI小程序之语音听写来了,十分钟掌握百度大脑语音听写全攻略
2020/03/13 Javascript
[03:41]2018完美盛典-《Fight With Us》
2018/12/16 DOTA
Windows系统下使用flup搭建Nginx和Python环境的方法
2015/12/25 Python
利用selenium 3.7和python3添加cookie模拟登陆的实现
2017/11/20 Python
详解pandas使用drop_duplicates去除DataFrame重复项参数
2019/08/01 Python
python基于opencv实现人脸识别
2021/01/04 Python
python uuid生成唯一id或str的最简单案例
2021/01/13 Python
html5 datalist 选中option选项后的触发事件
2020/03/05 HTML / CSS
联想哥伦比亚网上商城:Lenovo Colombia
2017/01/10 全球购物
英国打印机墨水和碳粉商店:Printerinks
2017/06/30 全球购物
阿联酋电子产品购物网站:Menakart
2017/09/15 全球购物
EJB timer的种类
2014/10/28 面试题
导游个人求职信
2014/04/25 职场文书
教师师德考核自我评价
2014/09/13 职场文书
2014县委书记四风对照检查材料思想汇报
2014/09/21 职场文书
四年级学生期末评语
2014/12/26 职场文书
仅用几行Python代码就能复制她的U盘文件?
2021/06/26 Python
Python中的嵌套循环详情
2022/03/23 Python
《艾尔登法环》1.03.3补丁上线 碎星伤害调整
2022/04/06 其他游戏
使用CSS实现按钮边缘跑马灯动画
2023/05/07 HTML / CSS