文章目录
1 - 10
1.下面代码执行结果是?
var h5course = false;
var result = h5course / 0;
if (result) {
console.log(result * 2 + "2" + 4);
} else {
console.log(!result * 2 + "2" + "4");
}
答案:“224”
解析:0/0
,null/0
,undefined/0
,false/0
都为 NaN,其它整数/0 为 infinity
,其它负数/0 为 -infinity
。
2.下面代码的执行结果是什么?
console.log(2.toString());
答案:报错:Invalid or unexpected token
解析:在 2.toString()
这条语句中,这个 .
有两个解释:1. 小数点;2. 方法调用;所以这里产生了歧义。在这里因为这个点紧跟于一个数字之后,所以按照规范,解释器就把它判断为一个小数点,这条语句就变成了一个浮点数,但是 toString()
不是一个数字,所以编译之后就报错了。
解决这个问题有以下几种方式:
console.log(2..toString()); // 这里第一个 . 是表示小数点;相当于(2.0).toString()
console.log(2 .toString()); // 这里使用一个空格来告诉解释器,这个 . 是方法调用
console.log((2).toString()); // () 的优先级高,优先解释
3.下面代码执行结果是什么?
function A(a) {
A = function (b) {
console.log(a + b);
};
console.log(a++);
}
A(1);
A(2);
答案:1、4
4.下面代码的执行结果是?
var str = new Array(4).toString();
console.log(str);
结果:',,,'
解析:
new Array(); // [] 无参数:声明一个空数组;
new Array(4); // [,,,] 一个参数:声明一个长度为4的数组,但数组没有任何元素;
new Array(1, 2); // [1, 2] 多个参数:声明一个数组,参数都为数组的元素;
5.下面代码执行结果?
var num = 3;
conosle.log(num.toString(2));
console.log(num.toFixed(2));
结果:11、3.00
解析:
toString()
传入一个参数时:表示把当前数字当成10进制转成对应的进制数,此题目是转成2进制。
toFixed()
方法把当前数字变成保留指定位数的小数,注意会四舍五入!,此题保留2位小数。
6.有2个变量 a
和 b
,其值都为 number
类型且非 NaN,不借助其它变量,完成 a
与 b
的交换。
答案:
// 方法一
var a = 1;
var b = 2;
a = a + b - a;
b = a + b - b;
7.下面代码的执行结果是什么?
var a = {},
b = { key: "b" },
c = { key: "c" };
a[b] = 123;
a[c] = 456;
console.log(a[b]);
答案:456
解析:在设置对象的属性时,如果属性传入一个对象,JS 会隐式的将变量变成字符串类型,所以 a[b]
和 a[c]
其实都相当于 a['[Object Object]']
,所以操作的都是对象 a
的同一个属性。
8.下面代码的执行结果是什么?
var user = "Alice";
function changeUser() {
user = "Tom";
console.log(user);
return;
function user() {
console.log("user function");
}
}
changeUser();
console.log(user);
自己做的结果:‘Tom’,‘Tom’
正确答案:‘Tom’,‘Alice’
解析:
错误思路:changeUser
里面的 user = 'Tom'
重写了全局变量。
正确思路:执行 changeUser
函数的时候,预编译将里面的变量 user
提升了,语句 user = 'Tom'
是在给局部变量赋值。
9.下面代码的执行结果是什么?
(function () {
var user = (author = "Alice");
})();
console.log(author);
console.log(user);
自己做的结果:undefined、undefined
正确答案:‘Alice’,user is not defined
解析:当不使用 var 声明变量时,默认为全局变量,所以能够访问到 author;user 是局部变量,在全局是无法访问到的。
10.下面代码的执行结果是什么?
function fn() {
console.log(this);
}
var obj = {
method: function (fn) {
fn();
arguments[0]();
},
};
obj.method(fn);
结果:Window,Arguments
11.如何获取函数实参和形参的个数?
function fn(a, b) {
//1. 获取实参个数的方式:
console.log(arguments.length); // 5
// 2. 获取形参个数的方式:
console.log(arguments.callee.length); // 2
arguments.callee === fn, // 所以也可以用fn.length获取形参个数;
console.log(fn.length); // 2
}
fn(1, 2, 3, 4, 5);
12.下面代码的执行结果是什么?
function fn(val) {
this.x = val;
return this;
}
var x = fn(5);
var y = fn(10);
console.log(x.x);
console.log(y.x);
结果:undefined,10
解析:在fn(5)执行完,window.x === window
;在fn(10)
执行的时候,window.x = 10
,window.y === window
;
因此x.x
其实就是new Number(10).x
,所以打印出undefined
,y.x
其实就是window.x
,所以打印出10
13.下面代码的执行结果是什么?
var x = 5;
function fn(x) {
// var x;
x = 8;
console.log(x);
}
fn();
console.log(x);
结果:8,5
解析:fn打印的x是局部变量x,所以先打印8,外面打印全局window的x,所以打印出5
14.下面代码的执行结果是什么?
var result = (function fn(n) {
return n > 1 ? n * fn(n - 1) : n;
})(10);
console.log(result);
答案:10的阶层,即3628800