今天是js基础的最后一天。晚自习做的测试。
关于这次测试感觉蛮可惜的,至少错一道题,多则四五道。
这一道题选择C,因为C是显性类型转换。
其余选项,
A、字符串拼接—Number转字符串。
B、字符串转Number。
D、任意类型转换成布尔型
其他的题今天不说,如果真的有错的我会无能狂怒一会儿。
今天的主角是一道大题,不说有多难,但是很巧妙。
题目如下:
统计字符串 'abcoefoxyozzopp' 中每个字符出现的次数。
先说我写的方法:
var str = 'abcoefoxyozzopp'; var arr = []; var num = 0; // 计数器 // 将字符串转换成数组 for (var i = 0; i arr[i] = str.charAt(i); } // 数组排序 arr.sort(); // 见后文 for (var i = 0; i if (arr[i] != arr[i + 1]) { document.write(arr[i] + ":" + ++num + "个" + "
"); num = 0; }else { num++; }}
首先我要说这并不是一个很聪明的办法。不过,用的知识点相对较少,逻辑方面也比较好理解。
先来说一下思路:
1、将字符串排序,排序方法用的是转换成数组,然后用数组的内置排序方法Array.sort();
2、排序过后重复的代码就会‘扎堆’出现在一起,这是我们只需要对比前后两个字符是否相同,如果相同就让计数器加1,如果不同就返回计数器的数。(可以参考一下斐波那契函数的思考方式)
转换数组我用了一个相对愚蠢的方法——字符串指定‘索引’获取值+for循环。相比较有一个更好的方法是使用字符串自带的转数组方法:String.split()。
注意:这里的参数写空字符串“”,否则会返回一个整体。
之后的代码就很好理解了,但是仍然要提示一点的是,计数器num是一个全局变量。因为每一次for循环都可能改变计数器的值,所以在计算完一个字符并输出之后一定要记着将计数器归零。
还有一个很不错的想法,同样是比较好理解的。
var str = 'abcoefoxyozzopp';//循环的套出每个字符出现的次数 str会慢慢的变短直到为空while (str != "") { //字符串转数组 var arr = str.split(""); var num = 0; //求第一个字符出现的次数 for (var i = 0; i < arr.length; i++) { if (arr[0] == arr[i]) { num++; } } //在字符串中删掉跟第一个字符一样的所有字符 var re = arr[0]; str = str.replace(re, ""); document.write(arr[0] + ":" + num + "个" + "
"); }
这一方法的难度是在于想到这一方法。一旦有了思路代码就脱口而出了。
思路:
我们只需要专心统计每一个值,统计完之后删除即可。最后我们会把所有的字符全部删掉,当字符串为空时结束循环。
需要说明一下,删除数组元素的方法有很多,我选择了一个相对比较简单的——数组元素替换(String.replace(x,y);).其他方式都可以,今天也学了很多,自己可以玩一玩,不一一举例了。
如果发现这一步很难进行下去可以选择性的放弃。不过有w3cschool,菜鸟教程,MDN,我相信问题应该不大。
最后一个也是我想着重说的一个,需要一定的编程思想,不过这个‘一定’也只是一丢丢。
var str = 'abcoefoxyozzopp';var obj = {};var i = 0;for (i = 0; i < str.length; i++) { key = str[i]; if (obj[key]) { //对象中有这个字母 obj[key]++; }else { //对象中没有这个字母,把字母加到对象中 obj[key] = 1; }}//遍历这个对象 for (var key in obj){ document.write(key + ":" + obj[key] + "个" + "
");}
使用这个方法是最"标准"的,通过键值对的方式输出字符串中出现的字符和字符的个数。
我们把键当做字符,value当做计数器。
值得注意的有两点:
1、声明变量的时候不要赋值undefined。第一篇关于JS的笔记就说了,undefined有自身的含义,所以永远不要显性将对象设置为undefined。
2、第一步判断 if (obj[key]) {},如果obj[key]没有初始化的话,值为undefined,undefined转换为布尔型是flase,此时向value中添加计时器。
使用这种方法我们不用将字符串变成数组,因为我们只需要遍历字符串即可,不需要做任何修改。而字符串是可以通过‘索性’遍历的。
为了安慰同桌小姐姐说这个方法不太重要,实际上自己都觉得有点些违心。不过没关系,我们才学到基础。API也是基础。学到高级再理解这几行代码应该就so easy了。
补充一点:
如果我们可以想到这种思路,那对于这种方法我们可以将其简写成:
for (var i = 0, l = str.length; i < l; i++) { obj[str[i]] = (obj[str[i]] + 1) || 1;}
没错就是短路运算(第一篇笔记中也有写过)。
最后的废话。
又一次分别,这次是博哥。物是人非事事休,欲语泪先流。
明天是老狗,狗哥,MC HotDog,我是差不多先生~
API,DOM真的很重要!
这次也许真的会掉头发!