193.赋值方法有哪些应用?
下面是 Object.assign() 方法的一些主要应用,
它用于克隆对象。
它用于合并具有相同属性的对象。
194.什么是Proxy(代理)对象?
Proxy 对象用于定义基本操作的自定义行为,例如属性查找、赋值、枚举、函数调用等。语法如下:
var p = new Proxy(target, handler);
1
让我们以代理对象为例,
var handler = { get: function(obj, prop) { return prop in obj ? obj[prop] : 100; } }; var p = new Proxy({}, handler); p.a = 10; p.b = null; console.log(p.a, p.b); // 10, null console.log('c' in p, p.c); // false, 100
在上面的代码中,它使用get处理程序定义代理在其上执行操作时的行为
195.seal 方法的目的是什么?
所述Object.seal()方法被用于密封一个对象,通过防止从被添加到它的新属性和标记所有现有的性质不可配置的。但是当前属性的值仍然可以更改,只要它们是可写的。让我们看下面的例子来了解更多关于 Seal() 方法的信息
const object = { property: 'Welcome JS world' }; Object.seal(object); object.property = 'Welcome to object world'; console.log(Object.isSealed(object)); // true delete object.property; // You cannot delete when sealed console.log(object.property); //Welcome to object world
196.seal 方法的应用有哪些?
下面是 Object.seal() 方法的主要应用,
它用于密封对象和数组。
它用于使对象不可变。
197.freeze 和 seal 方法有什么区别?
如果使用 Object.freeze() 方法冻结对象,则其属性将变为不可变且无法对其进行更改,而如果使用 Object.seal() 方法密封对象,则可以在现有属性中进行更改的对象。
198.如何判断物体是否 seal?
Object.isSealed() 方法用于确定对象是否已密封。如果以下所有条件都成立,则对象被密封
1.如果不能扩展。
2.如果它的所有属性都是不可配置的。
3.如果它不可移动(但不一定不可写)。让我们在行动中看到它
const object = { property: 'Hello, Good morning' }; Object.seal(object); // 使用 Seal() 方法密封对象 console.log(Object.isSealed(object)); // 检查对象是否密封
199.如何获得可枚举的键值对?
Object.entries() 方法用于返回给定对象自己的可枚举字符串键控属性 [key, value] 对的数组,其顺序与 for…in 循环提供的顺序相同。让我们在一个例子中看看 object.entries() 方法的功能,
const object = { a: 'Good morning', b: 100 }; for (let [key, value] of Object.entries(object)) { console.log(`${key}: ${value}`); // a: 'Good morning' // b: 100 }
注意:顺序不保证为对象定义。
200.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 }
201.如何获取任何对象的键列表?
您可以使用Object.keys()用于返回给定对象自己的属性名称的数组的方法,其顺序与我们使用普通循环获得的顺序相同。例如,您可以获取用户对象的键,
const user = {
name: 'Haiyong',
gender: 'male',
age: 40
};
console.log(Object.keys(user)); //['name', 'gender', 'age']
202.你如何用 prototype 创建一个对象?
Object.create() 方法用于创建具有指定原型对象和属性的新对象。即,它使用现有对象作为新创建对象的原型。它返回一个具有指定原型对象和属性的新对象。
const user = { name: 'Haiyong', printInfo: function () { console.log(`My name is ${this.name}.`); } }; const admin = Object.create(user); admin.name = "Nick"; //请记住,"name"是在"admin"而非"user"对象上设置的属性 admin.printInfo(); // My name is Nick
203.什么是WeakSet?
WeakSet 用于存储弱(弱引用)持有对象的集合。语法如下,
new WeakSet([iterable]);
1
让我们看下面的例子来解释它的行为,
var ws = new WeakSet(); var user = {}; ws.add(user); ws.has(user); // true ws.delete(user); // 从集合中删除user ws.has(user); // false, user 已被删除
204.WeakSet 和 Set 有什么区别?
主要区别在于 Set 中对象的引用是强引用,而 WeakSet 中对象的引用是弱引用。即,如果没有其他引用 WeakSet 中的对象可以被垃圾回收。
其他区别是,
1.Sets 可以存储任何值而 WeakSets 只能存储对象的集合
2.WeakSet 没有与 Set 不同的 size 属性
3.WeakSet 没有 clear、keys、values、entries、forEach 等方法。
4.WeakSet 不可迭代。
205.列出 WeakSet 上可用的方法集合?
下面是 WeakSet 上可用的方法列表,
1.add(value):将给定值附加到弱集的新对象
2.delete(value):从 WeakSet 集合中删除值。
3.has(value):如果 WeakSet 集合中存在该值,则返回 true,否则返回 false。
4.length():它返回weakSetObject的长度让我们在一个例子中看看上述所有方法的功能,
var weakSetObject = new WeakSet(); var firstObject = {}; var secondObject = {}; // add(value) weakSetObject.add(firstObject); weakSetObject.add(secondObject); console.log(weakSetObject.has(firstObject)); //true console.log(weakSetObject.length()); //2 weakSetObject.delete(secondObject);
206.什么是 WeakMap?
WeakMap 对象是键/值对的集合,其中的键被弱引用。在这种情况下,键必须是对象,值可以是任意值。语法如下所示,
new WeakMap([iterable])
让我们看下面的例子来解释它的行为,
var ws = new WeakMap(); var user = {}; ws.set(user); ws.has(user); // true ws.delete(user); // 从 map 中删除用户 ws.has(user); // false, user 已被删除
207.WeakMap 和 Map 有什么区别?
主要区别在于 Map 中关键对象的引用是强引用,而 WeakMap 中关键对象的引用是弱引用。即,如果没有其他引用 WeakMap 中的键对象可以被垃圾收集。
其他区别是,
1.Maps 可以存储任何类型的键,而 WeakMaps 只能存储键对象的集合
2.与 Map 不同,WeakMap 没有 size 属性
3.WeakMap 没有 clear、keys、values、entries、forEach 等方法。
4.WeakMap 不可迭代。
208.列出 WeakMap 上可用的方法集合?
下面是 WeakMap 上可用的方法列表,
1.set(key, value):设置 WeakMap 对象中键的值。返回 WeakMap 对象。
2.delete(key):删除与键关联的任何值。
3.has(key):返回一个布尔值,断言一个值是否与 WeakMap 对象中的键相关联。
4.get(key):返回与键关联的值,如果没有则返回 undefined。让我们在一个例子中看看上述所有方法的功能,
var weakMapObject = new WeakMap(); var firstObject = {}; var secondObject = {}; // set(key, value) weakMapObject.set(firstObject, 'Haiyong'); weakMapObject.set(secondObject, 100); console.log(weakMapObject.has(firstObject)); //true console.log(weakMapObject.get(firstObject)); // Haiyong weakMapObject.delete(secondObject);
209.uneval 的目的是什么?
uneval() 是一个内置函数,用于创建对象源代码的字符串表示。它是一个顶级函数,不与任何对象相关联。让我们看下面的例子来了解更多关于它的功能,
var a = 1;
uneval(a); // 返回一个包含 1 的字符串
uneval(function user() {}); // returns "(function user(){})"
210.你如何 encode (编码)一个 URL?
encodeURI() 函数用于对除 (, / ? : @ & = + $ #) 字符外具有特殊字符的完整 URI 进行编码。
var uri = 'https://mozilla.org/?x=шеллы';
var encoded = encodeURI(uri);
console.log(encoded); // https://mozilla.org/?x=%D1%88%D0%B5%D0%BB%D0%BB%D1%8B
211.你如何 decode (解码)一个 URL?
decodeURI() 函数用于解码之前由 encodeURI() 创建的统一资源标识符 (URI)。 var uri = 'https://mozilla.org/?x=шеллы'; var encoded = encodeURI(uri); console.log(encoded); // https://mozilla.org/?x=%D1%88%D0%B5%D0%BB%D0%BB%D1%8B try { console.log(decodeURI(encoded)); // "https://mozilla.org/?x=шеллы" } catch(e) { // 捕获格式错误的 URI console.error(e); }
212.你如何打印网页的内容?
window 对象提供了一个 print() 方法,用于打印当前窗口的内容。它会打开一个打印对话框,让您在各种打印选项之间进行选择。让我们在一个例子中看看print方法的用法,
<input type="button" value="Print" onclick="window.print()" />
注意:在大多数浏览器中,它会在打印对话框打开时被阻止。
213.uneval 和 eval 有什么区别?
该uneval函数返回给定对象的来源;而该eval函数则相反,通过评估不同内存区域中的源代码。让我们看一个例子来澄清差异,
var msg = uneval(function greeting() { return 'Hello, Good morning'; }); var greeting = eval(msg); greeting(); // returns "Hello, Good morning"
214.什么是 anonymous (匿名)函数?
匿名函数就是没有名字的函数!匿名函数通常分配给变量名称或用作回调函数。语法如下,
function (optionalParameters) { //do something } const myFunction = function(){ //分配给变量的匿名函数 //do something }; [1, 2, 3].map(function(element){ //匿名函数用作回调函数 //do something });
让我们在一个例子中看看上面的匿名函数,
var x = function (a, b) {return a * b}; var z = x(5, 10); console.log(z); // 50
215.局部变量和全局变量的优先顺序是什么?
局部变量优先于同名的全局变量。让我们在一个例子中看看这种行为。
var msg = "Good morning"; function greeting() { msg = "Good Evening"; console.log(msg); } greeting();
216.什么是 javascript 访问器?
ECMAScript 5 通过 getter 和 setter 引入了 javascript 对象访问器或计算属性。Getters 使用get关键字,而 Setters 使用set关键字。
var user = { firstName: "Hai", lastName : "Yong", language : "cn", get lang() { return this.language; } set lang(lang) { this.language = lang; } }; console.log(user.lang); // getter 访问 lang as cn user.lang = 'en'; console.log(user.lang); // setter 用于将 lang 设置为 en
217.你如何在对象构造函数上定义属性?
Object.defineProperty() 静态方法用于直接在对象上定义新属性,或修改对象上现有的属性,并返回该对象。让我们看一个例子来了解如何定义属性,
const newObject = {}; Object.defineProperty(newObject, 'newProperty', { value: 100, writable: false }); console.log(newObject.newProperty); // 100 newObject.newProperty = 200; // 由于可写设置,它在严格模式下抛出错误