- stringObject.split(separator,howmany)用于把一个字符串分割成字符串数组
- toString() 方法可把一个 Number 对象转换为一个字符串,并返回结果;num.toString(2)能直接将num转换为2进制数格式的字符串
- parseInt(string, radix) 可以将其它进制转换为十进制,第二个参数表明转换的数是什么进制
- 数字转字符用toString(),字符转数字用parseInt() or parse(float)
1. 请修复给定的 js 代码中,函数定义存在的问题
原题:
function functions(flag) {
if (flag) {
function getValue() { return 'a'; }
} else {
function getValue() { return 'b'; }
}
return getValue();
}
修复
function functions(flag) {
var getvalue=null;
if (flag) {
getValue = function(){ return 'a'; }
} else {
getValue = function() { return 'b'; }
}
return getValue();
}
- 这道题是考函数声明与函数表达式的区别,原题的写法,是在两个逻辑分支里面各有一个函数声明,但是对于函数声明,解析器会率先读取并且让其在执行任何代码前可用,意思就是别的代码还没运行呢,两个getValue声明已经被读取,所以总是执行最新的那个。函数表达式,当解析器执行到它所在的代码行时,才会真正被解释执行,所以两个逻辑分支可以分别执行
2. 实现一个打点计时器,要求
- 从 start 到 end(包含 start 和 end),每隔 100 毫秒 console.log 一个数字,每次数字增幅为 1
- 返回的对象中需要包含一个 cancel 方法,用于停止定时操作
- 第一个数需要立即输出
function count(start, end) {
console.log(start++);
var timer=setInterval(function(){
if(start<=end){
console.log(start++);
}else{
clearInterval(timer);
}
},100);
return {
cancel:function(){
clearInterval(timer);
}
}
}
3. 实现 fizzBuzz 函数,参数 num 与返回值的关系如下:
- 如果 num 能同时被 3 和 5 整除,返回字符串 fizzbuzz
- 如果 num 能被 3 整除,返回字符串 fizz
- 如果 num 能被 5 整除,返回字符串 buzz
- 如果参数为空或者不是 Number 类型,返回 false
- 其余情况,返回参数 num
function fizzBuzz(num) {
if(!num||typeof num!="number") return false;
var res="";
if(num%3==0){
res+="fizz"
}
if(num%5==0){
res+="buzz"
}
return res?res:num;
}
4. (函数传参)将数组 arr 中的元素作为调用函数 fn 的参数
function argsAsArray(fn, arr) {
return fn.apply(this,arr);
}
5. (修改this)将函数 fn 的执行上下文改为 obj 对象
- call/apply是直接调用目标函数,bind只是返回目标函数,并不调用,所以要用()执行函数
//三种方案
//apply
function speak(fn, obj) {
return fn.apply(obj);
}
//call
function speak(fn, obj) {
return fn.call(obj);
}
//bind
function speak(fn, obj) {
return fn.bind(obj)();
}
6. 实现函数 makeClosures,调用之后满足如下条件:
- 返回一个函数数组 result,长度与 arr 相同
- 运行 result 中第 i 个函数,即 resulti,结果与 fn(arr[i]) 相同
function makeClosures(arr, fn) {
var funArr=[];
for(var i=0;i<arr.length;i++){
(function(i){
funArr[i]=function(){
return fn(arr[i]);
}
})(i);
}
return funArr;
}
7.(二次封装)已知函数 fn 执行需要 3 个参数。请实现函数 partial,调用之后满足如下条件:
- 返回一个函数 result,该函数接受一个参数
- 执行 result(str3) ,返回的结果与 fn(str1, str2, str3) 一致
function partial(fn, str1, str2) {
function result(str3){
return fn.call(this,str1,str2,str3);
}
return result;
}
8.(使用arguments)函数 useArguments 可以接收 1 个及以上的参数。请实现函数 useArguments,返回所有调用参数相加后的结果。本题的测试参数全部为 Number 类型,不需考虑参数转换
function useArguments() {
var argArr=[].slice.call(arguments);
var sum=0;
argArr.forEach(function(item){
sum+=item;
});
return sum;
}
function useArguments() {
var args = Array.prototype.slice.call(arguments, 0);
return args.reduce(function(prev, curr, idx, arr) {
return prev + curr;
});
}
9.(使用apply)实现函数 callIt,调用之后满足如下条件
- 返回的结果为调用 fn 之后的结果
- fn 的调用参数为 callIt 的第一个参数之后的全部参数
function callIt(fn) {
var argArr=[].slice.call(arguments);
var newArg=argArr.slice(1);
return fn.apply(this,newArg);
}
10. 完成函数 createModule,调用之后满足如下要求:
- 返回一个对象
- 对象的 greeting 属性值等于 str1, name 属性值等于 str2
- 对象存在一个 sayIt 方法,该方法返回的字符串为 greeting属性值 + ', ' + name属性值
function createModule(str1, str2) {
function Object(){
this.greeting=str1,
this.name=str2
}
Object.prototype.sayIt=function(){
return this.greeting+ ', ' +this.name;
}
return new Object;
}
function createModule(str1, str2) {
var obj = {
greeting:str1,
name:str2,
sayIt:function(){
return this.greeting+', '+this.name;
}
}
return obj;
}
11.修改 js 代码中 parseInt 的调用方式,使之通过全部测试用例
- 输入'0x12',返回0
//按10进制去处理字符串,碰到非数字字符,会将后面的全部无视
function parse2Int(num) {
return parseInt(num,10);
}
- parseFloat()只解析十进制
function parse2Int(num) {
return parseFloat(num);
}
function parse2Int(num) {
var regex=/^\d+/;
num=regex.exec(num)[0];
return parseInt(num);
}
12. 获取数字 num 二进制形式第 bit 位的值。注意:
- bit 从 1 开始
- 返回 0 或 1
- 举例:2 的二进制为 10,第 1 位为 0,第 2 位为 1
function valueAtBit(num, bit) {
var s=num.toString(2);
return s[s.length-bit];
}
function valueAtBit(num, bit) {
var arr=num.toString(2).split("").reverse();
return arr[bit-1];
}
13. 给定二进制字符串,将其换算成对应的十进制数字
function base10(str) {
return parseInt(str,2);
}
14. 将给定数字转换成二进制字符串。如果字符串长度不足 8 位,则在前面补 0 到满8位。
function convertToBinary(num) {
var s=num.toString(2);
return "00000000".slice(s.length)+s;
}
15. 给定字符串 str,检查其是否包含连续重复的字母(a-zA-Z),包含返回 true,否则返回 false
function containsRepeatingLetter(str) {
return /([a-zA-Z])\1/.test(str);
}
15 给定字符串 str,检查其是否以元音字母结尾
1.字母包括a,e,i,o,u,以及对应的大写
- 返回 true,否则返回 false
function endsWithVowel(str) {
return /[a,e,i,o,u]$/i.test(str);
}
16 柯里化求和
function add(a){
function s(b){
a=a+b;
return s;
}
s.toString=function(){
return a;
}
return s;
}
console.log(add(1)(2)(3))
网友评论