Open MJingv opened 5 years ago
定义:浅克隆之所以被称为浅克隆,是因为对象只会被克隆最外部的一层,至于更深层的对象,则依然是通过引用指向同一块堆内存.
对象
- 遍历赋值
- object.assign(目标,源对象)
- ...res
数组
slice() concat()
对象&&数组深拷贝
- JSON.parse(JSON.stringify(oldObj))【环、constrctor全部指向object、function、date不可以】
- 递归
function clone(obj) { if (!obj && typeof obj !== 'object') { return; } var newObj = obj.constructor === Object ? {} : []; for (var key in obj) { newObj[key] = (obj[key] && typeof obj[key] === 'object') ? clone(obj[key]) : obj[key]; } return newObj; };
- lodash
- MessageChannel【函数不可用】
好处
方法
立即执行函数
避免污染全局作用域
AMD 和 CMD
不用了
// AMD define(['./a', './b'], function(a, b) { // 加载模块完毕可以使用 a.do() b.do() }) // CMD define(function(require, exports, module) { // 加载模块 // 可以把 require 写在函数体的任意地方实现延迟加载 var a = require('./a') a.doSomething() })
3. CommonJS
> node.js / webpack
4. ES Module
> 原生模块化实现方案
> ES Module 会编译成 require/exports 来执行的
```js
// 引入模块 API
import XXX from './a.js'
import { XXX } from './a.js'
// 导出模块 API
export function a() {}
export default function() {}
对比
ES module | CommonJS |
---|---|
不支持动态导入 | 支持动态导入 |
异步导入(用于浏览器) | 同步导入(用于服务端) |
实时绑定(导入值随导出值变化) | 非实时绑定(导出为值拷贝) |
===
https://segmentfault.com/a/1190000014318751
易错点
tasks 在浏览器环境中
提升
变量提升
函数提升
console.log(a) // ƒ a() {} function a() {} var a = 1