[1]-Array的那些坑

上篇文章([0]-JavaScript中的localStorage和sessionStorage)中说到了Storage可以作为App的缓存,今天来和大家聊聊我在使用Array作为缓存载体的那些坑,关于数组的使用相信大家都有所了解,在此就不再赘述了。

  • 目录

字符串作为数组索引

Array Like

  • 字符串作为数组索引

在开发中使用Array做为缓存的载体时,为了方便查询和写入会使用字符串作为数组的索引:

 1 var person = {
 2   name: "Tom",
 3   age: 29,
 4   imaccount: "[email protected]"
 5 };
 6
 7 var cache = JSON.parse(localStorage.getItem(‘cache‘));
 8 if (cache == undefined) {
 9   cache = [];
10 }
11 cache[person.imaccount] = person;

在业务场景下,用户的imaccount属性是唯一的,一个imaccount对应一个用户,这样的话可以使用一个Array作为缓存并且放入localStorage。

我们将刚才的数组进行序列化。(此处仅作示意,真正的缓存应更加完善、从localStorage序列化/反序列化应封装成工具方法)

1 localStorage.setItem(‘cache‘, JSON.stringify(cache));

    

在序列化之后查看Resources选项卡发现cache对应的值是 "[]" 一个空的数组,但是我们在数组中通过 cache[‘[email protected]‘] 获取添加到缓存的对象发现可以获取到,但是数组的 length 为0。这是因为在数组中使用字符串作为索引的项,不会占用长度,在toString时不会被打印。当时就是因为忽略了这一点导致刚开始开发时缓存就像没有一样,依然会每次请求服务器,到后来才逐渐发现这个坑。

如何避免这个问题呢?这就引出了我们今天要讨论的第二个话题Array Like(伪数组)。

  • Array Like

  

Array Like即伪数组,拥有 length 属性和可以通过 [index] 的形式访问元素。函数执行时的 arguments 隐式对象就是一个Array Like。

我们发现arguments对象中存储了实参列表,还有 callee 和 length 属性。

callee 属性指向的是当前执行的函数本身,我们可以通过 arguments.callee() 调用当前执行的函数从而实现匿名函数的递归;说到 callee 就顺便说说 funcName.caller ,它指向了调用该函数的函数。

但arguments并不是Array的实例 arguments instanceof Array 返回的结果是 false ,如何让arguments变成真正的数组呢?

通过[]生成一个新数组,再通过call方法调用数组的slice方法将arguments转换成真正的数组就可以做数组相关的操作了。

时间: 2024-10-06 03:48:51

[1]-Array的那些坑的相关文章

【js】name 与 array 的纠葛 - 坑

一. 现象 var name = new Array(); typeof(name)      // 为string 类型 var name = new Array('a' , 'b' , 'c'); typeof(name)     // 为string 类型 name.length      // 长度为3 , 理解为字符串 function test () { var name = new Array('a' , 'b' , 'c'); console.log(typeof(name) ,

一文搞定十大经典排序算法(Java实现)

本文总结十大经典排序算法及变形,并提供Java实现. 参考文章: 十大经典排序算法总结(Java语言实现) 快速排序算法—左右指针法,挖坑法,前后指针法,递归和非递归 快速排序及优化(三路划分等) 一.排序算法概述 1.定义 将杂乱无章的数据元素,通过一定的方法按关键字顺序排列的过程叫做排序. 2.分类 十种常见排序算法可以分为两大类: 非线性时间比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此称为非线性时间比较类排序. 线性时间非比较类排序:不通过比较

程序员的算法课(2)-排序算法

原文链接:https://www.jianshu.com/p/47170b1ced23 术语说明 稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面: 不稳定:如果a原本在b的前面,而a=b,排序之后a可能会出现在b的后面: 内排序:所有排序操作都在内存中完成: 外排序:由于数据太大,因此把数据放在磁盘中,而排序通过磁盘和内存的数据传输才能进行: 一.排序算法总结 n: 数据规模 k: “桶”的个数 In-place: 占用常数内存,不占用额外内存 Out-place: 占用额外内存

用js刷题的一些坑

leecode可以用js刷题了,我大js越来越被认可了是吧.但是刷题中会因为忽略js的一些特性掉入坑里.我这里总结一下我掉过的坑. 坑1:js中数组对象是引用对象 js中除了object还有数组对象也是引用对象,这点常常被忽视,所以在递归的时候传递数组要用arr.slice(0)这样复制一个一样的新数组,不然会出现你传入的数组会被同级的递归改变,结果就不对了. 所以只要数组复制的地方最好都要这么写,除非你真的想引用.而且注意是slice不是splice这两个方法差别很大,你如果用splice(0

【Swift】Alamofile网络请求数据更新TableView的坑

写这篇BLOG前,有些话不得不提一下,就仅当发发恼骚吧... 今天下午为了一个Alamofire取得数据而更新TableView的问题,查了一下午的百度(360也是见鬼的一样),竟然没有一个简单明了的回答, 而唯一几个比较接近答案的,说要 self.tableView.reloadData(),也没有贴上代码,说要放在哪个函数内, 都犹抱琵琶半遮面,让初学者自己采坑,于是郁闷了一下午,刚刚回到家,试想想,要不试试英文网,毕竟Swift就是人家老外的, 说不定老外会告诉你,怎么取得数据并绑定Tab

廖雪峰js教程笔记4 sort排序的一些坑

排序算法 排序也是在程序中经常用到的算法.无论使用冒泡排序还是快速排序,排序的核心是比较两个元素的大小.如果是数字,我们可以直接比较,但如果是字符串或者两个对象呢?直接比较数学上的大小是没有意义的,因此,比较的过程必须通过函数抽象出来.通常规定,对于两个元素x和y,如果认为x < y,则返回-1,如果认为x == y,则返回0,如果认为x > y,则返回1,这样,排序算法就不用关心具体的比较过程,而是根据比较结果直接排序. JavaScript的Array的sort()方法就是用于排序的,但是

一名Android开发者的微信小程序填坑之路(1)

前言 首先要声明的是,我是一名 Android 开发者,之前基本没有前端开发经验,甚至连 JS ,HTML 都是为了开发小程序现学的一些皮毛--所以文章中所提到的一些点也许在资深前端开发者看来只是小case,但是站在一个 Android 开发者的角度来看确实是大坑. 前面就不说太多东西了,文章的末尾再谈谈我对小程序的一些看法--这篇文章主要是谈谈在开发小程序的过程中遇到的一些坑. PS:推荐一下我写的一个微信小程序版的Gank客户端:wechat-weapp-gank 正文 1,获取小程序开发工

一名Android开发者的微信小程序填坑之路(2)

前言 上一篇是九月二十七日写的,而这一篇我动笔的时间是十月十日(特殊的日子),中间相隔十三天--当然是因为国庆节.说老实话,这十三天里面我都没有碰和小程序有关的东西--毕竟学习小程序的开发也只是起于兴趣,而平时的工作并不会涉及与其相关的东西--但是在这十三天里,我能明显的感受到小程序热正在逐渐的消退,或者说大家正在逐渐以一种较为平和的姿态接受它的存在,其实这是一件好事.期待公测的到来. 接下来我就直接进入正题了,另外,文末我想和大家分享一下我的国庆节. PS:这篇文章是接着上一篇文章 一名And

PHP中逻辑运算符and/or与||/&amp;&amp;的一个坑

我原来以为PHP中的and和&&是一样的, 只是写法上为了可读性和美观, 事实上我错了. 这里面深藏了一个坑! 看以下代码: $bA = true; $bB = false; $b1 = $bA and $bB; $b2 = $bA && $bB; var_dump($b1); // $b1 = true var_dump($b2); // $b2 = false $bA = false; $bB = true; $b3 = $bA or $bB; $b4 = $bA ||