js字典操作

今天小伙伴问了我你知道js字典操作吗?

我是一脸懵逼的,那是什么?遂上网搜,看到答案只想说原来如此。。。所以还是记下来吧

首先,js的数组 Array 既是一个数组,也是一个字典。

数组用法

1
2
3
4
5
6
var test = new Array()
test[0] = "a"
test[1] = "b"
for (var i = 0; i < test.length; i++) {
console.log(test[i])
}

关联数组(类似字典)用法

1
2
3
4
5
6
7
8
var dictionary = new Array()
dictionary['d1'] = 'a'
dictionary['d2'] = 'b'
for (var i in dictionary) {
console.log(i + ":" + dictionary[i])
}
// d1:a
// d2:b

这里的 i 即为字典的每个键值。

此外,dictionary是一个字典对象,而它的每个键值就是一个属性。也就是说 d1 是 dictionary 的一个属性。但是这样子创建出来的 dictionary 是不会像普通数组那样有 length 属性的

1
2
dictionary.d1 // 'a'
dictionary.length // 0

再来看一下字典和数组的简化声明方式

1
2
var arr = [1, 2, 3] // 数组
var arr_dic = {'d1': 'a', 'd2': 'b'} // 字典

在上例中,d1和d2既是键值,也是作为字典对象的属性


下面再来看看如何对一个对象的属性进行遍历。(for…in)

1
2
3
4
5
6
7
8
9
10
function Computer(brand, price) {
this.brand = brand
this.price = price
}
var myComputer = new Computer('hp', 5000)
for (var key in myComputer) {
console.log("myComputer[" + key + "] = " + myComputer[key])
}
// myComputer[brand] = hp
// myComputer[price] = 5000

上面的这种用法可以用来查看一个对象都有哪些属性。当你已经知道Computer对象有一个brand属性时,就可以用

1
myComputer.brand 或 myComputer[brand]

总结:Javascript中的数组也可以用来做字典。字典的键值也是字典对象的属性。对一个对象的属性进行遍历时,可以用for in。

数组遍历与属性

虽然在 JavaScript 中数组是对象,但是没有好的理由去使用 for in 循环 遍历数组。


相反,有一些好的理由不去使用 for in 遍历数组。

注意:JavaScript中数组不是关联数组

JavaScript 中只有对象来管理键值的对应关系。但是关联数组是保持顺序的,而对象不是。


由于 for in 循环会枚举原型链上的所有属性,唯一过滤这些属性的方式是使用hasOwnProperty 函数,因此会比普通的 for 循环慢上好多倍。
为了达到遍历数组的最佳性能,推荐使用经典的 for 循环。

1
2
3
4
var list = [1, 2, 3, 4, 5, ...... 100000000];
for(var i = 0, l = list.length; i < l; i++) {
console.log(list[i]);
}

上面代码有一个处理,就是通过 l = list.length 来缓存数组的长度。


虽然 length 是数组的一个属性,但是在每次循环中访问它还是有性能开销。


实际上,不使用缓存数组长度的方式比缓存版本要慢很多。

Newer Post

js原型链

昨天学习了js的原型对象相关知识,今天继续深入理解下原型链摘抄自 https://segmentfault.com/a/1190000011095622?_ea=2518761 原型链是什么 每一个实例都有一个[[Prototype]]属性,指向原型对象。这是一个隐式属性,存在但是我们的脚本访问不到 …

继续阅读
Older Post

js原型对象

摘抄自 https://segmentfault.com/a/1190000010842024拓展理解:https://github.com/mqyqingfeng/Blog/issues/2概念理解什么是原型对象呢?有以下几点1.构造函数有一个 prototype 属性,指向构造函数的原型对象。而 …

继续阅读