JavaScript的问题记录

关于以下题目均来源于网络,在空余时间查看为了方便记忆在此记录📝

1.京东:分别写出下面代码返回值

String('11') == new String('11');
String('11') === new String('11');
1
2

New String 返回的是一个对象

2.头条:修改打印出99-0或0-99

条件:不能修改for循环的值和Math.floor(Math.random()*1000)

function print(i){
	setTimeout(()=>{
		console.log(i)
	},Math.floor(Math.random()*1000))
}

for(var i = 100; i>0; i--){print(i)}
1
2
3
4
5
6
7

1.使用立即执行函数解决

2.0-99的话console.log(100 - i)

function print(i){
	setTimeout( (() => {
        console.log(100-i);
  })(), Math.floor(Math.random() * 1000));

}

for(var i = 100; i>0; i--){print(i)}
1
2
3
4
5
6
7
8

还有滑稽的就是直接注释了定时器~跑题了

3.关于var,let,const,的区别

var全局声明可能变量名重复,循环的时变量泄漏为全局变量。会发生变量提升现象

let块级作用域适合循环计数器,不允许重复声明,const声明一个只读的常量。一旦声明,常量的值就不能改变。const的作用域与let命令相同:只在声明所在的块级作用域内有效

阮一峰老师的详解http://es6.ruanyifeng.com/#docs/let

4.在输入框中判断输入的是否是一个正确的地址

function isUrl(url) {
       try {
           new URL(url);
           return true;
       }catch(err){
     return false;
}}
1
2
3
4
5
6
7

5.for循环和forEach,map的性能比较

for循环是常见的循环语句forEach和map是在ES5出的,但是在性能上后者不如前者,在次数少的情况下forEach会比for要快,但是到达了十万次时forEach明显就跟不上了。在大数据量的情况下for循环的兼容性和多环境运行表现比较优秀,forEach的优点是在数据量小时占优势,语义话更简洁。循环时没有返回值。map和forEach差不多但是map循环有返回值

参考文章

js数组循环分析

6.什么情况下 a === a - 1

第一个答案是正负Infinity

Infinity 属性用于存放表示正无穷大的数值。

任何一个有穷的数和infinity的加减运算的结果都是infinity

第二种就是任意比较大的数也可以

let c = 121231238213764376347346734;
undefined
console.log(c === c-1)
VM425:1 true
1
2
3
4

7.请写下下面打印顺序

头条题:详解

这道题主要考察的是事件循环中函数执行顺序的问题,其中包括asyncawaitsetTimeoutPromise函数。

//请写出输出内容
async function async1() {
    console.log('async1 start');
    await async2();
    console.log('async1 end');
}
async function async2() {
	console.log('async2');
}

console.log('script start');

setTimeout(function() {
    console.log('setTimeout');
}, 0)

async1();

new Promise(function(resolve) {
    console.log('promise1');
    resolve();
}).then(function() {
    console.log('promise2');
});
console.log('script end');
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25

8.将数组扁平化去并除其中重复部分数据

携程题:

要求:编写一个程序将数组扁平化去并除其中重复部分数据,最终得到一个升序且不重复的数组

var arr = [ [1, 2, 2], [3, 4, 5, 5], [6, 7, 8, 9, [11, 12, [12, 13, [14] ] ] ], 10];

答:

Array.from(new Set(arr.flat(Infinity))).sort((a,b)=>{ return a-b})
1

Flat():arr.flat(Infinity) 使用 Infinity 作为深度,展开任意深度的嵌套数组

new Set():ES6 提供了新的数据结构 Set。它类似于数组,但是成员的值都是唯一的,没有重复的值。

sort(): 方法用于对数组的元素进行排序