1.输出结果
var a = {n: 1};
var b = a;
a.x = a = {n: 2};
console.log(a.n,b.n)
consolg.log(a.x,b.x)
或
var a = {n: 1};
var b = JSON.stringify(a);
a.x = a = {n: 2};
console.log(a.n,b.n)
console.log(a.x,b.x)
第一种结果:
2,undefined
undefined,{n:2}
第一种结果:
2,1
undefinex,undefined
解释:
var b = a; 对象存贮在堆内存,a和b同时引用 {n:2}
赋值操作为从左到右操作,但是 . 的优先级要高于 =
所以先执行a.x时,此时a和b的共同索引为{n:2;x:undefined},
然后执行a = {n:2},
a的引用改变,指向了新对象{n:2},而b依然指向的是旧对象。之后执行a.x = {n:2}的时候,并不会重新解析一遍a,而是沿用最初解析a.x时候的a,也即旧对象,故此时旧对象的x的值为{n:2},旧对象为 {n:1;x:{n:2}},它被b引用着。
后面输出a.x的时候,又要解析a了,此时的a是指向新对象的{n:2},而这个新对象是没有x属性的,故访问时输出undefined;而访问b.x的时候,将输出旧对象的x的值,即{n:2}
2.阻止程序执行
fn()
function fn() {
console.log(1)
arrest()
console.log(2)
}
function arrest() {
console.log('阻止执行这里')
}
/*
在function 内 通过 return false 或者 throw抛出错误 可以直接阻止
try{}catch{}结合 throw '错啦' 抛出错误来阻止
*/
try {
fn()
throw '错啦'
} catch(e) {
console.log('终止')
}
3.数组转换
var obj = [
{ level:3, name: ‘朝阳’ },
{ level:1, name: ‘中国’ },
{ level:2, name: ‘北京’ },
]
转换为:
var obj = {
level: 1,
name: ‘中国’,
child: {
level: 2,
name: ‘北京’,
child: {
level: 3,
name: ‘朝阳’
}
}
}
vue 封装组件,写一个自己封装过的组件,可简化,表明思路即可
- 下面方法执行结果是?
function fn() {
setTimeout(() => {
console.log(1)
}, 1000)
new Promise(function(resolve) {
console.log(2);
resolve();
}).then(function() {
console.log(3)
})
}
什么是Virtual DOM 和 Snabbdom?
https://www.jianshu.com/p/1f1ef915e83e
如何深度掌握 Virtual DOM 源码结构以及核心函数实现?
patch 函数以及 Diff 算法的整个实现过程是怎样的?
彻底搞定 Virtual DOM 中的模块机制。
响应式数据的优势是什么?是如何实现的?
如何使用 Observer 将数据转换成响应式数据?
如何使用 Dep 收集依赖、发送通知?
如何掌握用 Watcher 监听数据,自动更新视图?
掌握服务端渲染(SSR)核心解决的问题
掌握使用 Nuxt.js 框架开发的最佳实践
掌握 Nuxt.js 框架使用中的 SEO 优化处理
掌握同构开发模式以及同构应用中的状态激活
了解同构类型应用的发布与自动化部署
网友评论