前端笔试题
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<script>
//1.
console.log((function(a){}).length); //1
console.log((function(a=5){}).length);//0
console.log((function(a,b=5,c){}).length);//1
console.log((function(a,b=5,c=5){}).length);//1
//函数指定了默认值后,函数的length属性返回的就不再是函数参数个数,而是第一个指定默认值的前面参数个数。也就是说指定了默认值后,函数的length属性将失真。这是因为length属性的含义是,该函数预期传入的参数个数,某个参数指定默认值后,预期传入的参数个数就不包括这个参数及其后面的参数
//2.
var a=undefined,b=NaN;
console.log(a+b); //NaN
var c=NaN,d='undefined';
console.log(c+d); //NaNundefined
//3.
var a = 10;b = 20;c = 4;
console.log(++b+c+a++); //35
//4.
console.log(null == undefined); //true
//5.
var a=0,b=0;
function add(a){
add = function(b){
alert(++a + b++);
}
alert(a++);
}
add(1); //1
add(2); //5
// 第一次执行的是外层的add,第二次执行的是内层的add(第一次执行外层add时,里面定义了全局add 覆盖了标识符),内层add函数中的a是2 ++后是3,3+2 结果5,闭包
//6.
var a = {
name:'json',
sayName:function(){
console.log(this.name);
}
};
var name = 'Aaron';
function sayName(){
var sss = a.sayName;
sss(); // Aaron
a.sayName(); // json
(a.sayName)(); // json
(b=a.sayName)(); // Aaron
b=a.sayName;
b(); // Aaron
}
sayName();
//7.
var reg = /^[a-zA-Z_][a-zA-Z0-9]{5,20}/,
name1 = 'tanbayi';
name2 = '0tanbayi';
name3 = '你好tanbayi';
name4 = 'hi';
alert(reg.test(name1)); //true
alert(reg.test(name2)); //false
alert(reg.test(name3)); //false
alert(reg.test(name4)); //false
//8.
console.log(typeof(undefined)==='undefined'); //true
console.log(typeof('1314'-0)==='number'); //true
console.log(typeof({})==='object'); //true
console.log(typeof(null));//object
console.log(typeof(undefined)); //undefined
console.log(typeof(null)==='object'); //true
//9
var m= 1, j = k = 0;
function add(n) {
return n = n+1;
}
y = add(m);
function add(n) {
return n = n + 3;
}
z = add(m);
y和z的最终结果为: //4,4
// js里面没有函数重载的概念,在其他语言中(如java)java中,可以存在同名函数,
// 只要传入的参数数量或者类型不同即可。在js中,定义了两个同名函数后,
// 后面的函数会覆盖前面定义的函数。结合这道题来说,由于函数声明提升,
// 所以函数声明会提前,由于存在同名函数,后面的add函数将覆盖第一个add函数,
// 所以两次调用add()返回的值是相同的。也就是y,z都为4.
</script>
</body>
</html>