代码面试题

1.下列代码将输出什么?并解释原因。

console.log(0.1 + 0.2);
console.log(0.1 + 0.2 == 0.3);

可以回答是:“你不能确定。可能会输出“0.3”和“true”,也可能不会。JavaScript中的数字和浮点精度的处理相同,因此,可能不会总是产生预期的结果。“

以上所提供的例子就是一个演示了这个问题的典型例子。但出人意料的是,

它会输出:0.30000000000000004 false

2.下列代码行1-4如何排序,使之能够在执行代码时输出到控制台? 为什么?

(function() {
console.log(1);
setTimeout(function() {
console.log(2)
}, 1000);
setTimeout(function() {
console.log(3)
}, 0);
console.log(4);
})();

序号如下:

1
4
3
2

让我们先来解释比较明显而易见的那部分:

1 和 4之所以放在前面,是因为它们是通过简单调用 console.log() 而没有任何延迟输出的

2 之所以放在 3的后面,是因为 2 是延迟了1000毫秒(即,1秒)之后输出的,而 3 是延迟了0毫秒之后输出的。

在setTimeout的执行形式上来看,setTimeout是不会阻碍其后续代码的执行的。所以可以理解为setTimeout是异步操作。

setTimeout的本质不是延迟多长时间执行,而是延迟多长时间把setTimeout中的回调函数放到执行栈中,这也是setTimeout的回调函数执行会比定义的延迟时间稍长的原因。这个时候有一个新的问题出现了,setTimeout本身并没有去调用其他的线程,仅仅是把本身需要执行的代码延后执行,尽管实现了异步操作的样子,但我个人认为,setTimeout并不是严格意义上的异步操作,只能称之为延迟操作。

3.下面的代码将输出什么到控制台,为什么?

var arr1 = “john”.split(’’);

var arr2 = arr1.reverse();

var arr3 = “jones”.split(’’);

arr2.push(arr3);

console.log( arr1.length, arr1.slice(-1) );
console.log( arr2.length, arr2.slice(-1) );

length=5 [“j”,“o”,“n”,“e”,“s”]

length=5 [“j”,“o”,“n”,“e”,“s”]

arr1 和 arr2 在上述代码执行之后,两者相同了,原因是:

调用数组对象的 reverse() 方法并不只返回反顺序的阵列,它也反转了数组本身的顺序(即,在这种情况下,指的是 arr1)。

reverse() 方法返回一个到数组本身的引用(在这种情况下即,arr1)。其结果为,arr2 仅仅是一个到 arr1的引用(而不是副本)。因此,当对 arr2做了任何事情(即当我们调用 arr2.push(arr3);)时,arr1 也会受到影响,因为 arr1 和 arr2 引用的是同一个对象。

这里有几个侧面点有时候会让你在回答这个问题时,阴沟里翻船:

传递数组到另一个数组的 push() 方法会让整个数组作为单个元素映射到数组的末端。其结果是,语句 arr2.push(arr3); 在其整体中添加 arr3 作为一个单一的元素到 arr2 的末端(也就是说,它并没有连接两个数组,连接数组是 concat() 方法的目的)。

和Python一样,JavaScript标榜数组方法调用中的负数下标,例如 slice() 可作为引用数组末尾元素的方法:例如,-1下标表示数组中的最后一个元素,等等。

4.下面的代码将输出什么:
for (var i = 0; i < 5; i++) {
setTimeout(function() { console.log(i); }, i * 1000 );
}

解释你的答案。闭包在这里能起什么作用?

上面的代码不会按预期显示值0,1,2,3,和4,而是会显示5,5,5,5,和5。

原因是,在循环中执行的每个函数将整个循环完成之后被执行,因此,将会引用存储在 i中的最后一个值,那就是5。

闭包可以通过为每次迭代创建一个唯一的范围,存储范围内变量的每个唯一的值,来防止这个问题,如下:

for (var i = 0; i < 5; i++) {
(function(x) {
setTimeout(function() { console.log(x); }, x * 1000 );
})(i);
}
这就会按预期输出0,1,2,3,和4到控制台。

5.以下代码将输出什么?并解释你的答案。

var a={};
var b={key:‘b’};
var c={key:‘c’};

a[b]=123;
a[c]=456;

console.log(a[b]);
console.log(a[c]);

这段代码将输出 456(而不是 123)。

原因为:当设置对象属性时,JavaScript会暗中字符串化参数值。在这种情况下,由于 b 和 c都是对象,因此它们都将被转换为"[object Object]"。结果就是, a[b]和a[c]均相当于a["[object Object]"] ,并可以互换使用。因此,设置或引用 a[c]和设置或引用 a[b]完全相同。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值