2021前端面试题-JS篇

JavaScript018

2021前端面试题-JS篇,第1张

```

当查找一个对象的某个属性时,会先从它自身的属性上查找,

如果找不到的话会从它的_proto_属性上查找,就是这个构造函数的prototype属性,

如果还没找到就会继续在_proto_上查找,直到最顶层,找不到则为undefined,

像这样一层一层去查找形成一个链式的称为原型链

```

new一个函数,中间发生了什么

1.开辟一个内存空间,也就是创建一个空对象,obj={}或obj=new Object()

2.将这个新对象的_proto_属性指向它构造函数的prototype

3.将构造函数this绑定为这个新对象,在空对象上挂在属性和方法(call或apply方式)

4.返回这个新对象

相同:都是改变函数上下文this指向

不同:bind返回的是一个函数,不会立即执行

         传参的不同 apply第二个参数为数组形式

         call apply都是对函数的直接调用

1.作为普通函数直接调用,this指向window

2.作为对象方法去调用的话,this指向调用它的这个对象

3.箭头函数,没有this,this取决于外层离它最近的非箭头函数的this

4.构造函数的this,指向创建这个构造函数的实例对象

1.词法作用域(静态作用域)

  js采用的就是词法作用域

  只有函数可以限定作用域

  函数允许函数访问外层作用域的变量

  函数在定义的时候决定了函数作用域,词法作用域关心函数在何处被定义

2.动态作用域

  函数在调用的时候决定了函数作用域,动态作用域关心函数在何处被调用

变量取值会到创建这个变量的函数作用域中去查找,如果找不到会向上查找,直到查找到全局作用域,这就形成了一个作用域链

1.节流

2.防抖

1.原型链继承

2.构造函数继承

3.组合继承(原型链继承+构造函数继承)

4.原型式继承

5.寄生继承

6.组合寄生继承

定义在一个函数内部的函数,这个内部函数有权访问外部函数作用域的变量

优点:

缺点:

js在运行中的任务,有一套收集,排队,执行的特殊机制,这种机制就是事件循环

遇到同步事件直接执行,遇到异步事件分为宏任务和微任务

如果微任务列表里有任务,先执行微任务再执行宏任务

块级作用域  暂时性死区  能否被修改

没有this  call apply方法修改this无效

没有prototype属性

没有argument

不能使用new  不能用作构造函数,会报错

持续更新中.......

(水仙花数也被称为超完全数字不变数、自恋数、自幂数、阿姆斯特朗数。水仙花数是指一个3位数,它的每个位上的数字的3次幂之和等于它本身 例如: 1~3 + 5~3 + 3~3 =153)

(质数就是在大于1的自然数中,除了1和它本身以外不在有其他因数的自然数)

a:11,b:10

A [] B [""] C [undefined] D [null]

A ['false'] B [false] C[0] D[]

A null B undefined C “hello” D“world”

A "llowo" B "llow" C "llo" D null

A "llowo" B "llow" C "llo" D null

A getYear()

B getMonth()

C getDay()

DgetDate()

A 基于对象

B 移动端优先

C 事件驱动

D 跨平台

A String

B Float

C Number

D Null

A 任意单个字符

B 任意单个字母

C 任意单个字母、数字、下划线

D 任意单个字母、数学、下划线、$符号

A <javascript>

B <script>

C <scripting>

D <js>

A var s = 'heloe'

B var n = 20

C var x = document.getElementsByTagName('box')

D var y = document.querySelectorAll('ul li')

A document.createElement

B document.createTextNode

C document.getElementById

B document.querySelector

A ele.innerText

B ele.innerHTML

C ele.textContent

D ele.htmlContent

插入排序的算法描述的是一种简单直观的排序算法,它的工作原理是通过构建有序序列,对于未排序的数据,在已排序序列中从后向前扫描,找到对应位置并插入

A.对数组里数据的排序可以用sort函数,如果排序效果非预期,可以给sort函数加一个排序的参数

B.reverse用于对数组数据的倒序排列

C.向数组的最后位置加一个新元素,可以用pop方法

D.unshift方法用于向数组删除第一个元素

A.window.status = "已经选中该文本框"

B.document.status = '已经选中该文本框'

C.window.screen = '已经选中该文本框'

D.document.screen = '已经选中该文本框'

A <input type="button" value="new" onclick="open('new.html','_blank')" />

B. <input type="button" value="new" onclick="window.location = 'new.html'" />

C.<input type="button" value="new " onclick = "location.assign('new.html)">

D. <form target = "_blank" action="new.html">

<input type="submit" value="new" />

</form>

A.<script type="text/javascript">document.write(<h1>hello</h1>)</script>

B.<script type="text/javascript">document.write("<h1>hello</h1>")</script>

C.<script type="text/javascript"><h1>hello</h1></script>

D.<h1><script type="text/javascript">document.write("hello")</script></h1>

以下说法中正确的是(AD)

A.在页面的第二个文本框中输入内容后,当目标离开第二个文本框时,第一个文本框的内容不变

B.在页面的第一个文本框中输入内容后,当鼠标离开第一个文本框时,将在第二个文本框中复制第一个文本框的内容

C.在页面的第二个文本框中输入内容后,当鼠标离开第二个文本框时候,将在第一个文本框中复制第二个文本框的内容

D.在页面的第一个文本框中输入内容后,当鼠标离开第一个文本框时,第二个文本框的内容不变

var res = 100 + "20"

console.log(res) // ① 120

var res2 = "30" - "5"

console.log(res2) // ② 25

var res3 = 10 - true

console.log(res3) // ③ 9

var res4 = NaN == NaN

console.log(res4) // ④ true

var res5 = null == undefined

console.log(res5) // ⑤ true

var res1 = (20 - 10) &&(100 * 10)

console.log(res1) // ① 1000

var res2 = undefined &&null

console.log(res2) // ② null

var res3 = res2 || "javascript"

console.log(res3) // ③ javascript