每个一秒输出一个值;闭包和setTimeOut函数
for (var i = 0; i < 5; i++) { window.setTimeout(function(j){ return function(){ console.log(j); } }(i),1000); }
注意:对i值的引用,console的应该是传入的字符copy的j值;否则最后调用i的时候都会是5;
用函数对事件函数进行封装,这样每一个函数和传入的i都拥有自己独立的作用域,所以每个i都是不一样的。考察对象属性名的基本定义,对象自动转换成字符串
var a = {}; var b = {key:'b'}; var c = {key:'c'}; a[b] = 123; a[c] = 456; console.log(a[b]); //输出应该是 456
js的对象属性值是字符串,如果你定义的
name
不是字符串,就会调用这个name
的toString() 方法变成字符串来计算;b.toString() // "[object Object]" a // {[object Object]: "123"}
考察基本闭包: 处输出值是?
var func = function(){ var secret = 'secret'; return { get_secret: function(){ return secret; }, change_secret: function(new_secret){ secret = new_secret; } }; }; var test = func(); console.warn(test.get_secret()); console.warn(test.secret); console.warn(test.change_secret("a new secret")); console.warn(test.get_secret()); //secret //undefined //undefined //a new secret
第三个应该是输出
undefined
,而不是什么都不输出,因为在js中,一个函数总会返回一个值,如果没有指定返回值,则返回undefined。考察数组去重,但不能够自动转换类型;
var noRepeat = function(oArr){ var aArr = []; for (var i = 0; i < oArr.length; i++) { var isIn = false; for (var j = 0; j < aArr.length; j++) { if (aArr[j]===oArr[i]) { isIn = true; break; } } if (!isIn) { aArr.push(oArr[i]); } } return aArr; }; var originArr = [0,1,2,3,'1','3','4','3',0,3,3,2,4]; var afterArr = noRepeat(originArr); console.log(afterArr);
基本方法是定义一个新的数组,遍历原数组,对于原数组中的每个值,遍历新数组,当新数组中有值时,将布尔值isIn设为true,并跳出内层循环,若isIn没有变还是false,就在新数组中添加当前元素值。最后返回新数组;
考察字符串知识
var s1 = 'youareindeedalovelygirliloveyousomuch'; var s2 = 'arechmusoyouelovilgirclovlyeaineeddyou'; var findAn = function(s1,s2){ sArr1 = s1.split(''); sArr2 = s2.split(''); sArr1.sort(); sArr2.sort(); for (var i = 0; i < sArr1.length; i++) { if (sArr1[i]!==sArr2[i]) { return sArr2[i]; } } return sArr2[sArr2.length-1]; }; var chara = findAn(s1, s2); console.log(chara);
先使用字符串的split方法将字符串变为数组,然后用sort方法进行排序,排序之后判断对应位置的字符,若不相等,则s2的当前字符就是多余的;
查找字符串中出现的最多的字符和个数
var searchMChar = function(str){ var obj = {}; for (var i = 0; i < str.length; i++) { obj[str[i]] = obj[str[i]]===undefined?1:obj[str[i]]+1; } console.log(obj); var maxCount = obj[str[0]]; var maxName = str[0]; for(var c in obj){ if (obj[c]>maxCount) { maxCount = obj[c]; maxName = c; } } return { maxCount: maxCount, maxName: maxName }; }; var str = "she's a lovely lovely girl!"; var obj = searchMChar(str); console.log(obj);
使用一个对象来保存每个字符和对应出现的次数;注意在对象存执的时候是可以直接根据属性名获取相应的属性值,不用判断属性名和当前字符相等时才进行操作。。。
另外,属性没有时,其值为undefined。
另外,还可以使用正则的方式来计算:var searchMChar = function (str){ var num=0; var value=null; var new_str=str.split("").sort().join("");//得到排序后的新的字符串 var re=/(\w)\1+/g; //只匹配字符 //没有\1,re就是一整个排好序的字符串 //有了\1就是出现过的有重复的取出来,\1表示跟前面第一个子项是相同的 //捕获组 new_str.replace(re,function($0,$1){ //$0代表取出来重复的一个个整体,如[s,s...],[f,f..],[d,d....] //$1代表这个整体里的字符 console.log($0,$1); if(num<$0.length){ num=$0.length; value=$1; } }); return { maxCount: num, maxName: value }; }; var str = "she's a lovely lovely girl!"; var obj = searchMChar(str); console.log(obj);
在字符串的匹配方法中,有一个replace方法,它的第二个参数可以是函数,函数的参数是如下定义的:
当没有捕获组的时候,函数有三个参数:模式的匹配项、模式匹配项子字符串中的位置、原字符串
当有捕获组的时候,函数的第二个参数以及之后分别是对应的捕获组,模式匹配项子字符串中的位置、原字符串是最后两个参数。
正则每匹配一个字符串的项,就会传入函数中进行处理;
以上一些算法是对字符串和数组的操作等,但是大多没有考虑到算法优化的问题。
参考资料:
【1】 Js练习题之查找字符串中出现最多的字符和个数 http://www.cnblogs.com/zhangwenkan/p/4206208.html