1、下面代码的输出是什么?
const settings = {
username: "lydiahallie",
level: 19,
health: 90
};
const data = JSON.stringify(settings, ["level", "health"]);
console.log(data);
-
A:
"{"level":19, "health":90}"
-
B:
"{"username": "lydiahallie"}"
-
C:
"["level", "health"]"
-
D:
"{"username": "lydiahallie", "level":19, "health":90}"
答案: A
JSON.stringify
的第二个参数是 替代者(replacer). 替代者(replacer)可以是个函数或数组,用以控制哪些值如何被转换为字符串。如果替代者(replacer)是个 数组 ,那么就只有包含在数组中的属性将会被转化为字符串。在本例中,只有名为
"level"
和"health"
的属性被包括进来,"username"
则被排除在外。data
就等于"{"level":19, "health":90}"
.而如果替代者(replacer)是个 函数,这个函数将被对象的每个属性都调用一遍。函数返回的值会成为这个属性的值,最终体现在转化后的JSON字符串中(译者注:Chrome下,经过实验,如果所有属性均返回同一个值的时候有异常,会直接将返回值作为结果输出而不会输出JSON字符串),而如果返回值为
undefined
,则该属性会被排除在外。
2、下面代码的输出是什么?
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
方法添加的属性有了更多的控制权。
3、下面代码的输出是什么?
// 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
是只读的,不能被修改。
4、下面代码的输出是什么?
let person = { name: "Lydia" };
const members = [person];
person = null;
console.log(members);
-
A:
null
-
B:
[null]
-
C:
[{}]
-
D:
[{name:"Lydia"}
答案: D
5、下面代码的输出是什么?
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
++
先返回 操作值, 再累加 操作值
6、下面代码输出什么?
[1, 2, 3, 4].reduce((x, y) => console.log(x, y));
-
A:
1
2
and3
3
and6
4
-
B:
1
2
and2
3
and3
4
-
C:
1
undefined
and2
undefined
and3
undefined
and4
undefined
-
D:
1
2
andundefined
3
andundefined
4
答案: D
回调函数没有返回任何值,则返回undefined
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(String.raw`Hello\nworld`);
-
A:
Helloworld!
-
B:
Hello
world
-
C:
Hello\nworld
-
D:
Hello\n
world
答案: C
String.raw
函数是用来获取一个模板字符串的原始字符串的,它返回一个字符串,其中忽略了转义符(\n
,\v
,\t
等)。但反斜杠可能造成问题,因为你可能会遇到下面这种类似情况:
const path = `C:\Documents\Projects\table.html`
String.raw`${path}`
这将导致:
"C:DocumentsProjects able.html"
直接使用
String.raw
String.raw`C:\Documents\Projects\table.html`
它会忽略转义字符并打印:
C:\Documents\Projects\table.html
上述情况,字符串是
Hello\nworld
被打印出。
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
方法修改原始数组,如果你想从函数返回数组而不是数组长度,那么应该在pushitem
之后返回list
。