- 下列关于 js 函数定义方式的描述正确的是
A. function add(a,b){return a+b;}函数表达式
B. var add=new Function(‘a’,’b’,’return a+b’)函数表达式
C. function add(a,b){return a+b;}函数声明
D. var add=function(a,b){return a+b;}函数声明
E. var add=new Function(‘a’,’b’,’return a+b’);函数声明
解析
函数声明
function sum(a,b){
return a+b
}
函数表达式
var sum = function(a,b){
return a+b
}
Function构造函数【从技术角度讲,这是一个函数表达式】
var sum = new Function('a','b','return a+b')//不推荐使用,影响函数解析性能
- 控制台打印的结果是?
for(let i=0;i<2;i++){
setTimeout(function(){
console.log(i)
},100);
}
for(var i=0;i<2;i++){
setTimeout(function(){
console.log(i)
},100);
}
A. 0 1 2 2
B. 0 1 0 1
C. 0 1 1 1
D. 1 1 0 0
解析
- Js是单线程的,Settimeout是异步宏任务,所以代码执行遇到异步的,就放在事件队列中的,等线程中的任务执行完后才会执行事件队列中的任务。
- let是es6中声明变量的方式,有自己的作用域块,可以放变量,所以let绑定for循环时,每个i都有自己的值. 在这个for循环中就是满足一次条件向事件队列中添加一个打印i的事件,且每个事件中的i有自己的值
- Var没有作用域块,for循环的变量就会后一个覆盖前一个,当循环完毕时i就只有一个值,又因为for循环的判断条件是不满足跳出,所以i最后是2而不是1
- 这些完了后执行事件队列中的任务,就打印了0122 ...
如果想要调用obj对象的arr属性,以下做法中,错误的是()
A. obj["arr"]
B. obj["a"+"r"+"r"]
C. obj{"arr"}
D. obj.arr
解析
在js中,调用对象属性的方法包括使用点操作符或者中括号,使用对象.属性进行调用时,一般情况下,属性是不需要带引号的;而使用中括号进行调用时,属性一般是以字符串的形式,也可以是变量或者表达式,ABD选项的做法均正确,C选项的做法是错误,不能使用花括号来调用对象的属性。
执行以下程序,输出结果为()
var str = 'acdaecad';
var obj = {};
for (var i = 0;i<str.length;i++){
if (obj[str.charAt(i)]){
obj[str.charAt(i)]++;
}
else {
obj[str.charAt(i)] = 1;
}
}
var val1;
var val2 = 0;
for (var k in obj) {
if (obj[k] > val2){
val2 = obj[k];
val1 = k;
}
}
console.log(val1);
A. a
B. 3
C. e
D. 1
解析
- 定义一个空对象
obj,用于存储每个字符及其出现的次数。 - 遍历字符串
str中的每个字符。如果字符已经在obj中,就将其计数加一;如果字符不在obj中,就将其添加到obj中,并将其计数设为一。 - 定义两个变量
val1和val2,用于存储出现次数最多的字符及其出现的次数。 - 遍历
obj中的每个字符及其出现的次数。如果一个字符的出现次数大于val2,就更新val1和val2。 - 最后,打印出现次数最多的字符
val1。
例如,对于输入字符串 'acdaecad',输出将是 'a',因为 'a' 在字符串中出现了 3 次,这是所有字符中最多的。
16.下面这段代码的输出是
var b = 3;
(function(){
b = 5;
var b = 2;
})();
console.log(b);
A. 5
B. 3
C. 2
D. 程序报错
解析
立即执行函数,执行完毕后会立即销毁,所以立即执行函数内部的变量b就被回收了,但是全局变量b不会被回收,所以console.log输出的就是全局变量
b=3