写出下列代码的输出结果:
var arr1 = [10, 20];
arr1.push(30);
arr1.push([40, 50]);
var data = arr1.pop();
console.log(data);
上述代码的输出结果为 [40, 50]。
数组的方法 push() 表示入栈,即在栈顶(数组尾端)添加指定的元素;方法 pop() 表示出栈,删除并返回栈顶(数组尾端)的元素。
代码中,第一次入栈为数字 30;第二次入栈为数组 [40,50],且该数组排在栈顶。因此,调用方法 pop() 时,将删除并返回栈顶元素 [40,50],这是一个数组,因此输出结果为[40, 50]。
写出下列代码的输出结果:
var arr1 = [10, 20, 30, 40];
arr1.push(50);
arr1.shift();
console.log(arr1);
上述代码的输出结果为[20, 30, 40, 50]。
数组的方法 push() 表示入栈,即在栈顶(数组尾端)添加指定的元素,因此,数字50 将作为数组的最后一个元素;方法 shift() 表示删除并返回栈底(数组头部)的元素,因此,将从数组删除数值 10。此时,输出数组,将输出剩余的 4 个数值,即[20, 30, 40, 50]。
写出下列代码的输出结果:
var regexp = /\bdo\b/ig;
var data = 'He does told to Do,do.';
console.log(data.search(regexp));
上述代码的输出结果为16。
String 的 search(regexp) 方法,用于返回第一次出现匹配指定正则表达式的下标,若没有匹配则返回-1。
试题中,正则表达式 \bdo\b 表示匹配完整的单词 do,且不区分大小写。而变量 data 中,第一次出现单词 do(不区分大小写)的位置为 16。
function add(num) {
try {
num = Number(num);
if (isNaN(num)) {
throw new Error('Arguments is NaN');
}
console.log('try block end');
} catch (e) {
console.log('catch block');
return;
} finally {
console.log('finally block');
}
console.log('function end');
}
add('10x');
上述代码运行,会先输出 catch block;再输出 finally block。
这是因为,执行代码 num = Number(num); 时,因为传入的参数值为字符串“10x”,无法转换为 number 类型,则产生错误,运行到 catch 语句块中,输出“catch bloc”;而 finally 块始终会运行,因此继续输出“finally block”。程序发生异常后,将退出,因此不再执行其他语句。
var a = 100;
function f() {
var a = 200;
function g() {
return a;
}
return g;
}
console.log(f()());
上述代码运行,会输出200。
上述代码意味着,先执行 f(),得到该函数内嵌套的一个函数对象 g,然后调用这个嵌套的函数。
定义函数 f 时,它保存一个作用域链,作用域链上有两个对象,一个是函数对象,一个是全局对象,此时,全局变量 a 是全局对象的属性,和函数对象 f 无关。
执行函数 f 时,会创建一个活动对象,其中保存变量 a 作为函数 f 的属性而存在。而函数g嵌套定义在函数 f里,对其访问变量 a时,它没有变量 a,则继续往下查找函数 f。找到函数 f 的属性 a 并返回。因此,输出结果为 200。
这种函数将变量包裹起来,外部代码可以通过内嵌函数 g来访问函数 f 内的局部变量的方式,也称为闭包。
var n = 10;
function counter() {
var n = 0;
var g = function () {
return ++n;
};
return g;
}
var c1 = counter();
console.log(c1());
console.log(c1());
console.log(c1());
上述代码运行后,分别输出数字 1、2、3。
首先从应用上分析,这是一个闭包的典型应用:模拟计数器。调用一次函数counter,则得到一个计数器,即代码中的变量 c1,用于统计被调用的次数;每运行一次计数器c1,则访问次数加1。因此分别输出数字1、2、3。
其次从代码原理来分析:函数 counter 返回其内嵌函数g,该函数中包裹了函数 counter 的局部变量 n,其初始值为 0;每次运行函数g,均访问相应的局部变量 n,从而实现累加计数的效果。