目录
- reduce 连接n个数组
- n个数相加
- 闭包 函数内变量保持
- 将给定数字转换成二进制字符串
- 找出对象 obj 不在原型链上的属性
- 检查str是否包含数字
- 给定字符串 str,检查其是否包含连续的任意3个数字
- 检查字符串是否符合指定格式
- 检查其是否符合美元书写格式
一 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();
2) 直接调用
function Foo() {
var i = 0;
return function() {
console.log(i++);
}
}
Foo()()
四 将给定数字转换成二进制字符串
如果字符串长度不足 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
- 正确的格式如:2.03,错误的格式如: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