1. 我对闭包的理解:

函数嵌套函数,里面的函数词法作用域能访问外部函数的内部作用域,然后把里面的函数本身当作一个值类型进行传递,(在上图中,我们就是将bar所引用的函数对象本身当作返回值)。并且我们通常会期待外部函数的整个内部作用域都被销毁,因为我们知道引擎有垃圾回收器来释放不再使用的内存空间。但是闭包的神奇之处正是可以阻止这件事情的发生,事实上内部作用域依然存在,因此没有被回收,里面的函数在使用这个内部作用域,然而里面函数对该作用域的引用就叫作闭包。
其实身边有很多,比如定时器、事件监听器、Ajax请求或者是其他的任务中,只要使用了回调函数,实际上就是在使用闭包
2. 关于typeof
- 判断值是否是null
var a = null
(!a && typeof a === 'object') // true
- 已在作用域中声明但还没有赋值的变量为undefined,相反,还没有在作用域中声明过的变量为undeclared(未声明的)
例如:
var a
a // undefined
b // ReferenceError: b is not defined

但typeof处理未声明的变量时
var a
typeof a // 'undefined'
typeof b // 'undefined'
3. toFixed
// 无效语法:
42.toFixed( 3 ); // SyntaxError
// 下面的语法都有效:
(42).toFixed( 3 ); // "42.000"
0.42.toFixed( 3 ); // "0.420"
42..toFixed( 3 ); // "42.000"
42 .toFixed(3); // "42.000"
42.tofixed(3) 是无效语法,因为 . 被视为常量 42. 的一部分(如前所述),所以没有 . 属
性访问运算符来调用 tofixed 方法。
42..tofixed(3)则没有问题,因为第一个 . 被视为 number 的一部分,第二个 . 是属性访问
运算符。只是这样看着奇怪,实际情况中也很少见。在基本类型值上直接调用的方法并不
多见,不过这并不代表不好或不对。
4. 关于 -0
- JSON.stringfiy与JSON.parse
JSON.stringfiy(-0) // "0"
JSON.parse("-0") // -0
- 比较操作
0 == -0 // true
0 === -0 // true
0 > -0 // false
- 判断是否是 -0 (区别-0与0)
function isZegZero(n) {
n = Number(n)
return (n === 0) && (1/n === -Infinity)
}
isZegZero(-0) // true
isZegZero(0/-3) // true
isZegZero(0) // false
其中补充一个
Infinity/Infinity结果为NaN
5. Object.is(…)
Object.is(…)可以用来比较一些特殊等式,例如 NaN与NaN,-0与0,这是es6新加入的一个工具方法,可以来判断两个值是否绝对相等
Object.is(2/'foo', NaN) // true
Object.is(-3*0, -0) // true
Object.is(-3*0, 0) // false
Object.is({}, {})
// false
6. 深拷贝与浅拷贝得区别
浅拷贝:浅拷贝是创建一份新的数据,这个数据有着原始数据属性值的一份精确拷贝,如果对象为基本类型,则拷贝的值是基本类型的值,如果拷贝对象是引用类型,则拷贝的是地址
深拷贝:开辟了一个新的地址空间,两个对象的值想同,但地址不同,修改一个对象的属性,不会改变另一个对象的属性
7. 关于继承
继承的优点:继承可以使得子类具有父类的各种属性和方法,不需要再次编写想同的代码,在子类继承父类的同时,可以重新定义某些属性或者重写某些方法,即覆盖父类原先的属性和方法
实现方法:
- 原型链继承:通过使用prototype实现继承,通过父类的实例挂载到子类的prototype中。但其实会存在潜在问题,如果一个实例改变了原先属性,那另外一些实例中的该属性也会跟着变化,因为两个实例使用的死同一个原型对象,内存空间是共享的
- 构造函数继承:在子类中借助call调用父类函数,Parent.call(this)。但是只能继承父类的实例属性和方法,不能继承原型属性或者方法
- 组合继承:结合上面两种继承,然后一定要记得手动挂上构造器,指向自己(子类)的构造函数,不然子类的__proto__的__proto__的constructor就是父类了。但是 组合继承父类执行了两次,造成了多次构造一次的性能开销
- Object.create方法实现普通对象的继承: 但这个是浅拷贝
- 寄生式继承:
- 寄生组合式继承:借助解决普通对象的继承问题的 Object.create 方法,是这所有继承方式里相对最优的一个
function clone (parent, child) {
// 这里改用 Object.create 就可以减少组合继承中多进行一次构造的过程
child.prototype = Object.create(parent.prototype);
child.prototype.constructor = child;
}
- extends继承:使用ES6 中的extends 关键字直接实现 JavaScript 的继承。然后利用babel工具进行转换会发现这个也是用的寄生组合继承方式
8. vue和react的对比
相同点: 都有组件化思想、都支持服务器渲染、都有虚拟dom、数据驱动视图、都有支持native方案(vue的weex、react的react native)、都有自己的构建工具(vue的vue-cli、react的create react app)
不同点:
- 数据变化的实现原理不同:react使用的是不可变数据、vue使用的是可变的数据
- 组件化通信不同,react中是通过使用回调函数来进行通信的,而vue中子组件向父组件传递消息的方式有两种方式:事件和回调的函数
- diff算法不同,react主要使用diff队列保存需要更新的哪些DOM,得到补丁树,再同意操作批量更新DOM。vue使用双向指针,边对比边更新DOM
本文深入探讨JavaScript中的闭包、typeof、toFixed等高级特性,并对比Vue与React的不同之处,还介绍了几种常见的JavaScript继承方式。
991

被折叠的 条评论
为什么被折叠?



