类型
基本类型
- 数值number
- 字符串string
- 布尔boolean
- 符号symbol
- 空值null
- 未定义undefined
数值
所有数值都以64位浮点数存储,默认十进制,其中:
- 二进制:0b11(3)
- 八进制:011(9)
- 十六进制:0x11(11)
p.s. NaN
也是数值,且是唯一一个不等于自身的值,判断NaN
function myIsNaN(value) {
return value !== value;
}
字符串
- 使用单引号、双引号都可以;
- 使用“\”转义可以在引号中表示同种引号,也可以表示其他特殊符号:
- 换行:使用“\”或“+”(更推荐后者,前者不便调试),其中ES6也支持使用“`”做多行字符串,但会把缩进也算在内。
- 不支持大于0xFFFF的Unicode字符,否则一个字符会被识别为两个(s.length == 2)
转义符 | 符号 |
---|---|
'\t' | 制表符 |
'\n' | 回车符 |
'\' | \ |
... | ... |
布尔
- true/false二值表示;
- 使用真值表可表示逻辑运算结果:a && b,a || b等。
undefined与null
都表示没有值,通常未赋值的对象设为null,非对象设为undefined(推荐做法)。
var obj = null // 空对象
var n // 空非对象
区别:
Number(undefined) // NaN
Number(null) // 0
复杂类型:对象
由基本类型组成,表现为哈希(无序,唯一),基本操作:
var person = { // ES3最后一个value后不能加“,”
'name': 'ywh', // 定义时key的''可以省略,但不加引号时要按标识符原则(比如数字不能开头、中间不能加空格)
'age': 16,
'gender': 'male',
'avalible': true,
1: 1, // 虽然定义时指定key为1,但实际上是'1'
self: person
}
var name = 'age'
person['name'] // 'ywh',以string为key取值
person[name] // 16,以变量的为key取值
person.name // 'ywh'
delete person['name'] // 删除person以“name”为key的键值对
person['name'] = undefined // 删除person中key为“name”的值
for (var key in person) { // 遍历对象
console.log(key, person[key])
}
typeof person // object
简单类型与对象的区别
Number
var n1 = 1 // 数值
n1.toString() // 具备执行复杂类型属性的能力(通过临时转换为复杂类型,执行完成后恢复)
n1.x = 2 // 只是临时转换成对象,赋值成功后还是基本类型,不可再次访问
var n2 = new Number(1) // 包装了1的对象
n2.toString()
String
var s1 = 'abcdef' // 字符串
var s2 = new String(s1) // 字符数组
s2.charAt(1) == s2[1] // 根据索引获取字符
s2.charCodeAt(0) // 获取ASCII码
s2.trim() // 去除左右空格
s1.concat(s2) // 拼接字符串
s1.slice(0, 2) // 从索引0开始,取s1的2个字符的字串
Boolean
var b1 = false
var b2 = new Boolean(false)
if (b1) console.log(b1)
if (b2) console.log(b2) // b2是对象,会被判断为true,所以会输出
Object
var o1 = {} // 都是空对象,但指向不同的内存
var o2 = new Object()
类型转换
nubmer | string | boolean | symbol | null | undefined | object | |
---|---|---|---|---|---|---|---|
number | + '' | Boolean() | |||||
string | - | ||||||
boolean | toString | - | |||||
symbol | x | !! | - | ||||
null | 报错 | !! | - | ||||
undefined | 报错 | !! | - | ||||
object | String | !! | - |
- falsy值:0、Nan、''、null、undefined转换为布尔时结果为false;
- 除falsy值外,其余转布尔结果都为true;
- 其他类型转数值:
- Number('1')
- parseInt('1', 10)(parseInt会从左到右尽可能解析,没有的话结果为NaN)
- parseFloat('1.23')
- - 0(减去0)
- + '1'(取正号)
对象
new 关键字
- 对于基本数据类型的构造函数(Number,String,Boolean)返回的是基本类型:
Number(1) === 1
- 对于基本数据类型,使用new返回的是对象:
new Number(1)
- 对于复杂数据类型,返回的都是对象:
Object(1)
,new Object(1)
内存分配
- 对于简单类型(七种),直接存放在stack中;对于复杂类型(object),将其heap地址存放在stack中;
- 数值:64位浮点型;字符串:16位;
- 传值与传引用:
var a = 1
b = a
b = 2
a == 1 // 深拷贝,把a的值复制给b,即a、b各自存了一份,true
var a = {'name': 'a'}
b = a
b.name = 'b'
a == {name: "b"} // 浅拷贝,b与a都指向同一块内存空间,通过b修改了这块内存空间的值,false
b = null
a == {name: "b"} // 只是修改了b的指向,对a无影响
垃圾回收
- 一个对象没有被引用,即会被回收;
- 页面被关闭时,页面上所有对象都会被回收(IE存在bug,直到把整个浏览器关闭执行垃圾回收);
- 内存泄漏:没有被引用的对象不能被回收,此时需要手动清理(置为null)。
var a = {name: 'a'}
var b = {name: 'b'}
a = b // 把a指向b所指的内存块,则a原来所指的内存块将被回收
全局对象
- 对于浏览器,window是全局对象(global),浏览器开启的时候自动生成;
- window属性:
- ECMA Script标准:parseInt,parseFloat,Number等;
- 私有(chrome、Firefox):alert,prompt,document(DOM为W3C规定)等;
- 执行window属性时window可以省略。