1. 字符串最大长度: 2的53次方-1。但这指的并不是字符串长度,而是字符串的UTF16编码的长度。(U+0000 - U+FFFF范围)
2. Number的双精度浮点数规则:有效整数范围是-0x1fffffffffffffff 至 0x1fffffffffffffff
单精度浮点数(float)与双精度浮点数(double)的区别如下:
(1)在内存中占有的字节数不同
单精度浮点数在机内占4个字节
双精度浮点数在机内占8个字节
(2)有效数字位数不同
单精度浮点数有效数字7位
双精度浮点数有效数字16位
(3)所能表示数的范围不同
单精度浮点的表示范围:-3.40E+38 ~ +3.40E+38
双精度浮点的表示范围:-1.79E+308 ~ +1.79E+308
(4)在程序中处理速度不同
一般来说,CPU处理单精度浮点数的速度比处理双精度浮点数快。
根据浮点数定义,非整数的Number无法用==或者===来比较,比如 :
0.1 + 0.2 === 0.3 // false
正确的比较方法应该是这样:
Math.abs( 0.1 + 0.2 - 0.3 <= Number.EPSILON ) //Number.EPSILON:最小精度值
NaN:NaN 属性是代表非数字值的特殊值。该属性用于指示某个值不是数字。可以把 Number 对象设置为该值,来指示其不是数字值。
3. Symbol: 一切非字符串的对象key的集合,整个对象系统被用Symbol重塑。详细见symbol的文章。
4. JS中对对象的定义是“属性的集合”。属性包括数据属性和访问器属性。均为KEY-VALUE结构,key可以是字符串或者symbol类型。
Number、String和Boolean三个构造器是两用的,和new搭配产生对象,直接调用时为强制类型转换。
Symbol函数比较特殊,直接调用会报错,但仍然是Symbol对象的构造器。
装箱操作:每一种基本类型都有对应的类,所谓装箱转换就是把基本类型转换为对应的临时对象。装箱机制会频繁产生临时对象,再一些对性能要求较高的场景下,因尽量避免基本类型做装箱转换。
var sbObj = Object(Symbol('a'));
console.log(typeof sbObj); // object
console.log(sbObj instanceof Symbol); // true
console.log(sbObj.constructor === Symbol); // true
拆箱转换:ToPrimitive函数,对象类型到基本类型的转换。
JS中对象的独有特色: 高度动态性,运行时可以为对象添加状态和行为的能力。
通常程序语言中的对象有下列几个特性:
对象具有唯一标识性,看起来完全相同的对象,其实不相等。({a:1} !== {a:1})
对象是有状态的,同一对象可能处于不同状态下。
对象有行为,对象的状态可能因为行为而变化。
在js中,对象的状态和行为都被抽象为属性了。
var o = {
d: 1, // 状态
f() { console.log(this.d) } // 行为
}
为了提高抽象能力,JS的属性被设计成了数据属性和访问器属性(getter/setter)。
Object.defineProperty定义属性,getOwnPropertyDescriptor来查看属性。
5. JS中的class:
class Rectangle {
constructor(h, w) {
this.h = h;
this.w = w;
}
get area() { //Getter
return this.calcArea();
}
calcArea() { //Method
return this.h * this.w;
}
}
js中的class用extend来实现继承;不自动调用父类构造函数,不自动设置constructor。更少坑的设计。
6.构造器
function f() {
return 1;
}
var v = f(); // 把f作为函数调用
var o = new f(); //把f作为构造器调用
网友评论