问题起源:
在学习JS的过程中遇到一道题目“判断一个字符串中出现次数最多的字符,统计这个次数”,在网上查到一个用对象的方法解题,看完表示一脸懵逼。对代码中o[char]
不能理解。
代码如下:
<script>
var str = "zhaochucichuzuiduodezifu";
var o = {};
for (var i = 0, length = str.length; i < length; i++) {
// var char = str[i];
var char = str.charAt(i);
if (o[char]) { //char就是对象o的一个属性,o[char]是属性值,o[char]控制出现的次数
o[char]++; //次数加1
} else {
o[char] = 1; //若第一次出现,次数记为1
}
}
console.log(o); //输出的是完整的对象,记录着每一个字符及其出现的次数
//遍历对象,找到出现次数最多的字符和次数
var max = 0;
var maxChar = null;
for (var key in o) {
if (max < o[key]) {
max = o[key]; //max始终储存次数最大的那个
maxChar = key; //那么对应的字符就是当前的key
}
}
console.log("最多的字符是" + maxChar);
console.log("出现的次数是" + max);
</script>
原网址:js–找字符串中出现最多的字符
后来在一个网页中查到,原来对象访问属性有两种方式。有一个对象Obj = {"Name":"Langshen","AGE":"28"}
- 用点访问,
Obj.Name
; - 用中括号访问,
Obj["Name"]
; - 上述两种方式得到的结果都是属性
Name
的值Langshen
;
上面2中访问的方式可以获得同样的效果,是因为对象的属性是已经存在的,这里在延伸一下上述两种方式为对象新建属性时用法的区别。
首先,回到文章的开头。代码o[char]
表示的是o对象的一个属性值。那能不能用o.char
表示呢?答案是否定的。
原因是:
- 用o[char]
时,char
(var char = str.charAt(i))这个变量是变化的。
- 当i = 0;
,o[char]
和o.z
是等效的。表示为o对象创建了z属性。
- 当i = 1;
,o[char]
和o.h
是等效的。表示为o对象创建了h属性。
- 所以最后得到的对象为:o{z: 3, h: 3, a: 1, o: 2, c: 3}
,str中有多少种不同的字母,就给o对象创建了多少个属性。当然属性第1次创建是是空值,得到的布尔值是false。,后面赋值为1后,则布尔值转变为true,即完成了计数功能。
- 若将o[char]
替换为o.char
,最后得到的o{char:24}
只有一个char属性,它的值就是str字符串的长度,无法实现我们的要求。
总结:
- 在引用已有的对象属性时,并有属性名的情况下,用点和中括号是一样的;若属性是数组或者是对象,没有属性名,则要用类似数组元素引用的方式,用中括号+下标。例子参考;
- 在创建函数属性的时候,若属性名是已知的。用点和中括的的方式一样。若属性名是一组变量,则只能用中括号表示。中括号的灵活应用可以让代码变的很强大。