百分百源码网-让建站变得如此简单! 登录 注册 签到领金币!

主页 | 如何升级VIP | TAG标签

当前位置: 主页>网站教程>JS教程> 分享 10 个提高 JavaScript 技艺的检验问答
分享文章到:

分享 10 个提高 JavaScript 技艺的检验问答

发布时间:09/01 来源:未知 浏览: 关键词:

刷题是我们提高本人技术的一种好办法。下面的问题很有挑衅性和“引导性”。假如你知道该怎样答复,那意味着本人的水平很好,但是假如你发明本人答错了,并能够搞分明为什么错,我认为那会更好!

引荐学习:JavaScript视频教程 、 js教程(图文)

1. 数组排序比力

看以下数组,在各种排序操纵后都下输出什么?

const arr1 = ['a', 'b', 'c'];
const arr2 = ['b', 'c', 'a'];

console.log(
  arr1.sort() === arr1,
  arr2.sort() == arr2,
  arr1.sort() === arr2.sort()
);

答案和解析

答案: true, true, false

这里有几个概念在起作用。第一,array 的 sort 办法对原始数组停止排序,并返回对该数组的援用。这意味着当你调取 arr2.sort() 时,arr2 数组内的对象将会被排序。

当你比力对象时,数组的排序次序并不重要。由于 arr1.sort()arr1 指向内存中的统一对象,因此第一个相等测试返回 true。第二个比力也是如此:arr2.sort() 和 arr2 指向内存中的统一对象。

在第三个测试中,arr1.sort()arr2.sort() 的排序次序雷同;但是,它们指向内存中的不一样对象。因此,第三个测试的评估结果为 false

2. set 的对象

把下面的 Set 对象转成一个新的数组,最后输出什么?

const mySet = new Set([{ a: 1 }, { a: 1 }]);
const result = [...mySet];
console.log(result);

答案和解析

答案: [{a: 1}, {a: 1}]

尽管 Set 对象确实会删除反复项,但是我们用 Set 创立的两个值是对内存中不一样对象的援用,尽管它们有雷同的键值对。这与 { a: 1 } === { a: 1 } 的结果为 false 的缘由雷同。

假如汇合是用对象变量创立的,例如 obj = {a: 1}new Set([obj,obj]) 将会只要一个元素,由于数组中的两个元素都援用了内存中的统一对象。

3. 深层对象的可变性

下面的对象代表会员 Joe 和他的狗 Buttercup。我们用 Object.freeze 留存对象,然后尝试更换 Buttercup 的 name。最后会输出什么?

const user = {
  name: 'Joe',
  age: 25,
  pet: {
    type: 'dog',
    name: 'Buttercup',
  },
};

Object.freeze(user);

user.pet.name = 'Daffodil';

console.log(user.pet.name);

答案和解析

答案:Daffodil

Object.freeze 将会使对象浅冻结,但不会庇护深层属性不被修改。在这个例子中,不克不及对 user.age 停止修改,但是对 user.pet.name 停止修改却没有问题。假如我们觉得需要庇护一个对象,幸免其“从头到尾”发生改动,则可以递归地利用 Object.freeze 或使用现有的“深度冻结”库。

4. 原型继承

鄙人面的代码中,有一个 Dog 结构函数。我们的 dog 明显有 speak 这个操纵。当我们调取 Pogo 的 speak 时,会输出什么?

function Dog(name) {
  this.name = name;
  this.speak = function() {
    return 'woof';
  };
}

const dog = new Dog('Pogo');

Dog.prototype.speak = function() {
  return 'arf';
};

console.log(dog.speak());

答案和解析

答案:woof

每次创立一个新的 Dog 实例时,我们都会将该实例的 speak 属性设定为返回字符串 woof 的函数。由于每次我们创立一个新的Dog实例时都要设定该值,因此说明器不会沿着原型链去寻 speak 属性。结果就不会使用 Dog.prototype.speak 上的 speak 办法。

5. Promise.all 的解决次序

在这个问题中,我们有一个 timer 函数,它返回一个 Promise ,该 Promise 在随机时间后解析。我们用 Promise.all 解析一系列的 timer。最后的输出是啥,是随机的吗?

const timer = a => {
  return new Promise(res =>
    setTimeout(() => {
      res(a);
    }, Math.random() * 100)
  );
};

const all = Promise.all([timer('first'), timer('second')]).then(data =>
  console.log(data)
);

答案和解析

答案: ["first", "second"]

Promise 解决的次序与 Promise.all 无关。我们能够可靠地依托它们依照数组参数中供给的雷同次序返回。

6. Reduce 数学

数学时间!输出什么?

const arr = [x => x * 1, x => x * 2, x => x * 3, x => x * 4];

console.log(arr.reduce((agg, el) => agg + el(agg), 1));

答案和解析

答案: 120

使用 Array#reduce 时,聚合器的初始值(在此称为 agg)在第二个参数中给出。在这种状况下,该值为 1。然后可以如下迭代函数:

1 + 1 * 1 = 2(下一次迭代中聚合器的值)

2 + 2 * 2 = 6(下一次迭代中聚合器的值)

6 + 6 * 3 = 24(下一次迭代中聚合器的值)

24 + 24 * 4 = 120(终究值)

因此它是 120。

7. 短路通知(Short-Circuit Notification(s))

让我们向会员显示一些通知。以下代码段输出了什么?

const notifications = 1;

console.log(
  `You have ${notifications} notification${notifications !== 1 && 's'}`
);

答案和解析

答案:“You have 1 notificationfalse”

不幸的是,我们的短路评估将没法按预测工作: notifications !== 1 && 's' 评估为 false,这意味着我们实际上将会输出 You have 1 notificationfalse。假如但愿代码段正常工作,则可以思考前提运算符: ${notifications === 1 ? '' : 's'}

8. 展开操纵和重命名

查看以下代码中有单个对象的数组。当我们扩展该数组并更换 0 索引对象上的 firstname 属性时会发生什么?

const arr1 = [{ firstName: 'James' }];
const arr2 = [...arr1];
arr2[0].firstName = 'Jonah';

console.log(arr1);

答案和解析

答案: [{ firstName: "Jonah" }]

展开操纵符会创立数组的浅表副本,这意味着 arr2 中包括的对象与 arr1 所指向的对象雷同。所以在一个数组中修改对象的 firstName 属性,也将会在另一个数组中更换。

9. 数组办法绑定

在以下状况下会输出什么?

const map = ['a', 'b', 'c'].map.bind([1, 2, 3]);
map(el => console.log(el));

答案和解析

答案: 1 2 3

['a', 'b', 'c'].map 被调取时,将会调取 this' 值为 '['a','b','c']Array.prototype.map。但是当用作 援用 时, Array.prototype.map 的援用。

Function.prototype.bind 会将函数的 this 绑定到第一个参数(在本例中为 [1, 2, 3]),用 this 调取Array.prototype.map 将会致使这些项目被迭代并输出。

10. set 的独一性和次序

鄙人面的代码中,我们用 set 对象和扩展语法创立了一个新数组,最后会输出什么?

const arr = [...new Set([3, 1, 2, 3, 4])];
console.log(arr.length, arr[2]);

答案和解析

答案: 4 2

set 对象会强迫里面的元素独一(汇合中已经存在的反复元素将会被忽略),但是不会改动次序。所以 arr 数组的内容是 [3,1,2,4]arr.length4,且 arr[2](数组的第三个元素)为 2

打赏

打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

百分百源码网 建议打赏1~10元,土豪随意,感谢您的阅读!

共有151人阅读,期待你的评论!发表评论
昵称: 网址: 验证码: 点击我更换图片
最新评论

本文标签

广告赞助

能出一分力是一分吧!

订阅获得更多模板

本文标签

广告赞助

订阅获得更多模板