JavaScript类型:关于类型,有哪些你不知道的细节?
1、为什么有的编程规范要求用 void 0 代替 undefined?
A:undefined是变量,不是关键字,这是JavaScript设计的一个失误,void运算把任何表达式变成undefined值,为了防止被篡改,建议用void 0代替undefined
null是关键字可以放心使用。
null和undefined的区别?——undefined表示未定义,null表示定义了但是值为空,一般不建议直接赋值undefined,但是可以将对象初始化为null 。
2、字符串有最大长度吗?
A:JavaScript的字符串有最大长度,为2^53 - 1,但这个最大长度不是你所理解的“字符数”,因为 String 的意义并非“字符串”,而是字符串的 UTF16 编码,即字符串有最大长度与编码方式有关。
3、0.1 + 0.2 不是等于 0.3 么?为什么 JavaScript 里不是这样的?
A:浮点数是有精度的,0.1 + 0.2 无限趋近与0.3,但是不等于0.3,表达式可以写为Math.abs(0.1 + 0.2) < Math.EPSILON
4、ES6 新加入的 Symbol 是个什么东西?
ES6新加入Symbol类型,表示一切非字符串的对象key的集合,在 ES6 规范中,整个对象系统被用 Symbol 重塑。由于Symbol的唯一标识性,常用来定义属性。ES6使用Symbol暴露常用的属性
Symbol不能被new的方式创建。
5、为什么给对象添加的方法能用在基本类型上?
.运算符实现封箱操作,根据基本类型创建出一个临时对象,基于类型使用该对象的方法。
JavaScript对象:我们真的需要模拟类吗?
描述对象的方法有两种:1)基于类,如Java、C++ 2)基于原型,如JavaScript
JavaScript的早期设计是基于原型的,而不是基于类的。
基于原型设计的最显著特点是可以动态的修改对象属性,这与运行时是一致的
对象复制:1)使的新对象持有一个原型的引用,即浅拷贝 2)复制整个对象,复制对象与元对象解耦,即深拷贝
JavaScript的对象复制是浅拷贝,只复制对象的引用。
在ES6之前,使用new和function结合的方式创建对象。
ES6增加了Class的概念,与Java类似
class A {
constructor(params) {
// this指针给属性赋值 属性放在构造函数
}
// getter/setter
// method
}
ES6也提供了原型创建对象的三个方法:
Object.create
Object.getPrototypeOf
Object.setPrototypeOf
建议采用Class的方式创建对象。
异步任务
宏观任务:由宿主发起
微观任务:javascript引擎发起
宏观任务包含多个微观任务组成的队列
Promise(微观任务)
setTimeout(宏观任务, API都是宏观任务)
掌握promise用法
Promise和setTimeout调用顺序——微观任务在宏观任务之前调用
async/await:
async 函数必定返回 Promise,我们把所有返回 Promise 的函数都可以认为是异步函数。
generator/iterator 来模拟异步的方法应该被废弃