1、下面代码的输出是什么?
function checkAge(data) {
if (data === { age: 18 }) {
console.log("You are an adult!");
} else if (data == { age: 18 }) {
console.log("You are still an adult.");
} else {
console.log(`Hmm.. You don't have an age I guess`);
}
}
checkAge({ age: 18 });
引用类型对象在堆内存中是唯一的,不存在两个引用类型的对象相等的情况。该题中的{ age: 18 }是不同的两个对象,在函数checkAge中的实参里边对象,是arguments里的一个对象,而if语句中的对象,可以理解为当前作用域中的一个对象。所以是不相等的,最后会执行else语句,也就是输出:Hmm.. You don't have an age I guess
2、下面代码的输出是什么?
function getAge(...args) {
console.log(typeof args);
}
getAge(21);
扩展运算符(...args)返回的是一个数组,而typeof数组的时候是返回object,因为数组也是对象。顺便说一下,object可以返回的数据类型有6种:number、string、undefined、boolean、object、symbol。
3、下面代码的输出是什么?
function getAge() {
"use strict";
age = 21;
console.log(age);
}
getAge();
在严格模式下,如果对没有声明的变量进行赋值的话,会导致引用错误,所以这一题在程序运行到age = 21的时候就已经报错:ReferenceError,不会执行console.log。
4、下面代码的输出是什么?
const sum = eval("10*10+5");
eval函数接收一个字符串,然后将字符串转为表达式,然后去执行这个表达式。所以在这里js引擎会当做
10*10+5
这样的一个表达式来进行计算求值,然后返回数字105。
PS:eval函数会导致性能下降(在执行过程中修改了词法作用域,导致前面js引擎的优化无效),谨慎使用。
5、下面代码的输出是什么?
for (let i = 1; i < 5; i++) {
if (i === 3) continue;
console.log(i);
}
continue会导致程序跳出当前迭代,在这个例子中,当i等于3的时候,就不会输出i的值。而for循环中,只要i小于5都会执行函数体,所以最后输出的是:1、2、4