JS基础

JS基础

1.数组indexOf方法有就返回下标,没有就返回-1
2.移除数组中的元素
for(var i=0;i<arr.length;i++){
if(item==arr[i]){
arr.splice(i,1);
i–;
}
}
3.在数组 arr 的 index 处添加元素 item。不要直接修改数组 arr,结果返回新的数组
newarr.splice(index,0,item)
4.找出数组 arr 中重复出现过的元素
for(var i=0;i<arr.length;i++){
for(var j=i+1;j<arr.length;j++){
if(arr[i]arr[j] && newarr.indexOf(arr[i])-1){
newarr.push(arr[i]);
}
}
}
5.直接操作本身数组用map映射方法Math.pow(i,2)
6.函数定义存在的问题
function functions(flag) {
if (flag) {
var getValue=function () { return ‘a’; }
} else {
var getValue=function () { return ‘b’; }
}
return getValue();
}
7.parseInt 的调用方式 return parseInt(num,10);
8.打点计时器
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)
}
}
}
9.输入内容是否为数字
typeof (num) != ‘number’
10.函数传参

function(){}  有参数时 fn.apply(this, arr);

无参数时 fn.apply(obj,obj);

调用函数可以使用call或者apply这两个方法,区别在于call需要将传递给函数的参数明确写出来,是多少参数就需要写多少参数。而apply则将传递给函数的参数放入一个数组中,传入参数数组即可。


function argsAsArray(fn, arr) {

return fn.apply(this, arr);
}
11.将函数 fn 的执行上下文改为 obj 对象
function speak(fn, obj) {return fn.apply(obj, obj);}
12.实现函数 functionFunction,调用之后满足如下条件:
1、返回值为一个函数 f
2、调用返回的函数 f,返回值为按照调用顺序的参数拼接,拼接字符为英文逗号加一个空格,即 ', ’
3、所有函数的参数数量为 1,且均为 String 类型
function functionFunction(str) {
return function(obj){
return str+", "+obj;
}
}
functionFunction(‘Hello’)(‘world’)

13.实现函数 makeClosures,调用之后满足如下条件:
1、返回一个函数数组 result,长度与 arr 相同
2、运行 result 中第 i 个函数,即 resulti,结果与 fn(arr[i]) 相同
function makeClosures(arr, fn) {
var result=[];
arr.forEach(function(e){
result.push(function(num){
return function(){
return fn(num);
};
}(e));
})
return result;
}

14.arguments用法
arguments能获得函数对象传入的参数组,类似与一个数组,能够通过length获取参数个数,能通过下标获取该位置的参数,但是它不能使用forEach等方法。

15.实现函数 callIt,调用之后满足如下条件
1、返回的结果为调用 fn 之后的结果
2、fn 的调用参数为 callIt 的第一个参数之后的全部参数

因为arguments并非真正的数组,因此要获得callIt的第一个参数之后的所有参数,不能直接使用slice方法截取,需要先将arguments转换为真正的数组才行。有两种常见的方法,一是使用slice方法:var args = Array . prototype . slice . call ( arguments );二是循环遍历逐一填入新数组。在获得了args之后,就可以调用apply来执行传入的函数参数。

第一种方法:
function callIt(fn) {
		var newarr=[];
		for(var i=1;i<arguments.length;i++){
    			newarr.push(arguments[i]);
		}
		var result=fn.apply(null,newarr);
		return result;
}
第二种方法:
function callIt(fn) {
		var newarr=Array.prototype.slice.call(arguments,1);
		var result=fn.apply(null,newarr);
		return result;
}

16.已知函数 fn 执行需要 3 个参数。请实现函数 partial,调用之后满足如下条件:
1、返回一个函数 result,该函数接受一个参数
2、执行 result(str3) ,返回的结果与 fn(str1, str2, str3) 一致

function partial(fn, str1, str2) {
		function result(str3){
    			return fn.call(this,str1,str2,str3);
		}
		return result;
}

apply添加参数只能是数组

17.二次封装函数
实现函数 partialUsingArguments,调用之后满足如下条件:
1、返回一个函数 result
2、调用 result 之后,返回的结果与调用函数 fn 的结果一致
3、fn 的调用参数为 partialUsingArguments 的第一个参数之后的全部参数以及 result 的调用参数
function partialUsingArguments(fn) {
var newarr=[];
for(var i=1;i<arguments.length;i++){
newarr.push(arguments[i]);
}
var result= function(){
return fn.apply(null,newarr.concat([].slice.call(arguments))); ///args.concat([].slice.call(arguments)将参数转化为数组,然后合并
}
return result;
}

18.柯里化
已知 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) {
var length = fn.length,
args = [];
var result = function (arg){
args.push(arg);
length --;
if(length <= 0 ){
return fn.apply(this, args);
} else {
return result;
}
}
return result;
}

19.模块
完成函数 createModule,调用之后满足如下要求:
1、返回一个对象
2、对象的 greeting 属性值等于 str1, name 属性值等于 str2
3、对象存在一个 sayIt 方法,该方法返回的字符串为 greeting属性值 + ', ’ + name属性值
function createModule(str1, str2) {
var dd={
greeting:str1,
name:str2,
sayIt: function(){
return this.greeting+", "+this.name;
}
};
return dd;
}

20.二进制转换
一.获取数字 num 二进制形式第 bit 位的值。注意:
1、bit 从 1 开始
2、返回 0 或 1
3、举例:2 的二进制为 10,第 1 位为 0,第 2 位为 1
function valueAtBit(num, bit) {
return (num>>(bit-1)&1);
}
&1 和1按位与
二.给定二进制字符串,将其换算成对应的十进制数字

parseInt方法可以将其它进制转换为十进制,只需要给该方法传入需要转换的字符串和该字符串的进制表示两个参数即可。

function base10(str) {

	/**
    其它进制转十进制
    
	parseInt(str,2)
    
	parseInt(str,8)
    
	parseInt(str,16)
*/

	return parseInt(str,2);

}

三.将给定数字转换成二进制字符串。如果字符串长度不足 8 位,则在前面补 0 到满8位
function convertToBinary(num) {
		var num1=num.toString(2).split("");
		while(num1.length<8){
    			num1.unshift("0");
		}
		var num2=num1.join("");
		return num2;
}

21.批量改变对象的属性
给定一个构造函数 constructor,请完成 alterObjects 方法,将 constructor 的所有实例的 greeting 属性指向给定的 greeting 变量。
function alterObjects(constructor, greeting) {
return constructor.prototype.greeting=greeting;
}

22.属性遍历
找出对象 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;
}

23.检查重复字符串
给定字符串 str,检查其是否包含连续重复的字母(a-zA-Z),包含返回 true,否则返回 false
function containsRepeatingLetter(str) {
for(var i=0;i<str.length;i++){
if(str[i]==str[i+1] && isNaN(str[i])){
return true;
}
}
return false;
}
function containsRepeatingLetter(str) {
var dd=/[a-zA-Z]\1/g;
return dd.test(str);
}

24.获取指定字符串
给定字符串 str,检查其是否包含 连续3个数字
1、如果包含,返回最新出现的 3 个数字的字符串
2、如果不包含,返回 false
function captureThreeNumbers(str) {
var dd=str.match(/\d{3}/);
if(dd){
return dd[0];
}else return false;
}

25.判断是否符合 USD 格式
给定字符串 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})?$/

function isUSD(str) {
		var ss=/^\$\d{1,3}(,\d{3})*(\.\d{2})?$/
	 return ss.test(str);
}	
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值