[JS基础] 小题走一波

294 阅读3分钟

目录

  1. reduce 连接n个数组
  2. n个数相加
  3. 闭包 函数内变量保持
  4. 将给定数字转换成二进制字符串
  5. 找出对象 obj 不在原型链上的属性
  6. 检查str是否包含数字
  7. 给定字符串 str,检查其是否包含连续的任意3个数字
  8. 检查字符串是否符合指定格式
  9. 检查其是否符合美元书写格式

一 reduce 连接n个数组


function concat(...args){
    return args.reduce((prev,cur)=>{
        return prev.concat(cur); 
    },[])
};
concat([1,2],[3,4],[5,6])
// [1, 2, 3, 4, 5, 6]
function concat(...args){
    return args.reduce((prev,cur)=>  prev.concat(cur),[]); // 箭头函数省略内部return
};
concat([1,2],[3,4],[5,6])
// [1, 2, 3, 4, 5, 6]

二 n个数相加

1) es5

function add(){
    let args = [].slice.call(arguments);
    // 或 Array.prototype.slice.call(arguments);
    let nums=0;
    for(let i=0; i<args.length; i++){
        nums += args[i]
    }
    return nums;
}
add(1,3,5,6,7); //22

2) es6

function add(...args){
    let nums=0;
    for(let i=0; i<args.length; i++){
        nums += args[i]
    }
    return nums;
}
add(1,3,5,6,7); //22

三 闭包 函数内变量保持

闭包; 首先返回的function函数赋值给全局变量f1,因此function函数就被储存在了内存中,因为foo函数是function函数的父函数,于是foo函数和局部变量i也被存在了内存。之后f1()被调用了两次,第一次调用时i=0,因为是i++,先输出i的值0,然后再++;

第二次调用是i=1,所以先输出1;而f2是一个新的变量,因此i的值初始化为0。

1) 分两次调用,存储临时变量

function Foo() {
    var i = 0;
    return function() {
        console.log(i++);
    }
}
 
var f1 = Foo(),
    f2 = Foo();
f1();
f1();
f2();

image.png

2) 直接调用

function Foo() {
    var i = 0;
    return function() {
        console.log(i++);
    }
}
 
Foo()()

image.png

四 将给定数字转换成二进制字符串

如果字符串长度不足 8 位,则在前面补 0 到满8位

function convertToBinary(num) {
    var s=num.toString(2);//toString方法将num转为2进制数形式
    var len=s.length;
    if(len<8){
       //声明一个字符串用于补满0
       var s1="0000000"; 
       var s2=s1.slice(0,8-len);
       s=s2+s;
    }
  return s;  
}
convertToBinary(1)
// '00000001'

五 找出对象 obj 不在原型链上的属性

  • 返回数组,格式为 key: value
  • 结果数组不要求顺序
function iterate(obj) {
    var arr=[];//存放返回数组
    for(var key in obj){
        if(obj.hasOwnProperty(key)){
              arr.push(key+": "+obj[key]);
         }            
        }
    return arr;
}
let obj={a:1}; obj.b=2
iterate(obj);
// ['a: 1', 'b: 2']

六 检查str是否包含数字

function containsNumber(str){
    let reg = /\d/;
    return reg.test(str);
};

var str = '112837994012370'; 
var str1 = '%%$abc*'; 
containsNumber(str); // true
containsNumber(str1); // false

七 给定字符串 str,检查其是否包含连续的任意3个数字 

  • 如果包含,返回最新出现的 3 个数字的字符串
  • 如果不包含,返回 false
function captureThreeNumbers(str) {
    //声明一个数组保存匹配的字符串结果
    var arr = str.match(/\d{3}/);
    //如果arr存在目标结果,则返回第一个元素,即最早出现的目标结果
    if(arr){
        return arr[0];
    }else {
        return false;
    }
};
var str = '1235'; var str1 = '21a';
captureThreeNumbers(str)
// '123'
captureThreeNumbers(str1)
// false

八 检查字符串是否符合指定格式

  • XXX-XXX-XXXX
  • 其中 X 为 Number 类型

/正则表达式的开头和结尾一定要加上^,$,
//3个数的正则写成\d{3},4个数的正则要写成\d{4},所以按照要求写应该为/^\d{3}-\d{3}-\d{4}/,
//这种形式进行合并之后为/^(\d{3}-){2}\d{4}/;其中中间的2表示的是两遍的意思。

function matchesPattern(str) {
    return /^\d{3}-\d{3}-\d{4}$/.test(str);
}


function matchesPattern(str){
    return /^(\d{3}-){2}\d{4}/g.test(str);
}
var str = '123-111-1111'; 
var str1 = '1123-111-1111'; 
matchesPattern(str)
// true

matchesPattern(str1);
// false

检查其是否符合美元书写格式

  • 以 $ 开始
  • 整数部分,从个位起,满 3 个数字用 , 分隔
  • 如果为小数,则小数部分长度为 2
  • 正确的格式如:1,023,032.03或者1,023,032.03 或者 2.03,错误的格式如:3,432,12.12或者3,432,12.12 或者 34,344.3
//正则表达式分为四部分
$符:开头必是$,而正则表达式中$表示结尾,需要进行转义,因此开头为^\$
匹配紧跟$符的数字:(0|[1-9]|[1-9]\d{0,2})
匹配逗号和跟在逗号后面的数字(,\d{3})*
匹配点号和小数位(\.\d{2})?
function isUSD(str) {
    return /^\$(0|[1-9]\d{0,2})(,\d{3})*(\.\d{2})?$/.test(str);
}
var str = '$1,023,032.03';
var str1 = '$3,432,12.12';
isUSD(str); // true
isUSD(str1); // false