时长:22min 方式:腾讯会议
在JavaScript中,for...of实际上是遍历集合的值,它需要被遍历的对象具有迭代器 (Iterator) 接口。在JavaScript中,内置的可迭代对象包括String,Array,TypedArray,Map 和 Set,所以它们都可以通过 for...of进行遍历。然而,普通的对象 (Object) 并没有默认的迭代器接口。所以,如果你直接使用 for...of 来遍历一个对象,将会抛出错误:“TypeError: XXXX is not iterable”。
不能!for...in 是用来遍历一个对象的可枚举属性的,但是 Map 对象的元素并不是以可枚举属性的形式存储。实际上,对于Map对象,for...in循环将不会产生任何输出。
这与对象的内部差异有关。 Map 对象内部持有一个迭代器,该迭代器知道如何访问对象的每一个元素。另一方面,普通对象没有这样的内置迭代器,取而代之的是存储其属性的内部表格,这就是 for...in 循环能遍历普通对象的原因。
会。在原型对象(父对象)上定义的属性是引用类型(如数组、对象等),那么所有通过原型链继承这个属性的实例(子对象)都会共享这个属性。因此,如果有一个实例修改了这个属性,那么所有其他实例看到的也会是修改后的属性。
function Parent() {
this.colors = ['red', 'blue', 'green'];
}
function Child() {
Parent.call(this);
}
var child1 = new Child();
var child2 = new Child();
child1.colors.push('black');
console.log(child1.colors); // Output: ['red', 'blue', 'green', 'black']
console.log(child2.colors); // Output: ['red', 'blue', 'green']
function Parent() {
this.colors = ['red', 'blue', 'green'];
}
Parent.prototype.getName = function() {
return this.name;
}
function Child() {
Parent.call(this);
}
Child.prototype = Object.create(Parent.prototype);
Child.prototype.constructor = Child;
var child1 = new Child();
var child2 = new Child();
child1.colors.push('black');
console.log(child1.colors); // Output: ['red', 'blue', 'green', 'black']
console.log(child2.colors); // Output: ['red', 'blue', 'green']
当使用 ES6 模块(ESModule)的 import 语法导入一个模块时,所获取的是该模块 export 出的接口的引用。在原始模块的值改变时,这个改变也会反映在导入的那个模块接口中,这就是所谓的“实时绑定”或者叫做“动态引用”。
使用 require 来加载另一个模块时,实际上是运行了那个模块,并把模块的 exports 或 module.exports 属性导出。这个过程中进行了一次浅拷贝,返回的是一个对象的复制值,而非引用值。
在传统的浏览器环境中,是不能直接使用 require 的。如果想在浏览器环境下使用(require()),你需要使用像 Browserify 或者 webpack 这样的工具,将你的代码打包成适用于浏览器环境的文件。
import 是 ES6 的模块引入语法,现代的浏览器 Chrome,Firefox 等都开始支持 ES6 的模块引入语法。但是,对于一些老版本的浏览器或者一些不支持 ES6 的浏览器,仍然没法直接使用 import,仍然需要使用 Babel,webpack 等工具,将 import 编译成浏览器可以识别的 require 或者其他等效代码。
HTTP/1.0、HTTP/1.1 中都是一张张加载图片的,而 HTTP/2.0 能够实现多张图片一次性并行加载。
LocalStorage 和 SessionStorage、Cookies、BroadcastChannel API、SharedWorker、window.postMessage
SharedWorker 是 HTML5 提供的一种 Web Worker。它被设计为在多个执行环境间共享,可以在多个浏览器的 tab 或 window 页面之间共享和交换数据,这在普通的 web worker 中是无法实现的。这就解决了多个页面之间数据共享、同步等问题,也极大地降低了系统的复杂度。我们能够借助 SharedWorker 将一些计算密集型或需要保证数据一致性的操作放在独立的全局脚本中进行,从而不会阻塞用户的界面操作,提高了页面的响应速度和资源的利用效率。
会。使用 reactive 函数创建的响应式对象是对原始对象的深层拷贝,并建立类似代理的机制能够在操作 reactive 对象时同步到原始对象上,所以对 reactive(A) 返回的对象 B 的任何修改,都会影响到原始对象 A。这是因为 reactive 函数的设计目标就是要创建一个响应式的版本,这个版本和原始对象是联动的。
直接修改原始对象 A,它自身并不是响应式的,所以不会触发 Vue 的视图更新。reactive 给我们返回的新对象 B 才具有响应性,所以总是通过这个响应式对象 B 去操作数据,使得视图能够响应数据的变化更新。
感受:追问扣的好细,顶不住>︿<