解决问题2
21.将一个任意长的数字变成逗号分隔的格式
方法一:
format_number(n){
let b=parseInt(n).toString();
let len=b.length;
if(len<=3){return b;}
let r=len%3;
return r>0?b.slice(0,r)+","+b.slice(r,len).match(/\d{3}/g).join(","):b.slice(r,len).match(/\d{3}/g).join(",");
},
方法二:
format_number(str){
return str=str.split('').reverse().join('').replace(/(\d{3})/g,'$1,').replace(/\,$/,'').split('').reverse().join('');
},
方法三:
formatText(str){
var _str=item.remainAmount.toString();
var _delimiter=',';
var regText='\\d{1,'+3+'}(?=(\\d{'+3+'})+$)';
var reg=new RegExp(regText,'g');
return _str.replace(/^(-?)(\d+)((\.\d+)?)$/,
function($0, $1, $2, $3) {
return $1 + $2.replace(reg, '$&,') + $3; })
}
方法四:
var s = '1234564656,000.00';
var d=s.replace(/(\d)(?=(\d{3})+(?!\d))/g, "$1,")
alert(d)
22. 尽可能全面正确的解析一个任意url的所有参数为Object
var url = 'http://www.domain.com/?user=anonymous&id=123&id=456&city=%E5%8C%97%E4%BA%AC&d&enabled';
parseParam(url);
结果:
{
user: 'anonymous',
id: [123, 456], // 重复出现的 key 要组装成数组,能被转成数字的就转成数字类型
city: '北京', // 中文
enabled: true, // 未指定值的 key 约定值为 true
}
23. 实现一个简单的模板引擎
render('我是{{name}},年龄{{age}},性别{{sex}}',{
name:'姓名',
age:18
})
// 结果: 我是姓名,年龄18,性别undefined。
var render = function(tpl,data){
return tpl.replace(
/{{(.+?)}}/g,
function(m,m1){
return data[m1]
})
}
//注释:/{{(.+?)}}/g:在全部范围内查找匹配前后有两组花括号的字符串
24. 有一个全局变量 a,有一个全局函数 b,实现一个方法bindData,执行后,a的任何赋值都会触发b的执行。
var a = 1;
function b(){
console.log('a的值发生改变');
}
bindData();
a = 2; // 此时输出 a的值发生改变
function bindData(target, event){
for(var key in target) {
if(target.hasOwnProperty(key)) {
(function(){
var v = target[key];
Object.defineProperty(target, key, {
get: function() {
return v;
},
set: function(_value) {
v = _value;
event.call(this)
}
})
})()
}
}
}
25. 实现一个 js 的 class ,名字叫做:AnimateToNum,功能是从某个数字递增或者递减到另外一个数字,并且不管数字如何变化,都可以在指定的时间内完成。
var AnimateToNum = require("animate-num");
var numAnim = new AnimateToNum({
animTime:2000, //每次数字变动持续的时间(ms),
initNum:500, //初始化的数字
onChange:function(num){
console.log(num);
}
});
numAnim.toNum(100); // 从500变化到100,用2000ms的时间,在onChange回调中会一直从500倒数到100
26. 递归
现提供几个读取文件的方法,不借助全局变量实现一个函数,函数可以执行一次后返回一个目录下所有文件中是 .js 后缀的文件列表
var readdirSync = function(dir_path){ return [filename] } // 读取一个文件夹下的所有文件夹和文件的路径列表(Array)
var isDirectory = function(path) { return true/false; } // 判断一个路径是否是文件夹
var existsSync = function(path){ return true/false;} // 判断一个文件/文件夹是否存在
var getJSFiles = function(path) {
}
getJSFiles('/code/'); // return 一个文件列表的数组
var getJSFiles = function(path) {
var result = [];
if(existsSync(path)) {
if(isDirectory(path)) {
var files = readdirSync(path);
files.forEach((file) => {
result = result.concat(getJSFiles(file));
});
} else if(/.js$/.test(path)) {
result.push(path);
}
}
return result;
}
27. 请封装一个 CustomFetch 方法,利用原生的 fetch api,但是实现以下几个需求:
所有请求默认带上一个 token,值是 xxx
请求返回的时候,内部解析内容,并且判断 success 字段是否是 true,如果不是,在 catch 中可以拿到一个Error,message 和 code 是接口返回的对应的内容
CustomFetch("http://api.com/api").then((data)=>{
console.log(data); // 如果后台返回 true
}).catch((e)=>{
console.log(e.message); // 输出 “查询错误”
});
// 接口的返回模式
{
success: false,
code: 'QUERY_ERROR',
data: {},
message: '查询错误'
}
28. 将数字转换成中文大写的表示,处理到万级别,例如 12345 -> 一万二千三百四十五
function toLowerNum(){
}
console.log(toLowerNum(12345)); // 输出 一万二千三百四十五
console.log(toLowerNum(10001)); // 输出 一万零一
console.log(toLowerNum(10011)); // 输出 一万零十一
console.log(toLowerNum(10000)); // 输出 一万
function toLowerNum(num){
var number = ['零', '一', '二', '三', '四', '五', '六', '七', '八', '九'] // 定义中文数字
var unit = ['', '十', '百', '千', '万'] // 定义中文基
var resultStr = []
var len = 0 // 数字长
var lastNumNotZero = false
while(num){
let n = num % 10
let u = len >= unit.length ? len % 5 + 1 : len % 5
// console.log(n, u, len)
// 添加基
// if(n || (len >= unit.length && lastNumNotZero))
if(
n // 当前位存在
|| // 或者
( u == unit.length - 1 && // u 和 长度均为 最后一位unit
len == unit.length - 1
)
)
resultStr.unshift(unit[u])
// 处理数
if(
n || lastNumNotZero // 当前位和前一位不都为零则处理
&&
u !== unit.length - 1 // 且当前位不为最后一位基
)
resultStr.unshift(number[n])
lastNumNotZero = !!n
len++
num = Math.floor(num / 10)
}
return resultStr.join('')
}
29. 算法题,实现一个函数,可以判断 a 字符串是否被包含在 b 字符串中
不能用原生api,自己实现一个字符串查找
我:
var b='abcabcdef'
var a='cde'
var j = 0;
var m=0;
var result = false;
for(var i=0;i<a.length;i++){
while(j<b.length&&a[i] != b[j]){
j++;
}
j++;
if(a[i]!=b[j]) m++
else m=0
}
if(m==a.length) result = true
http://blog.csdn.net/buaa_shang/article/details/9907183
var b='abcabcdef'
var a='cde'
var j = 0;
var m=0;
var result = false;
for(var i=0;i<a.length;i++){
while(j<b.length&&a[i] != b[j]){
j++;
}
j++;
if(a[i]!=b[j]) m++
else m=0
}
if(m==a.length) result = true
30. 下面五段代码分别输出什么?并且什么时候输出什么?
for(var i = 0; i < 5; i++) {
console.log(i);
}
for(var i = 0; i < 5; i++) {
setTimeout(function() {
console.log(i);
}, 1000 * i);
}
for(var i = 0; i < 5; i++) {
(function(i) {
setTimeout(function() {
console.log(i);
}, i * 1000);
})(i);
}
for(var i = 0; i < 5; i++) {
(function() {
setTimeout(function() {
console.log(i);
}, i * 1000);
})(i);
}
for(var i = 0; i < 5; i++) {
setTimeout((function(i) {
console.log(i);
})(i), i * 1000);
}
31. 判断一个点是否在多边形内
答:从当前点画一条水平射线,判断射线与多边形各条边相交多少次,偶数次就是在多边形内