第一题
1 | let func = function() {}; |
"""func""anonymous"undefined
这道题考察ES6中function的name属性,ES6会返回实际的函数名,而ES5则返回空字符串,因此这道题的结果是 func。
第二题
1 | var DOLPHIN = "\ud83d\udc2c"; |
- 2
- 3
- 4
这道题涉及到ES6中Unicode字符,DOLPHIN.length返回长度为2,这是因为JavaScript内部字符以UTF-16的格式存储,每个字符固定为2个字节,因此DOLPHIN被认为为两个字符;[…DOLPHIN]用来解构字符串,结果是一个字符,因此[…DOLPHIN].length值为1。所以这个题的答案是 3。
第三题
1 | var sym1 = Symbol(), |
- 1
- 2
- 3
- 4
这道题考察了Object对象三个方法的使用,defineProperties方法用来定义对象的属性以及其特性(是否可写,可配置,可枚举);assign方法用来拷贝对象的属性,但是不可枚举的属性不会引入新对象中;getOwnPropertSymbols方法用来获取所有Symbol属性,包括不可枚举的Symbol属性。因此o1含有Symbol属性长度为1, o2含有Symbol属性长度为2,程序运行结果为 3。
第四题
1 | var obj1 = {["__proto__"]: "FOO"}; |
[true, true, true][true, false, false][true, false, false][false, false, false][false, true, true]- thrown
TypeError
__proto__魔法属性与非计算属性名的关系,可以看这里的运行原理__proto__ Property Names in Object Initializers。这道题的运行结果为 [true, false, false]。
第五题
1 | function foo (a, b) { |
- “A”
- “B”
- thrown “TypeError”
这道题考察了arrow函数定义与运行时arguments指向,arrow函数在定义时已经将arguments绑定在词法中,类似this、super和new.target,因此结果为 A。
第六题
1 | var f = () => { foo: "BAR" }; |
- “string”
- “object”
- “undefined”
箭头函数里面的内容不会被解析成对象字面量,但是会作为区块和标记声明。没有包含return语句,所以return的值为 underfined。
第七题
1 | [ |
[true, true, true][false, true, true][true, true, false][false, true, false]
模板字符串与普通字符串的关系、模板字符串处理String.raw会将没有转义的字符转义。数组的结果为 [true, true, false]。
第八题
1 | function foo () { |
这道题比较迷惑的是obj.foo函数内的foo函数指向哪个函数,这个foo(1)执行调用的函数是外部定义的foo函数,没有绑定在obj对象上。运行结果为 outside。
第九题
1 | var f = () => { foo: function() { return "FOO"; } }; |
"object""function""undefined"- thrown
SyntaxError
箭头函数内部解析成标记声明,但是缺乏function名字,导致了语法错误。结果是 thrown SyntaxError。
第十题
1 | ; |
"object""function""undefined"- thrown
SyntaxError
在strict模式下标记函数声明(Labelled Function Declarations)会出现语法错误。这道题的结果自然为 thrown SyntaxError。
第十一题
1 | var obj = { |
["obj", undefined]["Foo", undefined][undefined, "Foo"]- thrown
SyntaxError - thrown
TypeError
ES6中对象的属性简洁表示法中,函数作为对象的方法定义不具有[[Construct]]内部方法。obj.Foo()只是一个函数而不是构造函数,不能用new操作,出现 thrown TypeError。
第十二题
1 | (function(arg1, ...rest) { |
这道题涉及到函数声明和函数参数内部机制,当函数参数出现rest参数时argmuments被创建成UnmappedArgumentsObject对象。unmapped argument object意味着函数在传实参后arguments对象值不会再改变。创建成这种参数对象的情况还有以下几种:严格模式下、非严格模式下某些情况(含有rest参数、任何具有初始值的参数、任何具有解构参数)。所以这道题的结果是 1。
第十三题
1 | console.log([ |
[false, true, true, false, true][false, false, false, false, false][false ,false, true, true, true]
这道题考察了稀疏数组和稠密数组的生成与区别,稀疏数组与稠密数组的不同是数组每项元素是否都存在,稀疏数组不存在的元素项不可遍历。ES6的方法会将稀疏数组转化成稠密数组,默认是undefined值。上面的结果是 [false, false, true, true, true]。
第十四题
1 | var result = []; |
[1, 1][][1]- thrown
TypeError
ES5中的遍历方法会忽略空的数组项,ES6会把空的数组项设为undefined。上面的result值为 [1]。
第十五题
1 | function getPrototypeChainOf(obj) { |
2345
这道题涉及到generator函数原型链方面的知识。从generator函数原型一直往上遍历的原型顺序分别为:Genetator、GeneratorFunction、Symbol.iterator、Object。所得到的原型链长度为 4。
第十六题
1 | var list = ["1", NaN, 3, "a"]; |
[1, 1][1, 2][2, 1][2, 2]
这道题需要区分Number.isNaN和isNaN方法,两者的不同点是前者不会对输入数据进行类型转化直接判断结果,只有NaN为true,其他都为false。上面数组的结果是 [1, 2]。
第十七题
1 | var obj = { |
23- thrown
TypeError
Array.from会将伪数组和可迭代对象转换成数组对象,判断其长度会先去看迭代器的内容,因此上面的结果是 2。