一.
1.下面代码输出什么?
console.log(3+ 4 + "5");
a."345" b."75" c.12 d."12"
b
2.下面代码输出什么?
[1,2,3].map(num => {
if(typeof num === "number") return;
return num * 2;
});
a.[] b.[null,null,null] c.[undefined,undefined,undefined] d.[3x empty]
C
对数组进行映射的时候, num就是当前循环到的元素. 在这个例子中,所有的映射都是number类型,所以if中的判断 typeofnum==="number"结果都是 true.map函数创建了新数组并且将函数的返回值插入数组。 但是,没有任何值返回。当函数没有返回任何值时,即默认返回 undefined.对数组中的每一个元素来说,函数块都得到了这个返回值,所以结果中每一个元素都是 undefined.
3.下面代码输出什么?
const set = new Set([1,1,2,3,4]);
console.log(set);
a.[1,1,2,3,4] b.[1,2,3,4] c.{1,1,2,3,4} d.{1,2,3,4}
D
Set对象手机 独一无二 的值:也就是说同一个值在其中仅出现一次。 我们传入了数组 [1,1,2,3,4],他有一个重复值 1.以为一个集合里不能有两个重复的值,其中一个就被移除了。所以结果是 {1,2,3,4}.
4.下面代码输出是什么?
// counter.js
let counter = 10;
export default counter;
// index.js
import myCounter from "./counter";
myCounter += 1;
console.log(myCounter);
a.10 b.11 c.Error d.NaN
C.
引入的模块是 只读 的: 不能修改引入的模块。只有导出他们的模块才能修改其值。 给 myCounter增加一个值的时候会抛出一个异常:myCounter是只读的,不能被修改。
5.下面代码输出什么?
const person = { name: "Lydia" };
Object.defineProperty(person, "age", { value: 21 });
console.log(person);
console.log(Object.keys(person));
A: {name:"Lydia",age:21}, ["name","age"]
B: {name:"Lydia",age:21}, ["name"]
C: {name:"Lydia"}, ["name","age"]
D: {name:"Lydia"}, ["age"]
B.
通过 defineProperty方法,我们可以给对象添加一个新属性,或者修改已经存在的属性。而我们使用 defineProperty方法给对象添加了一个属性之后,属性默认为 不可枚举(not enumerable). Object.keys方法仅返回对象中 可枚举(enumerable) 的属性,因此只剩下了 "name".
用 defineProperty方法添加的属性默认不可变。你可以通过 writable, configurable 和 enumerable属性来改变这一行为。这样的话, 相比于自己添加的属性, defineProperty方法添加的属性有了更多的控制权。
6.下面代码输出是什么?
let num = 10;
const increaseNumber = () => num++;
const increasePassedNumber = number => number++;
const num1 = increaseNumber();
const num2 = increasePassedNumber(num1);
console.log(num1);
console.log(num2);
A: 10, 10 B: 10, 11 C: 11, 11 D: 11, 12
A.
一元操作符 ++ 先返回 操作值, 再累加 操作值。num1的值是 10, 因为 increaseNumber函数首先返回 num的值,也就是 10,随后再进行 num的累加。 num2是 10因为我们将 num1传入 increasePassedNumber. number等于 10( num1的值。同样道理, ++ 先返回 操作值, 再累加 操作值。) number是 10,所以 num2也是 10.
7.下面代码输出是什么?
// index.js
console.log('running index.js');
import { sum } from './sum.js';
console.log(sum(1, 2));
// sum.js
console.log('running sum.js');
export const sum = (a, b) => a + b;
A: running index.js, running sum.js, 3
B: running sum.js, running index.js, 3
C: running sum.js, 3, running index.js
D: running index.js, undefined, running sum.js
B
import命令是编译阶段执行的,在代码运行之前。因此这意味着被导入的模块会先运行,而导入模块的文件会后执行。 这是CommonJS中 require()和 import之间的区别。使用 require(),您可以在运行代码时根据需要加载依赖项。如果我们使用 require而不是 import, running index.js, running sum.js, 3会被依次打印。
8.下面代码输出是什么?
console.log(Number(2) === Number(2))
console.log(Boolean(false) === Boolean(false))
console.log(Symbol('foo') === Symbol('foo'))
A: true, true, false B: false, true, false C: true, false, true D: true, true, true
A 每个 Symbol都是完全唯一的。传递给 Symbol的参数只是给 Symbol的一个描述。Symbol的值不依赖于传递的参数。当我们测试相等时,我们创建了两个全新的符号:第一个 Symbol('foo'),第二个 Symbol('foo'), 这两个值是唯一的,彼此不相等,因此返回 false。
9.下面代码输出是什么?
function addToList(item, list) {
return list.push(item);
}
const result = addToList("apple", ["banana"]);
console.log(result);
A: ['apple','banana']
B: 2
C: true
D: undefined
B
push()方法返回新数组的长度。一开始,数组包含一个元素(字符串 "banana"),长度为1。 在数组中添加字符串 "apple"后,长度变为2,并将从 addToList函数返回。 push方法修改原始数组,如果你想从函数返回数组而不是数组长度,那么应该在push item之后返回 list。
10.下面代码输出是什么?
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。
二.
1.请描述下v-show和v-if的区别
2.父组件和组件传值是什么
3.深拷贝和浅拷贝的区别是?请举例
4.get和post请求有什么区别
5.请详细说下你对Vue生命周期的理解
6.介绍一下你对浏览器内核的理解
搜了下发现第一大题的选择题全部抄自github很火的 javascript-questions。。。