摘要:準(zhǔn)備面試的刷題過(guò)程中,遇到了一些題,比較有意思,輕巧??杀硎救缦陆o出參數(shù)表示當(dāng)前字符串中從下標(biāo)為的字符開(kāi)始的長(zhǎng)度為的一個(gè)子串。反反拼接新的字符串結(jié)合,返回二維數(shù)組中每個(gè)一維數(shù)組的最大值用實(shí)現(xiàn)一個(gè)數(shù)組合并的方法要求去重。
準(zhǔn)備面試的刷題過(guò)程中,遇到了一些題,比較有意思,輕巧。
加強(qiáng)運(yùn)用一下js原生語(yǔ)法,多解。
題目來(lái)源:https://github.com/rmurphey/j...
A test-driven approach to assessing JS skills
統(tǒng)計(jì)數(shù)組 arr 中值等于 item 的元素出現(xiàn)的次數(shù)
function count(arr, item) { var count = 0; arr.forEach(function(e){ //e為arr中的每一個(gè)元素,與item相等則count+1 e == item ? count++ : 0; }); return count; } function count(arr, item) { return arr.filter(function(a){ return (a==item); }).length } function count(arr, item) { var res; return (res = arr.toString().match(new RegExp(""+item+"","g")))?res.length:0; } function count(arr, item) { var count = 0; arr.map(function(a) { if(a === item) { count++; } }); return count; }
為數(shù)組 arr 中的每個(gè)元素求二次方。不要直接修改數(shù)組 arr,結(jié)果返回新的數(shù)組
function square(arr) { return arr.map(function(item,index,array){ return item*item; }) } function square(arr) { //聲明一個(gè)新的數(shù)組存放結(jié)果 var a = []; arr.forEach(function(e){ //將arr中的每一個(gè)元素求平方后,加入到a數(shù)組中 a.push(e*e); }); return a; } function square(arr) { //復(fù)制一個(gè)arr數(shù)組 var newarr = arr.slice(0); for (var i=0;i將數(shù)組 arr 中的元素作為調(diào)用函數(shù) fn 的參數(shù)
function argsAsArray(fn, arr) { return fn.apply(this, arr); } function argsAsArray(fn, arr) { return function(para1,para2){ return para1.apply(this,para2); }(fn,arr); }完成函數(shù) createModule,調(diào)用之后滿足如下要求:
1、返回一個(gè)對(duì)象
2、對(duì)象的 greeting 屬性值等于 str1,name 屬性值等于 str2
3、對(duì)象存在一個(gè) sayIt 方法,該方法返回的字符串為 greeting屬性值 + ", " +name屬性值function createModule(str1, str2) { var obj = { greeting : str1, name : str2, sayIt : function(){ //兩個(gè)屬性前面都需要加上this return this.greeting+", "+this.name; } }; return obj; } //使用構(gòu)造函數(shù)法 function createModule(str1, str2) { function Obj(){ this.greeting = str1; this.name = str2; this.sayIt = function(){ return this.greeting + ", " + this.name; }; } return new Obj(); } //構(gòu)造函數(shù)與原型組合 function createModule(str1, str2) { function CreateMod(){ this.greeting = str1; this.name = str2; } CreateMod.prototype.sayIt = function(){ return this.greeting + ", " + this.name; } return new CreateMod(); }已知 fn 為一個(gè)預(yù)定義函數(shù),實(shí)現(xiàn)函數(shù) curryIt,調(diào)用之后滿足如下條件:
1、返回一個(gè)函數(shù) a,a 的 length 屬性值為1(即顯式聲明 a 接收一個(gè)參數(shù))
2、調(diào)用 a 之后,返回一個(gè)函數(shù) b, b 的 length 屬性值為 1
3、調(diào)用 b之后,返回一個(gè)函數(shù) c, c 的 length 屬性值為 1
4、調(diào)用 c 之后,返回的結(jié)果與調(diào)用 fn 的返回值一致
5、fn的參數(shù)依次為函數(shù) a, b, c 的調(diào)用參數(shù)輸入例子:
var fn = function (a, b, c) {return a + b + c}; curryIt(fn)(1)(2)(3);function curryIt(fn) { //獲取fn參數(shù)的數(shù)量 var n = fn.length; //聲明一個(gè)數(shù)組args var args = []; //返回一個(gè)匿名函數(shù) return function(arg){ //將curryIt后面括號(hào)中的參數(shù)放入數(shù)組 args.push(arg); //如果args中的參數(shù)個(gè)數(shù)小于fn函數(shù)的參數(shù)個(gè)數(shù), //則執(zhí)行arguments.callee(其作用是引用當(dāng)前正在執(zhí)行的函數(shù),這里是返回的當(dāng)前匿名函數(shù))。 //否則,返回fn的調(diào)用結(jié)果 if(args.length < n){ return arguments.callee; }else return fn.apply("",args); } } function curryIt(fn) { return function a(xa){ return function b(xb){ return function c(xc){ return fn.call(this,xa,xb,xc); }; }; }; }數(shù)組中輸出元素位置
function indexof(arr,item){ for(var i = 0,len = arr.length;i數(shù)組求和
function sum(arr) { return eval(arr.join("+")); };刪除給定元素
function remove(arr, item) { for(var i=0, m=arr.length, res=[]; i-1;i=newA.indexOf(item)){ newA.splice(i,1); } return newA; } 將函數(shù)放入數(shù)組,參數(shù)放入函數(shù),調(diào)用數(shù)組里面的函數(shù),返回函數(shù)執(zhí)行的結(jié)果。
function makeclosures(arr,fn){ var funcs = []; for(var i = 0;i將函數(shù)a暫時(shí)保存在一個(gè)內(nèi)建函數(shù)result中,返回這個(gè)result函數(shù),再執(zhí)行.(有閉包,call/apply)
partialUsingArguments(test,a,b)(c,d);//用法 function partialUsingArguments(fn){ var args1 = Array.prototype.slice.call(arguments,1); var result = function(){ var args2 = Array.prototype.slice.call(arguments,0); var args = args1.concat(args2); return fn.apply(null,args); } return result; }判斷字符串是否連續(xù)重復(fù)(若是,則返回true)
function containRepeatingLetter(str){ var re = /[a-zA-Z]/; for(var i = 0,len = str.length;i如下的結(jié)果是?
var m= 1, j = k = 0; function add(n) { return n = n+1; } y = add(m); //4 function add(n) { return n = n + 3; } z = add(m); //4所有聲明的函數(shù)都會(huì)被提前。所以function add(){}定義的函數(shù)會(huì)優(yōu)先解析,而不是順序解析;因此整個(gè)過(guò)程中,首先依次解析兩個(gè)add function,由于同名,所以后者會(huì)覆蓋前者;然后,順序解析其余的JS代碼,y = add(m);語(yǔ)句和z = add(m); 語(yǔ)句調(diào)用的都是第二個(gè)add function,因此返回的都是4.
如下的結(jié)果是?
(function() { var a = b = 5; })(); console.log(b); //5 console.log(a); //a is not definedvara=b=5;其中var a表示a為當(dāng)前作用域的全局變量,b=5并沒(méi)有定義為當(dāng)前作用域的全局變量,它會(huì)申明提前在全局作用域中。
可表示如下:var b=5; (function() { var a = b ; })(); console.log(b); //5 console.log(a); //a is not defined給出參數(shù) str,start,end 表示當(dāng)前字符串中從下標(biāo)為 start 的字符開(kāi)始的長(zhǎng)度為 end
的一個(gè)子串。你要將這個(gè)子串左右翻轉(zhuǎn)后插在這個(gè)子串原來(lái)位置的正后方,求最后得到的字符串是什么。function reverseString(str,start,end){ var slice = str.slice(start,end); var sliceReverse = slice.split("").reverse().join(""); //string -> array ->反array -> 反string var reverseString = str.slice(0,start+end)+sliceReverse+str.slice(start+end); //拼接新的字符串 return reverseString; }apply,bind(es5)結(jié)合,返回二維數(shù)組中每個(gè)一維數(shù)組的最大值
function largestOfFour(arr) { return arr.map(Function.apply.bind(Math.max, null)); } largestOfFour([[4, 5, 1, 3], [13, 27, 18, 26], [32, 35, 37, 39], [1000, 1001, 857, 1]]);用JS實(shí)現(xiàn)一個(gè)數(shù)組合并的方法(要求去重)。
var arr1 = ["a"]; var arr2 = ["b", "c"]; var arr3 = ["c", ["d"], "e", undefined, null]; var concat = (function(){ // concat arr1 and arr2 without duplication. var concat_ = function(arr1, arr2) { for (var i=arr2.length-1;i>=0;i--) { arr1.indexOf(arr2[i]) === -1 ? arr1.push(arr2[i]) : 0; } }; // concat arbitrary arrays. // Instead of alter supplied arrays, return a new one. return function(arr) { var result = arr.slice(); for (var i=arguments.length-1;i>=1;i--) { concat_(result, arguments[i]); } return result; }; }());為字符串實(shí)現(xiàn)一個(gè)render方法,實(shí)現(xiàn)下面的變量替換功能
var greeting = "my name is $(name),age $(age)"; var result = greeting.render({name:"XiaoMing",age:11}); console.log(result); // my name is XiaoMing,age 11answer:
String.prototype.render = function(option){ var s = this, reg; Object.keys(option).forEach(function(k){ reg = new RegExp("$("+k+")","g"); s = s.replace(reg,option[k]) }); return s }; var greeting = "my name is $(name),age $(age)"; var result = greeting.render({name:"XiaoMing",age:11}); console.log(result); // my name is XiaoMing,age 11取字符串中間的字符,奇數(shù)取1,偶數(shù)取2
function getMiddle(str){ return str.substr(Math.ceil(str.length/2-1),str.length % 2 == 0 ? 2: 1) } var p1 = getMiddle("test"); //es var p2 = getMiddle("testing"); //t var p3 = getMiddle("middle"); //dd var p4 = getMiddle("A"); //A
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/80362.html
摘要:翻譯行代碼創(chuàng)造模板引擎一想看博客原文鏈接,請(qǐng)點(diǎn)擊下方一個(gè)非常好用的學(xué)習(xí)正則表達(dá)的網(wǎng)站正則表達(dá)式圖文解說(shuō)網(wǎng)站譯文事情的起因,我想編寫(xiě)一個(gè)邏輯簡(jiǎn)單的模板引擎,它可以很好滿足我現(xiàn)在的需求。,表示全局匹配。 翻譯_20行代碼創(chuàng)造JavaScript模板引擎(一) 想看博客原文鏈接,請(qǐng)點(diǎn)擊下方 JavaScript template engine in just 20 lines 一個(gè)非常好用...
摘要:原文鏈接譯者吐槽只收藏不點(diǎn)贊都是耍流氓前言我仍舊在為我的預(yù)處理器進(jìn)行開(kāi)發(fā)工作。它原本是一個(gè)預(yù)處理器,但之后它擴(kuò)展成為了預(yù)處理器,很快它將支持到的轉(zhuǎn)換。 原文鏈接:JavaScript template engine in just 20 lines (譯者吐槽:只收藏不點(diǎn)贊都是耍流氓) 前言 我仍舊在為我的JS預(yù)處理器AbsurdJS進(jìn)行開(kāi)發(fā)工作。它原本是一個(gè)CSS預(yù)處理器,但之后它擴(kuò)...
摘要:模塊化是隨著前端技術(shù)的發(fā)展,前端代碼爆炸式增長(zhǎng)后,工程化所采取的必然措施。目前模塊化的思想分為和。特別指出,事件不等同于異步,回調(diào)也不等同于異步。將會(huì)討論安全的類(lèi)型檢測(cè)惰性載入函數(shù)凍結(jié)對(duì)象定時(shí)器等話題。 Vue.js 前后端同構(gòu)方案之準(zhǔn)備篇——代碼優(yōu)化 目前 Vue.js 的火爆不亞于當(dāng)初的 React,本人對(duì)寫(xiě)代碼有潔癖,代碼也是藝術(shù)。此篇是準(zhǔn)備篇,工欲善其事,必先利其器。我們先在代...
摘要:由我所在的團(tuán)隊(duì)共同翻譯完成,并發(fā)布在前端技術(shù)公眾號(hào)方凳雅集上,轉(zhuǎn)載于此。在移動(dòng)端,客戶(hù)端渲染很難獲得并保持一個(gè)較快的渲染速度。使用技術(shù)進(jìn)行服務(wù)端渲染的主要問(wèn)題在于它會(huì)對(duì)可交互時(shí)間有明顯的負(fù)面影響,盡管它縮短了首次繪制時(shí)間 本文簡(jiǎn)單介紹了web應(yīng)用各種渲染方案,其中包括客戶(hù)端渲染、服務(wù)器端渲染等各種渲染方案。文章翻譯自:https://developers.google.com...。由...
摘要:由我所在的團(tuán)隊(duì)共同翻譯完成,并發(fā)布在前端技術(shù)公眾號(hào)方凳雅集上,轉(zhuǎn)載于此。在移動(dòng)端,客戶(hù)端渲染很難獲得并保持一個(gè)較快的渲染速度。使用技術(shù)進(jìn)行服務(wù)端渲染的主要問(wèn)題在于它會(huì)對(duì)可交互時(shí)間有明顯的負(fù)面影響,盡管它縮短了首次繪制時(shí)間 本文簡(jiǎn)單介紹了web應(yīng)用各種渲染方案,其中包括客戶(hù)端渲染、服務(wù)器端渲染等各種渲染方案。文章翻譯自:https://developers.google.com...。由...
閱讀 1164·2021-11-22 15:24
閱讀 4440·2021-09-23 11:51
閱讀 2302·2021-09-08 09:36
閱讀 3514·2019-08-30 15:43
閱讀 1295·2019-08-30 13:01
閱讀 1116·2019-08-30 12:48
閱讀 530·2019-08-29 12:52
閱讀 3366·2019-08-29 12:41