用法相同,都是前后是值,中间用符号连接。根据前面的值来判断最终返回前面的值还是后面的值。
||
时,值1
会转换为布尔值判断,为true
返回值1
,false
返回值2
总的来说,
??
更加适合在不知道变量是否有值时使用。
POST 方法改为 GET 方法
。如果不想这样,应该使用 307
(Temporary Redirect) 状态码
和 302 是一致的
,唯一的区别在于,307 状态码不允许浏览器将原本为 POST 的请求重定向到 GET 请求上
。
308
的定义实际上和 301 是一致的,唯一的区别在于,308 状态码不允许浏览器将原本为 POST 的请求重定向到 GET 请求上
302
允许各种各样的重定向,一般情况下都会实现为到 GET
的重定向,但是不能确保 POST
会重定向为 POST
303
只允许任意请求到 GET
的重定向
那为什么有了 307 和 303 还需要 302呢?把总结放在最前面。302 在最初的定义中,内容和现在的 307 是一样的,不允许重定向方法的改写(从 POST 到 GET,由于 GET 不应该有 body,实际上 body 也被改了)。但是早期浏览器在实现的时候有的实现成 303 的效果,有的实现成 307 的效果。于是在之后的标准,302 在某些浏览器中错误的实现被写进规范,成为 303,而 302 原本的效果被复制了到了 307。在最近的一次标准修订中,302 标准被修改成不再强制需要维持原请求的方法。所以就产生了现在的 302、303 和 307
我们在日常的开发中,经常会遇到跨域资源共享,或者进行跨域接口访问的情况。跨域资源共享( CORS)机制允许 Web 应用服务器进行跨域访问控制。
跨域资源共享标准新增了一组 HTTP 首部字段,允许服务器声明哪些源站通过浏览器有权限访问哪些资源。另外,规范要求,对那些可能对服务器数据产生副作用的 HTTP 请求方法(特别是GET以外的 HTTP 请求,或者搭配某些 MIME 类型的POST请求),浏览器必须首先使用OPTIONS方法发起一个预检请求(preflight request),从而获知服务端是否允许该跨域请求。服务器确认允许之后,才发起实际的 HTTP 请求。在预检请求的返回中,服务器端也可以通知客户端,是否需要携带身份凭证(包括Cookies和 HTTP 认证相关数据)。
在涉及到CORS
的请求中,我们会把请求分为简单请求和复杂请求
。
/ 可以把正则分析成容易理解的可视化的逻辑脑图。其中我们可以看到,匹配规则是:全局匹配(g)左括号或者右括号,将它们替换成空格,最后返回处理后的结果。之后拿着正则处理好的结果重新在外层包裹括号,最后通过 JSON.parse 转换成数组返回。
console.log()
方法输出的时候,因为obj上有length
属性和splice
方法,故将其作为数组输出打印
empty
,主动获取obj[0] = undefined
TypeError
,
这段代码的执行结果是?
期望输出的是0,1,2,实际上却不会。原因就是涉及作用域,怎么解决呢?
解法还有其他的,比如使用IIFE,形成私有作用域等等做法。
你们觉得答案是多少呢?
唯一需要注意的就是for语句
后面带了;
沙雕题
加了
;
,会认为for执行完,所以指定的都是空语句,最后numbers为[5]
小数点在计算机中是以二进制表示,而有些小数用二进制表示是无穷,所以才会出现上面这种精确度的问题。 一些浮点数表示成二进制
出现这个问题的原因,其实是因为数值的表示在计算机内部是用二进制的。例如,十进制的0.625,换成二进制表示就是
0.101(1*2-1+0*2-2+1*2-3)
。0.625
这个数倒还好,刚好可以准确表示出来。但如果是0.1的话呢,换成二进制就是0.00011
(0011无限循环),也就是:0....
,位数是无限的,只能取近似。对于这些不能准确表示的数就有可能会出现这个问题。为什么是可能呢?因为有些数的计算结果,例如0.1+0.3
,它虽然也是不能精确地表示,但是它结果足够接近0.4
,那取了近似后就成了0.4
了。
使用简单点四舍五入方法,取了一个10位小数
Tree shaking
是一种通过清除多余代码方式来优化项目打包体积的技术
ES6 Module
引入进行静态分析,故而编译的时候正确判断到底加载了那些模块
CommonJS 是一种模块规范,最初被应用于 Nodejs,成为 Nodejs 的模块规范。运行在浏览器端的 JavaScript 由于也缺少类似的规范,在 ES6 出来之前,前端也实现了一套相同的模块规范 (例如:
AMD
),用来对前端模块进行管理。自 ES6 起,引入了一套新的ES6 Module
规范,在语言标准的层面上实现了模块功能,而且实现得相当简单,有望成为浏览器和服务器通用的模块解决方案。但目前浏览器对ES6 Module
兼容还不太好,我们平时在Webpack
中使用的export
和import
,会经过Babel
转换为 CommonJS 规范。在使用上的差别主要有
CommonJS
模块输出的是一个值的拷贝,ES6 模块输出的是值的引用。
CommonJS
模块是运行时加载,ES6 模块是编译时输出接口。
CommonJs
是动态语法可以写在判断里,ES6 Module
静态语法只能写在顶层
new Vue()
代码,vue
框架做了什么呢?
_init
方法,是我们要重点分析的,其入参options
就是我们定义的对象时传入的参数对象
options
的合并,之后是一堆init方法
options
进行合并,vue会将相关的属性和方法都统一放到vm.$options
中,为后续的调用做准备工作。vm.$option
的属性来自两个方面,一个是Vue
的构造函数(vm.constructor
)预先定义的,一个是new
Vue
时传入的入参对象。合并完成后的options
属性包括:
new Vue
的核心部分,将template
编译成render
表达式,然后转化为大名鼎鼎的Vnode
,最终渲染为真实的dom
节点
Vue
初始化主要就干了几件事情,合并配置,初始化生命周期,初始化事件中心,初始化渲染,初始化data
、props
、computed
、watcher
等
使用了函数劫持的方式,重写了数组的方法,
Vue
将data
中的数组进行了原型链重写,指向了自己定义的数组原型方法。这样当调用数组api时,可以通知依赖更新。如果数组中包含着引用类型,会对数组中的引用类型再次递归遍历进行监控。这样就实现了监测数组变化。
https
的url
访问web
服务器,要求与服务器建立ssl
连接
web
服务器收到客户端请求后, 会将网站的证书(包含公钥)传送一份给客户端
HTTPS 握手过程中,客户端如何验证证书的合法性
push
方法有意具有通用性。该方法和 call()
或 apply()
一起使用时,可应用在类似数组的对象上。push
方法根据 length
属性来决定从哪里开始插入给定的值。如果 length
不能被转成一个数值,则插入的元素索引为 0
,包括 length
不存在时。当 length
不存在时,将会创建它
push
和splice
会输出会转换为数组
请写出下面代码的运行结果
js 的完美继承是寄生组合继承
预先处理的思想,利用闭包的机制
- 柯里化的定义:接收一部分参数,返回一个函数接收剩余参数,接收足够参数后,执行原函数。
- 函数柯里化的主要作用和特点就是
参数复用
、提前返回
和延迟执行
。
实现一个简易的
MVVM
我会分为这么几步来:
Vue
,这个类接收的是一个options
,那么其中可能有需要挂载的根元素的id
,也就是el
属性;然后应该还有一个data
属性,表示需要双向绑定的数据
Dep
类,这个类产生的实例对象中会定义一个subs
数组用来存放所依赖这个属性的依赖,已经添加依赖的方法addSub
,删除方法removeSub
,还有一个notify
方法用来遍历更新它subs
中的所有依赖,同时Dep类有一个静态属性target
它用来表示当前的观察者,当后续进行依赖收集的时候可以将它添加到dep.subs
中。
dep
对象,在get
的时候调用其addSub
方法添加当前的观察者Dep.target
完成依赖收集,并且在set
的时候调用dep.notify
方法来通知每一个依赖它的观察者进行更新
compile
方法来将HTML模版和数据结合起来。在这个方法中首先传入的是一个node
节点,然后遍历它的所有子级,判断是否有firstElmentChild
,有的话则进行递归调用compile方法,没有firstElementChild
的话且该child.innderHTML
用正则匹配满足有/\{\{(.*)\}\}/
项的话则表示有需要双向绑定的数据,那么就将用正则new
完成变量替换的同时,还需要将
Dep.target指向当前的这个child
,且调用一下this.opt.data[key]
,也就是为了触发这个数据的get
来对当前的child
进行依赖收集,这样下次数据变化的时候就能通知child
进行视图更新了,不过在最后要记得将Dep.target
指为null
哦(其实在Vue
中是有一个targetStack
栈用来存放target
的指向的)
document
的DOMContentLoaded
然后在回调函数中实例化这个Vue
对象就可以了
childNodes
会获取到所有的子节点以及文本节点(包括元素标签中的空白节点)
firstElementChild
表示获取元素的第一个字元素节点,以此来区分是不是元素节点,如果是的话则调用compile
进行递归调用,否则用正则匹配
发布订阅者模式,一种对象间一对多的依赖关系,但一个对象的状态发生改变时,所依赖它的对象都将得到状态改变的通知。
还是比较简单的,而padEnd
的实现和它一样,只需要把第二层for
循环里的${padString[j]}${orignStr}
换下位置就可以了。
方法有很多种,这里提供一种比较简洁的写法,用到了ES10
的Object.fromEntries()
:
""
里内容
第一种:正则匹配首位空格并去除:
第三种:使用Vue
中的修饰符.trim
:
ES10
新出的两个去除空白字符的方法
react
用的不是很多,搜索了一下好像也没有看到类似Vue
的修饰符,给出的解决方案是封装一个高阶组件)
^
如果不是放在[]
里的话就是表示从头开始匹配;
\s
用于匹配一个空白字符,而\S
用于匹配一个非空字符
+
表示匹配前面的模式 x 1 或多次。等价于 {1,}
。
这里获取到的是类似于这样的字符串:
可以看到这么几个信息:
''
(比如username
的开头其实就是), 也可能是一个空字符串' '
(比如user-id
的开头就是)
","
来连接的(比如user-roles
的值)
";"
的(比如username
的结尾),也可能是没有的(比如user-roles
的结尾)
'(^| )'
表示的就是获取每一项的开头,因为我们知道如果^
不是放在[]
里的话就是表示开头匹配。所以这里(^|
)
的意思其实就被拆分为(^)
表示的匹配username
这种情况,它前面什么都没有是一个空串(你可以把(^)
理解为^
它后面还有一个隐藏的''
);而|
表示的就是或者是一个"
"
(为了匹配user-id
开头的这种情况)
+name+
这没什么好说的
=([^;]*)
这里匹配的就是=
后面的值了,比如poetry
;刚刚说了^
要是放在[]
里的话就表示"除了^后面的内容都能匹配"
,也就是非的意思。所以这里([^;]*)
表示的是除了";"
这个字符串别的都匹配(*
应该都知道什么意思吧,匹配0次或多次)
'=([^;]*)(;|$)'
,而最后为什么可以把'(;|$)'
给省略呢?因为其实最后一个cookie
项是没有';'
的,所以它可以合并到=([^;]*)
这一步。
match
其实是一个长度为4的数组。比如:
所以我们是要拿第2项match[2]
的值。
%xxx
这样的字符序列,需要用unescape()
方法解码。
基本原理:主要就是利用
script
标签的src
属性没有跨域的限制,通过指向一个需要访问的地址,由服务端返回一个预先定义好的Javascript
函数的调用,并且将服务器数据以该函数参数的形式传递过来,此方法需要前后端配合完成。
jsonpCallback
),并以带上参数且调用执行函数的方式传递给前端
script
标签返回资源的时候就会去执行jsonpCallback
并通过回调函数的方式拿到数据了。
img
标签的loading="lazy"
实现图片懒加载,但是如果要考虑兼容性的话,可能需要用监听window.scroll
然后通过获取要懒加载图片距离可是窗口顶部的距离来判断需不需要加载。
一些需要根据用户输入的信息实时查询的输入框,需要做防抖处理
webpack-bundle-analyzer
分析打包后整个项目中的体积结构,既可以看到项目中用到的所有第三方包,又能看到各个模块在整个项目中的占比。
lodash
库、UI
组件库
purgecss-webpack-plugin
和glob
插件去除无用样式(glob
插件可以可以同步查找目录下的任意文件夹下的任意文件):
babel-loader
编译慢,可以通过配置exclude
来去除一些不需要编译的文件夹,还可以通过设置cacheDirectory
开启缓存,转译的结果会被缓存到文件系统中
moment
时发现会把整个locale
语言包都打包进去导致打包体积过大,但是我们只需要用到中文包
使用splitChunks
进行拆包,抽离公共模块,一些常用配置项:
cacheGroups
: 可以配置多个组,每个组根据test设置条件,符合test条件的模块,就分配到该组。模块可以被多个组引用,但最终会根据priority来决定打包到哪个组中。默认将所有来自 node_modules目录的模块打包至vendors组,将两个以上的chunk所共享的模块打包至default组。
DllPlugin
动态链接库,将第三方库的代码和业务代码抽离:
本文将围绕这个最核心的案例来讲,这段代码的表现如下:
好,写到这里先回过头来看案例
分开来看,fn 就是用户传的函数,这个函数内部调用了
resolve
函数后,就会把promise
实例上的 cbs 全部执行一遍。
到此为止我们还不知道 cbs 这个数组里的函数是从哪里来的,接着往下看。
这里是最重要的 then
实现,链式调用全靠它:
promise
并且返回,用来做异步的操作,叫它user promise
那么重点看这个
push
的函数,注意,这个函数在promise1
被resolve
了以后才会执行。
结合下面这个例子来看:
resolve2
执行完毕后,then2
里的逻辑才会继续执行,也就是异步链式调用
简单实现一个可以异步链式调用的
promise
,而真正的promise
比它复杂很多很多,涉及到各种异常情况、边界情况的处理。
promise A+
规范还是值得每一个合格的前端开发去阅读的
HTTP
请求可以同时进行,但是JS的操作都是一步步的来的,因为JS是单线程」,等待所有请求都成功,我们再去做什么事情?
并发限制指的是,每个时刻并发执行的promise数量是固定的,最终的执行结果还是保持与原来的
JS实现Ajax并发请求控制的两大解决方案
tasks
:数组,数组包含很多方法,每一个方法执行就是发送一个请求「基于Promise
管理」
Ajax
前后端数据通信「同源、跨域」
Axios
也是对ajax
的封装,基于Promise
管理请求,解决回调地狱问题
Fetch
是ES6
新增的通信方法,不是ajax
,但是他本身实现数据通信,就是基于promise
管理的
从输入URL地址到看到页面,中间都经历了啥
disk cache
中是否有匹配,如有则使用,如没有则发送网络请求
浏览器对于强缓存的处理:根据第一次请求资源时返回的响应头来确定的
Expires
:缓存过期时间,用来指定资源到期的时间(HTTP/1.0
)
协商缓存就是强制缓存失效后,浏览器携带缓存标识向服务器发起请求,由服务器根据缓存标识决定是否使用缓存的过程
每一次
DNS
解析时间预计在20~120
毫秒
seq
序号,用来标识从TCP
源端向目的端发送的字节流,发起方发送数据时对此进行标记
ack
确认序号,只有ACK
标志位为1
时,确认序号字段才有效,ack=seq+1
SYN
:发起一个新连接
三次握手为什么不用两次,或者四次?
TCP作为一种可靠传输控制协议,其核心思想:既要保证数据可靠传输,又要提高传输的效率!
202 Accepted
:服务器已接受请求,但尚未处理(异步)
204 No Content
:服务器成功处理了请求,但不需要返回任何实体内容
为什么连接的时候是三次握手,关闭的时候却是四次握手?
SYN
连接请求报文后,可以直接发送SYN+ACK
报文
网络优化是前端性能优化的中的重点内容,因为大部分的消耗都发生在网络层,尤其是第一次页面加载,如何减少等待时间很重要“减少白屏的效果和时间”
带宽优化及网络连接的使用
,HTTP1.1
支持断点续传,即返回码是206
(Partial Content
)
错误通知的管理
,在HTTP1.1
中新增了24
个错误状态响应码,如409(Conflict)
表示请求的资源与资源的当前状态发生冲突;410(Gone)
表示服务器上的某个资源被永久性的删除…
Host头处理
,在HTTP1.0
中认为每台服务器都绑定一个唯一的IP地址,因此,请求消息中的URL并没有传递主机名(hostname
)。但随着虚拟主机技术的发展,在一台物理服务器上可以存在多个虚拟主机(Multi-homed Web
Servers
),并且它们共享一个IP地址。HTTP1.1的请求消息和响应消息都应支持Host
头域,且请求消息中如果没有Host头域会报告一个错误(400 Bad Request
)
新的二进制格式(Binary
Format)
,HTTP1.x
的解析是基于文本,基于文本协议的格式解析存在天然缺陷,文本的表现形式有多样性,要做到健壮性考虑的场景必然很多,二进制则不同,只认0
和1
的组合,基于这种考虑HTTP2.0
的协议解析决定采用二进制格式,实现方便且健壮
header
的传输,又减小了需要传输的大小
服务端推送(server push)
,例如我的网页有一个sytle.css
的请求,在客户端收到sytle.css
数据的同时,服务端会将sytle.js的文件推送给客户端,当客户端再次尝试获取sytle.js
时就可以直接从缓存中获取到,不用再发请求了
HTTP/1.0
每次请求响应,建立一个TCP
连接,用完关闭
HTTP/1.1
「长连接」 若干个请求排队串行化单线程处理,后面的请求等待前面请求的返回才能获得执行机会,一旦有某请求超时等,后续请求只能被阻塞,毫无办法,也就是人们常说的线头阻塞;
HTTP/2.0
「多路复用」多个请求可同时在一个连接上并行执行,某个请求任务耗时严重,不会影响到其它连接的正常执行;
IIFE
中的foo
函数名相当于是使用const
关键字定义的,因此没有办法对一个常量再赋值。相当于创建了一个局部的作用域,并且以 const
声明为常量,严格模式下会报错,无法对常量重新赋值,因此执行结果将打印出函数声明,等价于 const b =
在严格模式下,直接报
TypeError
类型的错误,这类错误同数据类型相关.
则由于局部变量无法找到,继续寻找全局变量,导致输出结果为
123
对象转原始类型,会调用内置的
[ToPrimitive]
函数,对于该函数而言,其逻辑如下:
valueOf()
,如果转换为原始类型,则返回
toString()
,如果转换为原始类型,则返回
阅读下面代码,我们只考虑浏览器环境下的输出结果,写出它们结果打印的先后顺序,并分析出原因,小伙伴们,加油哦!
浏览器下 输出结果的先后顺序是
答案解析:这道题考察重点是 js异步执行 宏任务 微任务。
AAAA
. 1
EEEE
。第九行中的代码是个不存在的对象,这个错误要抛给reject这个状态,也就是catch去处理,但是它是异步的且是微任务,只有等到线程上的任务执行完毕,立马执行它,不管宏任务(计时器,ajax等)等待多久了。
IIII
AAAA CCCC EEEE IIII
await
是一个表达式,如果后面不是一个promise对象,就直接返回对应的值。
await
后面如果跟一个promise对象,await将等待这个promise对象的resolve状态的值value,且将这个值返回给前面的变量,此时的promise对象的状态是一个pending状态,没有resolve状态值,所以什么也打印不了。
await
后面如果跟一个promise对象,await将等待这个promise对象的resolve状态的值,且将这个值返回给前面的变量,此时的promise对象的状态是一个resolve状态,它的状态值是hello,所以打印出hello。
await
后面如果跟一个promise对象,await将等待这个promise对象的resolve状态的值,且将这个值返回给前面的变量,此时的promise对象的状态是一个resolve状态,它的状态值是hello,紧接着后面又执行了一个then方法,then方法又会返回一个全新的promise对象,且这个then方法中的返回值会作为这个全新的promise中resolve的值,所以最终的结果是lala。
首先考虑
fn()
执行返回一个promise对象,因为fn执行没有返回值,所以这个promise对象的状态resolve的值是undefined,且将这个undefined当作下一个then中回调函数的参数,所以打印的结果是undefined
首先考虑
fn()
执行返回一个promise对象,因为fn()
执行有返回值lala,所以这个promise对象的状态resolve的值是lala,且将这个lala当作下一个then中回调函数的参数,所以打印的结果是lala。
1 分析代码下面输出什么
调用Foo
的静态方法,所以,打印2
new Foo
得到的实例对象上的getName
方法,再将这个原型上getName
方法当做构造函数继续new ,所以执行原型上的方法,打印3
2 写出打印结果,并分析出原因
length
、一个对象obj
和一个函数fn
,length
赋值为10
。接下来是fn
函数,输出this.length
。对象obj
中,obj.length
是5,obj.method
是一个函数。method
函数里面的形参也是一个函数,这个函数里面调用了fn
函数,arguments
是一个伪数组,代表method
函数实际接收到的参数列表,所以arguments[0]
分析完了代码的含义,我们来看输出结果。
method函数当中调用的fn函数是全局当中的函数,所以this
指向的是window
,this.length
就是10
。上面说了,arguments[0]
()
代表的是调用arguments
里面的第一项,也就是传参进来的fn
,所以这个this
指向的是arguments,method
函数接收的参数是两个,所以arguments.length
就是2
。最后的输出结果就是
3 写出打印结果,并分析出原因
x
、一个变量y和一个函数a,函数a当中的this.x
等于接收到的参数,返回this
,这里要注意,返回的不是this.x
,而是this
。接下来我们给x赋值,值为a(5)
,又给y进行赋值,值为a(6)
。最后,我们输出x.x
,y.x
。
a
函数传了一个参数5
,那么this.x
就被赋值为了5
,函数a
的this
指向的是window
,也就是window.x =
第一种 catch
方法可以捕获到 catch
之前整条 promise
链路上所有抛出的异常
注册回调,可以捕获到前面then没有被处理的异常。第二种是回调函数写法,仅为为上一个promise 注册异常回调。
如果是promise
内部报错 reject
抛出错误后,then
的第二个参数就能捕获得到,如果then的第二个参数不存在,则catch方法会捕获到。
如果是then的第一个参数函数 resolve
中抛出了异常,即成功回调函数出现异常后,then的第二个参数reject 捕获捕获不到,catch方法可以捕获到。
在 urls
数组中存放了 10 个接口地址。同时还定义了一个 loadDate
函数,这个函数接受一个 url
参数,返回一个 Promise
对象,该 Promise
在接口调用成功时返回 resolve
,失败时返回
按照题意我们可以这样做,首先并发请求 3 个
url
中的数据,当其中一条url
请求得到数据后,立即发起对一条新url
上数据的请求,我们要始终让并发数保持在 3 个,直到所有需要加载数据的url
全部都完成请求并得到数据。
在你开发的过程中,什么情况下会遇到跨域问题,你是怎么解决的?
cors需要后台配合设置HTTP响应头,如果请求不是简单请求(1. method:get,post,2. content-type:三种表单自带的content-type,3. 没有自定义的HTTP header),浏览器会先发送option预检请求,后端需要响应option请求,然后浏览器才会发送正式请求,cors通过白名单的形式允许指定的域发送请求
jsonp
是浏览器会放过 img script标签引入资源的方式。所以可以通过后端返回一段执行js函数的脚本,将数据作为参数传入。然后在前端执行这段脚本。双方约定一个函数的名称。
联调的时候会需要跨域,线上前端站点域和后台接口不一致也需要跨域,开发时跨域可以通过代理服务器来转发请求,因为跨域本身是浏览器对请求的限制,常见的跨域处理还有JSONP和cors,jsonp是利用脚本资源请求本身就可以跨域的特性,通过与请求一起发送回调函数名,后台返回script脚本直接执行回调,但是由于资源请求是get类型,请求参数长度有限制,也不能进行post请求。cors需要后台配合设置HTTP响应头,如果请求不是简单请求(1. method:get,post,2. content-type:三种表单自带的content-type,3. 没有自定义的HTTP header),浏览器会先发送option预检请求,后端需要响应option请求,然后浏览器才会发送正式请求,cors通过白名单的形式允许指定的域发送请求
同源策略只是浏览器客户端的防护机制,当发现非同源HTTP请求时会拦截响应,但服务器依然处理了这个请求。 服务器端不拦截,所以在同源服务器下做代理,可以实现跨域。
给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。
说明:本题中,我们将空字符串定义为有效的回文串。
首先,去除字符串中的非字母和数字,然后,利用数组将字符串翻转,再和原字符串进行比较,即可得到结果。
toLowerCase()
方法统一转化为小写,再利用正则表达式 /[ ^ A-Za-z0-9]/g
在字符串中去除非字母和数字,得到字符串 arr
。
arr
转换为数组,利用数组的方法反转数组,再将数组转为字符串 newArr
。
arr
和 字符串 newArr
进行比较,相等即为回文串,不相等则不为回文串
给定一个整数,写一个函数来判断它是否是 3 的幂次方
或许,我们可以考虑使用递归的方法实现。递归的思路类似于循环,只不过将循环体改为方法的递归调用。
给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数
unshift()
方法将把它的参数插入数组的头部,并将已经存在的元素顺次地移到较高的下标处,该方法不会创建新数组,而是直接修改原数组。pop()
方法将删除数组的最后一个元素,把数组长度减 1,并且返回它删除的元素的值
splice()
方法截取需要移动的元素,然后使用扩展运算符‘...‘将截取的元素当作参数,通过 unshift()
方法将截取的 元素放到数组的前边。
- splice() 方法可删除从 index 处开始的零个或多个元素,然后返回被删除的项目。
- 数组的扩展运算符...相当于将数组展开,主要的使用场景是用于数组复制、合并等。
- unshift() 方法的第一个参数将成为数组的 index 为0的新元素,如果还有第二个参数,它将成为 index 为1的新元素,以此类推。
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
给定一个整数数组nums和一个目标值target,请你在该数组中找出和为目标值的那两个整数,并返回他们的数组下标。
target - x
相等的目标元素
所以我试图让一个移动菜单在单击图标时在左侧滑出,并且在您单击菜单之外后再次消失。像这样: http://codepen.io/anon/pen/LzJuq(旧的,请参阅下面的新codepen) 它在桌面和Android的默认浏览器上正常工作。 在我的手机中,在Chrome中,菜单仅在第一次打开。随后的每一次它在完成开放之前都会自行关闭。 我可以看到它尝试打开...所以我假设,因为#menu-ico
我正在使用jQuery将一个类“选定”添加到一个div当用户点击它(它将一个红色边框添加到缩略图)。同时我想从先前选择的div中移除该类。 我可以得到这个工作,如果所有div是兄弟姐妹,但文档中的其他div保持选中状态。我正在设计和开发的页面要求divs不能都是兄弟姐妹。如何在文档中的任何位置的先前选定的div上移除“selected”类,而不仅仅是兄弟姐妹? 您可以查看和编辑上的jsfiddle
我有两个选择框和一些按钮作为后类别过滤器。看看我的Fiidle。当我点击任何按钮或选择框时,我想添加背景颜色,并在点击另一个时将其删除。效果与此example中的 完全相同。 我想我必须在选择框中注册一个change事件。然而,作为一个初学者,我可以拿出被切碎该代码 $selectors.change(function() { var $selector = $(this);
我有一个div,我试图动画。该div有一个叫做peek_up的动画类,我正在使用else/if来添加一个动画,如果应用了peek_up,则会降低div,如果不是,则会将其提升。我的问题是,即使应用了peek_up,我正在使用的类来提高peek_up类的效果。我将如何去除完成后用于提升的动画? $('#box').on('click', function() { var $this =
版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。