1、请给Array本地对象增加一个原型方法,它用于删除数组条目中重复的条目(可能有多个),返回值是一个包含被删除的重复条目的新数组。

Array.prototype.distinct = function() {
var ret = [];
for (var i = 0; i < this.length; i++)
{
for (var j = i+1; j < this.length;) {
if (this[i] === this[j]) {
ret.push(this.splice(j, 1)[0]);
} else {
j++;
}
}
}
return ret;
}
//for test
alert(['a','b','c','d','b','a','e'].distinct());

2、找出数组 arr 中重复出现过的元素

function duplicates(arr) {
var result = new Array();
arr.forEach(function(item){
if(arr.indexOf(item) !=arr.lastIndexOf(item) && result.indexOf(item) == -1){
result.push(item);
}
});
return result;
}

3、写一个函数使mySort(),能使传入的参数按照从小到大的顺序显示出来

function mySort() {
var tags = new Array();
for(var i = 0;i < arguments.length;i++) {
tags.push(arguments[i]);
}
tags.sort(function(compare1,compare2) {
return compare1- compare2;
});
return tags;
} var result = mySort(50,11,16,32,24,99,57,100);
console.info(result);

4、实现一个打点计时器,要求

1、从 start 到 end(包含 start 和 end),每隔 100 毫秒 console.log 一个数字,每次数字增幅为 1
2、返回的对象中需要包含一个 cancel 方法,用于停止定时操作
3、第一个数需要立即输出

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);
}
};
}

5、将数组 arr 中的元素作为调用函数 fn 的参数

function argsAsArray(fn, arr) {
return fn.apply(this, arr);
}

6、将函数 fn 的执行上下文改为 obj 对象

function speak(fn, obj) {
return fn.call(obj,obj);
}

7、实现函数 makeClosures,调用之后满足如下条件:

1、返回一个函数数组 result,长度与 arr 相同
   2、运行 result 中第 i 个函数,即 result[i](),结果与 fn(arr[i]) 相同

function makeClosures(arr, fn) {
return arr.map(function(item){
return function(){
return fn(item); }
});
}

8、已知函数 fn 执行需要 3 个参数。请实现函数 partial,调用之后满足如下条件:

  1、返回一个函数 result,该函数接受一个参数
  2、执行 result(str3) ,返回的结果与 fn(str1, str2, str3) 一致

function partial(fn, str1, str2) {
return function(str3){
return fn(str1,str2,str3);
}
}

9、useArguments,返回所有调用参数相加后的结果

function useArguments() {
return Array.prototype.reduce.call(arguments,function(a,b){
return a + b;
});
}

10、实现函数 callIt,调用之后满足如下条件

  1、返回的结果为调用 fn 之后的结果
  2、fn 的调用参数为 callIt 的第一个参数之后的全部参数

function callIt(fn) {
return fn.apply(this,Array.prototype.slice.call(arguments,1));
}

11、实现函数 partialUsingArguments,调用之后满足如下条件:

  1、返回一个函数 result
  2、调用 result 之后,返回的结果与调用函数 fn 的结果一致
  3、fn 的调用参数为 partialUsingArguments 的第一个参数之后的全部参数以及 result 的调用参数

function partialUsingArguments(fn) {
var args = [].slice.call(arguments, 1);
return function () {
return fn.apply(this, args.concat([].slice.call(arguments, 0)));
};
}

12、柯里化是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数且返回结果的新函数的技术

  已知 fn 为一个预定义函数,实现函数 curryIt,调用之后满足如下条件:
  1、返回一个函数 a,a 的 length 属性值为 1(即显式声明 a 接收一个参数)
  2、调用 a 之后,返回一个函数 b, b 的 length 属性值为 1
  3、调用 b 之后,返回一个函数 c, c 的 length 属性值为 1
  4、调用 c 之后,返回的结果与调用 fn 的返回值一致
  5、fn 的参数依次为函数 a, b, c 的调用参数

function curryIt(fn) {
//获取fn参数的数量
var n = fn.length;
//声明一个数组args
var args = [];
//返回一个匿名函数
return function(arg){
//将curryIt后面括号中的参数放入数组
args.push(arg);
//如果args中的参数个数小于fn函数的参数个数,
//则执行arguments.callee(其作用是引用当前正在执行的函数,这里是返回的当前匿名函数)。
//否则,返回fn的调用结果
if(args.length < n){
return arguments.callee;
}else return fn.apply("",args);
}
}

13、将给定数字转换成二进制字符串。如果字符串长度不足 8 位,则在前面补 0 到满8位。

function convertToBinary(num) {
var result = num.toString(2);
result=result.split("");
if(result.length<8){
for(var i=0;i<8-result.length;i++){
result.unshift(0);
}
}
return result.join("");
}

14、求 a 和 b 相乘的值,a 和 b 可能是小数,需要注意结果的精度问题

toFixed() 方法可把 Number 四舍五入为指定小数位数的数字

function multiply(a, b) {
return parseFloat((a*b).toFixed(10));
}

15、找出对象 obj 不在原型链上的属性(注意这题测试例子的冒号后面也有一个空格~)

  1、返回数组,格式为 key: value
  2、结果数组不要求顺序

function iterate(obj) {
var arr = [];
for(var key in obj){
if(obj.hasOwnProperty(key)){
arr.push(key+": "+obj[key]);
}
}
return arr;
}

16、给定字符串 str,检查其是否包含数字,包含返回 true,否则返回 false

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

17、给定字符串 str,检查其是否包含连续重复的字母(a-zA-Z),包含返回 true,否则返回 false

  在正则表达式中,利用()进行分组,使用斜杠加数字表示引用,\1就是引用第一个分组,\2就是引用第二个分组。
  将[a-zA-Z]做为一个分组,然后引用,就可以判断是否有连续重复的字母。

function containsRepeatingLetter(str) {
return /([a-zA-Z])\1/.test(str);
}

18、给定字符串 str,检查其是否符合如下格式

  1、XXX-XXX-XXXX
  2、其中 X 为 Number 类型

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

19、给定字符串 str,检查其是否符合美元书写格式

  1、以 $ 开始
  2、整数部分,从个位起,满 3 个数字用 , 分隔
  3、如果为小数,则小数部分长度为 2
  4、正确的格式如:$1,023,032.03 或者 $2.03,错误的格式如:$3,432,12.12 或者 $34,344.3

分析:

  首先,开头必是$,而正则表达式中$表示结尾,需要进行转义,因此开头为^\$
  然后$后必然接数字,并且最少一位,最多三位数,可用{m,n}表示,最少m位,最多n位,因此此段为\d{1,3}
  接着,后面如还有数,则必然有,分隔,并且后面必有3个数,类似于,XXX的格式会出现0或者n次,因此此段可表示为(,\d{3})*
  最后,如有小数部分,则注意对小数点进行转义,此段可表示为(\.\d{2})?
  因此,最后的正则表达式为/^\$\d{1,3}(,\d{3})*(\.\d{2})?$/
  使用test方法去检测str

function isUSD(str) {
return /^\$\d{1,3}(,\d{3})*(\.\d{2})?$/.test(str);
}

20、js 将多个空格替换为一个空格

str = str.replace(/\s+/g,'');

JS笔记-常见函数与问题的更多相关文章

  1. Data Visualization and D3.js 笔记(1)

    课程地址: https://classroom.udacity.com/courses/ud507 什么是数据可视化? 高效传达一个故事/概念,探索数据的pattern 通过颜色.尺寸.形式在视觉上表 ...

  2. js笔记-0

    #js笔记-0 数组: indexOf方法: Array也可以通过indexOf()来搜索一个指定的元素的位置: var arr = [10, 20, '30', 'xyz']; arr.indexO ...

  3. PPK谈JS笔记第一弹

    以下内容是读书笔记,再一次温习JS好书:PPK谈JS window.load=initializePageaddEventSimple('window','load',function(){}) lo ...

  4. 面向小白的JS笔记 - #Codecademy#学习笔记

    前言 最初浏览过<JavaScript秘密花园>,前一段时间读过一点点<JavaScript语言精粹>和一点点<JavaScript高级程序设计>(一点点是指都只是 ...

  5. require.js笔记

    笔记参考来源:阮一峰  http://www.ruanyifeng.com/blog/2012/10/javascript_module.html   1. 浏览器端的模块只能采用“异步加载”方式 = ...

  6. JS笔记 入门第四

    小测试: 注意:取消所有的设定可以直接使用 document.getElementById("txt").removeAttribute("style"); 这 ...

  7. JS笔记 入门第二

    输出内容 document.write(); alert("hello!"); alert(mynum); </script> 注:alert弹出消息对话框(包含一个确 ...

  8. Node.js笔记1

    Node.js入门笔记 1. node -help 可以显示帮助信息2. node REPL 模式(Read-eval-print loop) 输入—求值—输出循环 直接在cmd输入node 可以进入 ...

  9. JS笔记 入门第一

    WHY? 一.你知道,为什么JavaScript非常值得我们学习吗? 1. 所有主流浏览器都支持JavaScript. 2. 目前,全世界大部分网页都使用JavaScript. 3. 它可以让网页呈现 ...

随机推荐

  1. 关于PHP伪静态Rewrite设置

    Rewirte主要的功能就是实现URL的跳转和隐藏真实地址,基于Perl语言的正则 表达式规范.平时帮助我们实现拟静态,拟目录,域名跳转,防止盗链等   一.Apache配置:   1.支持httpd ...

  2. phpcms v9 二次开发 - 自己添加源文件

    一.在根目录添加入口文件, 我现在要在根目录添加一个文件名为test.php 这样一个文件,为了调用系统的公用类和函数,必须加入一下包含文件 test.php代码如下 <?phpdefine(' ...

  3. PHP获取指定年份指定月份的天数

    最近写接口的时候突然发现的非常实用的php函数,在这儿分享一下: cal_days_in_month(calender,$month,$year): calender:历法,常量,如CAL_GREGO ...

  4. discuz 和 wordpress 整合注意问题

    要先在应用列表里添加自己本身的应用即要保证同步操作,本身也是一个应用,并保证通信成功: 应用和ucenter不在一个机器上,IP都要设定: discuz/uc_client/ 下要有一个接收数据的da ...

  5. ubuntu 14.下 netbeans 自体锯齿 消除

    Ubuntu下NetBeans消除字体锯齿的方法 在netbeans.conf 文件的netbeans_default_options的最后添加 -J-Dswing.aatext=true -J-Da ...

  6. iOS开发之UIWebView自动滑动到顶部-备

    但可以通过subview来操作. 通常用UIWebView加载网页,有时候需要点击一个按钮,或者页面的某个部位,使页面自动滚动到顶部,但是UIWebView不像UIScrollView那么方便.   ...

  7. 深入理解querySelector(All)

          querySelector和querySelectorAll同属于Selectors API Level 1规范,该规范早在2006年就已经开始发展,并在2007年10月形成querySe ...

  8. Spark 启动过程(standalone)

    Spark启动过程 正常启动Spark集群时往往使用start-all.sh ,此脚本中通过调用start-master.sh和start-slaves.sh启动mater及workers节点. 1. ...

  9. The 500 Most Commonly Used Words in the English Language

    Based on the combined results of British English, American English and Australian English surveys of ...

  10. Eclipse插件管理

    Eclipse 的特色之一,就是它的插件功能.可以说, Eclipse 是一个插件的大集合,所有的模块都以插件的形式存在.那么,究竟什么是插件呢? 插件( plug-in ),即 Eclipse 的功 ...