金山WPS笔试题总结

第一题 分别输出什么?

var arr=[];
arr['a']=1;
console.log(arr.length);// 0
arr['2']=2;
console.log(arr.length);// 3
arr.length=0;
console.log(arr);// [a:1]

这题考察数组的读写。js中数组本质上是一个特殊的对象,可以为其创建任意名字的属性,数组元素可以是任意类型。 数组通过[ ]操作符来访问数组中的一个元素,方括号中是一个返回非负整数值的任意表达式
这道题首先定义了一个空数组,此时数组长度为0。
接着是赋值语句arr['a']=1;因为数组是特殊的对象,所以通过方括号访问数组元素就像用方括号访问对象属性一样。当方括号中是字符a时,相当于给这个数组对象添加了一个属性a,其值为1。所有的索引都是属性名,但只有在0-2^32-2的之间的整数属性名才是索引。数组特别之处在于只有当属性是索引时,才会更新其length属性。由此可知,第一条输出语句输出结果为0,但是数组已经多了一个名为a,值为1的属性。
然后arr['2']=2; ,如果方括号中是非负整数的字符串,就当做数组索引,而非对象属性。所以这时给a[2]赋值为2,数组索引从0开始,意味着a[0] a[1]赋予undefined值,所以数组长度为3,即第二条输出语句输出结果为3。
最后将数组长度赋值为0,输出arr,此时输出是之前添加进数组的a属性。

2、添加代码实现每隔一秒按顺序输出i

for(var i=0,n=1;i<5;i++){
//添加代码
}

看到这道题我首先想到的就是用一个setTimeout()方法,该方法用于在指定的毫秒数后调用函数或计算表达式。于是写了如下代码:

for(var i=0,n=1;i<5;i++){
    setTimeout(function(){console.log(i);},1000);
}

看似这样就可以了,然而控制台的输出说明事情并不简单。
金山WPS笔试题总结_第1张图片
如图,控制台输出5个5,这是为什么?其实这和JavaScript执行机制以及作用域有关。
JavaScript的执行分为两个阶段,第一个阶段就是顺序执行

你可能感兴趣的:(js)