winter老师的《重新前端》学习笔记
类型
js的语言类型:undefined、null、string、number、boolean、object、symbol
Undefined与Null
Undefined类型表示未定义,它的类型值有一个值,就是undefined。任何变量在赋值前是Undefined类型,值为undefined。
1、为什么有的编程规范要求使用void 0 代替undefined?
因为 JavaScript 的代码 undefined 是一个变量,而并非是一个关键字,这是 JavaScript 语言公认的设计失误之一,所以,我们为了避免无意中被篡改,我建议使用 void 0 来获取 undefined 值。
Null类型也只有一个值,就是null,它表示定义了但是为空值,与undefined不同,null是js的关键字,可以使用null关键字来获取null值
一般不会把变量赋值为 undefined,这样可以保证所有值为 undefined 的变量,都是从未赋值的自然状态
Boolean
Boolean类型有两个值,有关键字true和false表示。
String
字符串是否有最大长度?
String表示文本数据,最大长度为2^53-1。最大长度实际上受字符串的UTF16编码影响的。
字符是以 Unicode 的方式表示的,每一个 Unicode 的码点表示一个字符。UTF 是 Unicode 的编码方式。0-65536(U+0000 - U+FFFF)的码点被称为基本字符区域(BMP)
Number
JavaScript 中的 Number 类型有 (2^64-2^53+3)个值。 _ NaN,占用了一个数字
- Infinity,无穷大
- -Infinity,负无穷大
除法场合特别注意,+0和-0
同样根据浮点数的定义,非整数的Number类型无法用==来比较
为什么js中,0.1+0.2不等于0.3
Math.abs(0.1+0.2-0.3) <= Number.EPSILON
浮点数运算的精度问题导致等式左右的结果并不是严格相等,而是相差了个微小的值。
检查等式左右两边差的绝对值是否小于最小精度,才是正确的比较浮点数的方法。这段代码结果就是 true 了。
Symbol
[Symbol.iterator] = function(){
var v = 0;
return {
next: function(){
return {value: v++, done: v > 10};
}
}
}
Object
对象类型Number、String、Boolean、Symbol。3和new Number(3)是完全不同的值,一个是Number类型,一个是对象类型
Number、String 和 Boolean,三个构造器是两用的,当跟 new 搭配时,它们产生对象,当直接调用时,它们表示强制类型转换。Symbol 函数比较特殊,直接用 new 调用它会抛出错误,但它仍然是 Symbol 对象的构造器。
为什么给对象添加的方法能用在基本类型上?
点(.)运算符提供了装箱操作,它会根据基础类型构造一个临时对象,使得我们能在基础类型上调用对应对象的方法。
类型转换
判断对象类型使用call,判断基本类型使用typeof
Object.prototype.toString.call(obj)
拆箱转换
如果我们不用原生的 Number 和 parseInt,用 JavaScript 代码实现 String 到 Number 的转换,该怎么做呢?
+ '1000'
~~ '1000'
'1000' >>> 0
'1000' * 1
Math.floor("1000")
Math.round("1000")
Math.ceil("1000")
toPrimitive Symbol ? 拆箱?装箱?