JS 里的数据类型
number, string, bool
number
在javascript中,所有number都以64位(8字节)浮点数的形式存储; js默认使用Unicode编码,string一个字符16位(2字节).
js底层没有整数,全部都是浮点数,浮点数不是精确的值,eg: 0.1 + 0.2 === 0.30000000000000004
js精度(第13-64位,共52位来表示小数部分):最多只能到53个二进制位,故绝对值小于2^53 以内的数可以精确表示。
js数值范围(第2-12位,共11位来表示小数部分):2^-1023 到 2^1024是js能表示的树枝范围;eg:Math.pow(2, 1024) // Infinity
数值的表示,如图:
string
字符串就是零个或多个排在一起的字符,放在单引号或双引号之中,如图:
boolean
只有两个值true和false,以下运算符会返回布尔值:
- 前置逻辑运算符: ! (Not)
- 相等运算符:===,!==,==,!=
- 比较运算符:>,>=,<,<=
undefined, null, object
undefined:
表示未定义,Number(undefined) === NaN
null:
表示空值,当调用函数时,某个参数没有设置任何值,可以传入null,Number(null) === 0
Object:
是js里的核心概念,数组Array和函数Function都是对象。
那么什么是对象呢?对象就是一组“键值对”(key-value)的集合,是一种无序的复合数据集合。对象都是哈希。
key:只能是字符串,如果写的是数字,则会被自动转换成字符。
key又称为property,当一个属性的值是函数时,我们把这个属性称为“方法”。
属性的读取,查看;delete命令,in运算符,和属性的遍历:for…in循环
普通类型 VS 对象
js中有7种数据类型,其中:number, string, boolean, null, undefined, symbol是普通类型,存储在Stack栈内存中;对象作为复杂类型,存地址存储在heap堆内存中。
类型转换
转成字符串
转成数值
转成boolean
Boolean()
简单类型 vs 对象
var n = new Number(1)
Number()构造了一个新对象,其primitiveValue对应1;
var n =1
n.xxx =2
n.xxx //undefined
这里发生了临时的类型转换,1被包装成临时对象;
这就是基本类型可以“点什么什么”的原因;
five falsy值
null, undefined, NaN, ‘’, 0
引用
引用:js中所有变量和对象的关系,都是引用。没有指针这个说法这是c里的。
垃圾回收
如果一个对象没有被引用,它就会被当做垃圾,被浏览器回收。
深copy vs 浅copy
深拷贝:所有的基本类型的赋值,都是深拷贝;
浅拷贝:复杂类型的引用和赋值。
原型链
js中的普通对象:哈希;
js中的对象:树。
ECMAScript描述了原型链的机制: 实现继承的主要方式。它的基本思想是利用原型让一个引用类型继承另一个引用类型的属性和方法。
js中,每个对象都有一个指向它的原型对象的内部链接,这个原型对象又有自己的原型,直到某个对象的原型为null为止(也就是不再有原型指向)形成了tree数据结构,这种链接结构就称为原型链。
公用属性(原型)
为何没有被垃圾回收?
因为被Object.prototype引用
proto & prototype
对象.proto === 函数.prototype
引用的是同一个对象
比如说:
var n1 = new Number(1)
n1.proto === Number.prototype //true
n1.proto.proto === Object.prototype //true
‘1’.proto === String.prototype //true
Object.proto === Function.prototype //true
Function比较特殊:
Function.proto === Function.prototype //true