js函数题

1.下面代码的输出是什么?

	function sayHi() {
	  return (() => 0)();
	}
	
	typeof sayHi();

A: “object”
B: “number”
C: “function”
D: “undefined”
答案:B

sayHi函数返回立即调用的函数(IIFE)的返回值。 该函数返回0,类型为数字。

只有7种内置类型:null,undefined,boolean,number,string,object和symbol。 function不是一个类型,因为函数是对象,它的类型是object。

2.下面代码的输出是什么?

	(() => {
	  let x, y;
	  try {
	    throw new Error();
	  } catch (x) {
	    (x = 1), (y = 2);
	    console.log(x);
	  }
	  console.log(x);
	  console.log(y);
	})();

A: 1 undefined 2
B: undefined undefined undefined
C: 1 1 2
D: 1 undefined undefined
答案:A

catch块接收参数x。当我们传递参数时,这与变量的x不同。这个变量x是属于catch作用域的。
之后,我们将这个块级作用域的变量设置为1,并设置变量y的值。 现在,我们打印块级作用域的变量x,它等于1。
在catch块之外,x仍然是undefined,而y是2。 当我们想在catch块之外的console.log(x)时,它返回undefined,而y返回2。

3.下面代码的输出是什么?

	[[0, 1], [2, 3]].reduce(
	  (acc, cur) => {
	    return acc.concat(cur);
	  },
	  [1, 2]
	);

A: [0, 1, 2, 3, 1, 2]
B: [6, 1, 2]
C: [1, 2, 0, 1, 2, 3]
D: [1, 2, 6]
答案:C

[1,2]是我们的初始值。 这是我们开始执行reduce函数的初始值,以及第一个acc的值。 在第一轮中,acc是[1,2],cur是[0,1]。 我们将它们连接起来,结果是[1,2,0,1]。
然后,acc的值为[1,2,0,1],cur的值为[2,3]。 我们将它们连接起来,得到[1,2,0,1,2,3]。

4.下面代码的输出是什么?

	function* generator(i){
		yield i;
		yield i * 2;
	}
	const gen = generator(10);
	
	console.log(gen.next().value);
	console.log(gen.next().value);

A: [0,10] [10,20]
B: 20 20
C: 10 20
D: 0 10and10 20
答案:C

一般的函数在执行之后是不能中途停下的。但是,生成器函数却可以中途“停下”,之后可以再从停下的地方继续。当生成器遇到 yield关键字的时候,会生成 yield后面的值。注意,生成器在这种情况下不 返回(return )值,而是 生成 (yield)值。

首先,我们用 10作为参数 i来初始化生成器函数。然后使用 next()方法一步步执行生成器。第一次执行生成器的时候, i的值为 10,遇到第一个 yield关键字,它要生成 i的值。此时,生成器“暂停”,生成了 10。

然后,我们再执行 next()方法。生成器会从刚才暂停的地方继续,这个时候i还是 10。于是我们走到了第二个yield关键字处,这时候需要生成的值是 i*2, i为 10,那么此时生成的值便是 20。所以这道题的最终结果是 10,20。

5.下面代码的输出是什么?

	const person = {
		name:"Lydia",
		age:21
	};
	for(const item in person){
		console.log(item);
	}

A: {name:“Lydia”} , {age:21}
B: “name” , “age”
C: “Lydia” , 21
D: [“name”,“Lydia”] , [“age”,21]
答案:B

在 for-in循环中,我们可以通过对象的key来进行迭代,也就是这里的 name和 age。在底层,对象的key都是字符串(如果他们不是Symbol的话)。在每次循环中,我们将 item设定为当前遍历到的key.所以一开始, item是 name,之后 item输出的则是 age。

6.下面代码的输出是什么?

	function getInfo(member,year){
		member.name = "Lydia";
		year = "1998";
	}
	
	const person = { name:"Sarah" };
	const birthYear = "1997";

	getInfo(person,birthYear);

	console.log(person,birthYear);

A: {name:“Lydia”} , “1997”
B: {name:“Sarah”} , “1998”
C: {name:“Lydia”} , “1998”
D: {name:“Sarah”} , “1997”
答案:A

普通参数都是 值 传递的,而对象则不同,是 引用 传递。所以说, birthYear是值传递,因为他是个字符串而不是对象。当我们对参数进行值传递时,会创建一份该值的 复制 。(可以参考问题46)

变量 birthYear有一个对 "1997"的引用,而传入的参数也有一个对 "1997"的引用,但二者的引用并不相同。当我们通过给 year赋值 "1998"来更新 year的值的时候我们只是更新了 year(的引用)。此时 birthYear仍然是 “1997”.

而 person是个对象。参数 member引用与之 相同的 对象。当我们修改 member所引用对象的属性时, person的相应属性也被修改了,因为他们引用了相同的对象. person的name属性也变成了 “Lydia”.

发布了23 篇原创文章 · 获赞 0 · 访问量 481

猜你喜欢

转载自blog.csdn.net/weixin_45806273/article/details/104298299