javascript 学习笔记深入篇3

61 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 10 天,点击查看活动详情

Object.values 和 Object.entries 方法之间的主要区别是什么?

Object.values() 方法的行为类似于 Object.entries() 方法,但它返回一个值数组而不是 [key,value] 对。

const object = {
  a: "Good morning",
  b: 100,
};

for (let value of Object.values(object)) {
  console.log(`${value}`); // 'Good morning'
  100;
}

什么是弱集?

WeakSet 用于存储弱(弱引用)持有对象的集合。语法如下,

new WeakSet([iterable]);

让我们看下面的例子来解释它的行为,

var ws = new WeakSet();
var user = {};
ws.add(user);
ws.has(user); // true
ws.delete(user); // removes user from the set
ws.has(user); // false, user has been removed

WeakSet 和 Set 有什么区别

主要区别在于对 Set 中对象的引用是强引用,而对 WeakSet 中对象的引用是弱引用。也就是说,WeakSet 中的对象如果没有其他引用可以被垃圾回收。其他区别是:

  1. 集合可以存储任何值,而 WeakSet 只能存储对象的集合
  2. 与 Set 不同,WeakSet 没有大小属性
  3. WeakSet 没有 clear、keys、values、entries、forEach 等方法。
  4. WeakSet 不可迭代。

列出 WeakSet 上可用的方法集合

以下是 WeakSet 上可用的方法列表,

  1. add(value): 一个新对象被附加给定的值到weakset
  2. delete(value):从 WeakSet 集合中删除值。
  3. has(value):如果该值存在于 WeakSet 集合中,则返回 true,否则返回 false。

让我们在示例中查看上述所有方法的功能,

var weakSetObject = new WeakSet();
var firstObject = {};
var secondObject = {};
// add(value)
weakSetObject.add(firstObject);
weakSetObject.add(secondObject);
console.log(weakSetObject.has(firstObject)); //true
weakSetObject.delete(secondObject);

什么是 WeakMap

WeakMap 对象是键/值对的集合,其中的键被弱引用。在这种情况下,键必须是对象,值可以是任意值。语法如下所示,

new WeakMap([iterable]);

让我们看下面的例子来解释它的行为,

var ws = new WeakMap();
var user = {};
ws.set(user);
ws.has(user); // true
ws.delete(user); // removes user from the map
ws.has(user); // false, user has been removed

WeakMap 和 Map 有什么区别

主要区别在于 Map 中对关键对象的引用是强引用,而 WeakMap 中对关键对象的引用是弱引用。即,如果没有其他引用,WeakMap 中的关键对象可以被垃圾回收。其他区别是,

  1. Maps 可以存储任何键类型,而 WeakMaps 只能存储键对象的集合
  2. 与 Map 不同,WeakMap 没有 size 属性
  3. WeakMap 没有 clear、keys、values、entries、forEach 等方法。
  4. WeakMap 不可迭代。

列出 WeakMap 上可用的方法集合

以下是 WeakMap 上可用的方法列表,

  1. set(key, value):为 WeakMap 对象中的键设置值。返回 WeakMap 对象。
  2. delete(key):删除与键关联的任何值。
  3. has(key):返回一个布尔值,断言一个值是否已经关联到 WeakMap 对象中的键。
  4. get(key):返回与键关联的值,如果没有则返回未定义。让我们在示例中查看上述所有方法的功能,
var weakMapObject = new WeakMap();
var firstObject = {};
var secondObject = {};
// set(key, value)
weakMapObject.set(firstObject, "John");
weakMapObject.set(secondObject, 100);
console.log(weakMapObject.has(firstObject)); //true
console.log(weakMapObject.get(firstObject)); // John
weakMapObject.delete(secondObject);

uneval 的目的是什么

uneval() 是一个内置函数,用于创建对象源代码的字符串表示形式。它是顶级函数,不与任何对象相关联。让我们看下面的例子来了解更多关于它的功能,

var a = 1;
uneval(a); // returns a String containing 1
uneval(function user() {}); // returns "(function user(){})"

uneval 和 eval 有什么区别

uneval函数返回给定对象的来源;而该eval函数则相反,通过在不同的内存区域中评估该源代码。让我们看一个例子来阐明区别,

var msg = uneval(function greeting() {
  return "Hello, Good morning";
});
var greeting = eval(msg);
greeting(); // returns "Hello, Good morning"

什么是 javascript 访问器

ECMAScript 5 通过 getter 和 setter 引入了 javascript 对象访问器或计算属性。Getters 使用get关键字,而 Setters 使用set关键字。

var user = {
  firstName: "John",
  lastName : "Abraham",
  language : "en",
  get lang() {
    return this.language;
  },
  set lang(lang) {
  this.language = lang;
  }
};
console.log(user.lang); // getter access lang as en
user.lang = 'fr';
console.log(user.lang); // setter used to set lang as fr