Table of Contents
- 1.如何将集合转化成数组?
- 2.Event Loop - 1
- 3.Event Loop - 2
- 4.不支持冒泡的事件
- 5. 如何阻止事件冒泡
- 6.比较Ajax和Flash的优劣
- Ajax
- Flash
- 7.Promise的状态
- 8.隐式的类型转化
- 9.JS 解析顺序(赋值式函数和声明式函数)
- 10. Node查找某一模块的顺序
- 11. 变量回收
- 变量回收规则
1.如何将集合转化成数组?
- Array.form(arr, mapfn,thisArg)
用于将两类可以把对象转换为真正的数组:类似数组的对象和可遍历的对象(部署了Iterator接口的,String,ES6新增的Map和Set)。可以传3个参数,其中第一个是数组,必传;第二个是一个函数(类似map函数),对数组元素进行操作后再返回数组,可选;第三个是对于this关键字的指向,可选。
- slice()
可从已有的数组中返回选定的元素。 返回值:返回一个新的数组,包含从
start
到end
(不包括该元素)的arrayObject
中的元素。
请注意:该方法并不会修改数组,而是返回一个子数组。如果想删除数组中的一段元素,应该使用方法Array.splice()
。 所以在这里就是对集合A应用slice,返回一个新的数组,不对数组做任何改变。
- 展开运算符
把A集合的元素展开后,用数组[]承载,返回新的数组。
- map()
返回一个新数组,数组中的元素为原始数组元素调用函数处理后的值。
map() 方法按照原始数组元素顺序依次处理元素。
注意:
(1)map()不会对空数组进行检测。
(2) map() 不会改变原始数组。
所以map方法返回了一个新的数组,并且数组中每个元素是A里面的元素。
var ary = [12,23,24,42,1];
var res = ary.map(function (item,index,input) {
return item*10;
})
console.log(res);//-->[120,230,240,420,10]; 原数组拷贝了一份,并进行了修改
console.log(ary);//-->[12,23,24,42,1]; 原数组并未发生变化
2.Event Loop - 1
求运行结果:
console.log("one")
setTimeout(function(){
console.log("two")
},0)
console.log("three")
个人理解:在定时器中设置的时间为0毫秒,输出结果应为:one three two
Note :Event Loop
JavaScript语言就采用Event Loop机制,来解决单线程运行带来的一些问题。
JS 在执行的过程中会产生执行环境,这些执行环境会被顺序的加入到执行栈中。如果遇到异步的代码,会被挂起并加入到 Task(有多种 task) 队列中。一旦执行栈为空,Event Loop 就会从 Task 队列中拿出需要执行的代码并放入执行栈中执行,所以本质上来说 JS 中的异步还是同步行为
回调时,被回调的函数会被放在event loop里,等待线程里的任务执行完后才执行event loop里的代码。
因此,上述代码会先把线程里的执行完后,再执行event loop里的setTimeout函数。
借鉴资料 : 阮一峰的网络日志
3.Event Loop - 2
求运行结果:
console.log(1);
let a = setTimeout(() => {console.log(2)}, 0);
console.log(3);
Promise.resolve(4).then(b => {
console.log(b);
clearTimeout(a);
});
console.log(5);
Output:
执行顺序是先执行同步的任务–输出1,3,5
在执行异步任务:其中异步任务分为宏任务和微任务,微任务优先级高于宏任务。promise.then执行的微任务,输出4,然后clearTimeout(a)清除了定时器,于是不再打印2。
结果输出:1,3,5,4
4.不支持冒泡的事件
UI事件:
load unload scroll resize
焦点事件
blur focus
鼠标事件
mouseleave mouseenter
JS事件监听(捕获&冒泡)
5. 如何阻止事件冒泡
事件绑定&移除&冒泡(如何阻止事件冒泡)
6.比较Ajax和Flash的优劣
Ajax
优势:
1.可搜索性
2.开放性
3.费用
4.易用性
5.易于开发。
劣势:
1.它可能破坏浏览器的后退功能
2.使用动态页面更新使得用户难于将某个特定的状态保存到收藏夹中
不过这些都有相关方法解决。
Flash
优势:
1.多媒体处理
2.兼容性
3.矢量图形
4.客户端资源调度
劣势:
1.二进制格式
2.格式私有
3.flash 文件经常会很大,用户第一次使用的时候需要忍耐较长的等待时间
4.性能问题
7.Promise的状态
一个Promise可能有三种状态:
等待(pending
)、已完成(fulfilled
)、已拒绝(rejected
)
一个promise的状态只可能从“等待”转到“完成”态或者“拒绝”态,不能逆向转换,同时“完成”态和“拒绝”态不能相互转换。
promise必须实现then
方法(可以说,then就是promise的核心),而且then
必须返回一个promise,同一个promise的then
可以调用多次,并且回调的执行顺序跟它们被定义时的顺序一致。
then
方法接受两个参数,第一个参数是成功时的回调,在promise由“等待”态转换到“完成”态时调用,另一个是失败时的回调,在promise由“等待”态转换到“拒绝”态时调用。同时,then
可以接受另一个promise传入,也接受一个“类then”的对象或方法,即thenable
对象。
Promise对象
8.隐式的类型转化
题目:
parseInt()
函数可解析一个字符串,并返回一个整数。
所以说,number
类型的12.34发生隐式转换为string
。
三元运算符,会判断?前的表达式为true
或者false
。所以number
类型的0发生了隐式转换为boolean
。
+
运算发生了字符串的隐式转化。原本number
类型的1,和string
类型的’1’进行了+运算,连接了字符串。返回’11’。
C选项:e
是js里面指数的一种表示形式。也就是10的多少次方。
2e1 等价于 2 *(10^1) = 20
2e2 等价于 2 (10^2)= 2000xaa
是16进制的表示方法。相当于十进制的170。
这里都是number类型,发生了数字的乘法运算:20170,没有发生类型转换
9.JS 解析顺序(赋值式函数和声明式函数)
代码如下:
var foo=function(x,y){
return x-y;
}
function foo(x,y){
return x+y;
}
var num=foo(1,2);
解析如下:
var foo=function(x,y){ //赋值式函数
return x-y;
}
//有名函数,可以单独定义。
function foo(x,y){ //声明式函数
return x+y;
}
//实际调用
var num=foo(1,2); //调用赋值式函数 return x-y 为 -1
10. Node查找某一模块的顺序
在文件/home/somebody/workspace/somemodule.js
中第一行引用了一个模块:require(‘othermodule‘)
,请问required 的查找模块的顺序:
- 首先,Node在当前目录下查找
package.json
(CommonJS包规范定义的包描述文件),通过JSON.parse()
解析出包描述对象,从中取出main属性指定的文件名进行定位。
如果文件缺少扩展名,将会进入扩展名分析的步骤。 - 而如果
main
属性制定的文件名错误,或者压根没有package.json
文件,Node会将index
当做默认文件名,然后依次查找index.js
、index.node
、index.json
. - 如果在目录分析的过程中没有定位成功任何文件,则自定义模块进入下一个模块路径进行查找。如果模块路径数组都被遍历完毕,依然没有查找到目标文件,则会抛出查找失败异常
按照上面的思路,首先应该查找package.json
文件,看看里面有没有核心模块,应该是C最先,othermodule
不是核心模块,那么接着应该进入扩展名分析的步骤,就应该是查找othermodule. js
,对应B,紧接着就是以index
为默认文件名,也就是A,再接下来就是上一个文件目录D了,所以答案是: C B A D
11. 变量回收
变量回收规则
1.全局变量不会被回收
2.局部变量会被回收,也就是函数一旦运行完之后,函数内部的东西就会被销毁
3.只要被另一个作用域所引用就不会被回收
之所以有3个变量没有被回收,首先是全局变量中的i ,第二行会覆盖第一行的赋值,所以只有一个,第二个
是var add ,这个变量定义了一个匿名函数,并赋值给了add,没有被回收,第三个就是闭包中的变量i,闭包中的局部变量是不会被回收的。