一、JSs数据类型
JS有七种数据类型,分别是:String、Number、Boolean、Null、undefined、Object、Symbol(符号)。其中Object包含Array、Function。
1、Number
Number分为十六进制、十进制、八进制、二进制。
十进制:
1 | 1 //1 |
二进制
二进制以0b开头1
0b11 //转为十进制:3
八进制
以0开头的数字1
011 //转为十进制:9
十六进制
以0x开头1
0x11 //转为十进制:17
2、String
‘’ 和””空字符串长度为0,’ ‘字符串的长度为1,因为里面有一个空格。
重点介绍下转义字符串。
常见的转义符:1
2
3
4var a = '\''; //单引号
var n = '\n'; //换行
var t = '\t'; //制表符
var b = '\\'; //转义符
以上转义符长度为1。
多行字符串:1
2
3
4
5
6
7
8
9
10var a = '123 \
456'; //引入'\'来生成多行字符串
var b = '123
456'; //报错,不符合语法规则
var c = '123' +
'456' +
'789'; //为正常字符串
var d = `123
456
789`; //正确的,ES6新语法。字符串中的空格也会体现出来
以上两种正确的写字符串的方式推荐使用第三/四种,第一种虽然简便,但是如果’\’后面有空格,则会报错,并且空格不易发现。保险起见,建议使用第三/四种。
3、Boolean
布尔值只有两个;true/false
4、null
只有一个值null,
5、undefined
只有一个值undefined。
null和defined的区别:(重点)
- 变量没有被赋值,则会报错 undefined
- 有一个对象Object,现在还不想赋值,则可以令Object = null;有一个非对象比如num/string等等,现在不想给值,则可以先赋值为undefined。这是惯例。即null表示空对象,undefined表示空非对象。
6、Object
以上五种包括Symbol共六种为简单类型,也称基本类型。Object为复杂类型。复杂类型由简单类型组成。例如:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15var name = 'summer';
var age = 8;
var gender = 'male';
//以上都是一个人的属性,则可写成对象
var obj = {
'name' : 'summer',
'age' : 8,
'gender' : 'male',
'children':null, // 对象
'self' : obj, //obj.self指向自身。obj.self.self.self.name仍可以取到值。咱不介绍。涉及到内存问题。
'' : 'summer' , // 键名可以为空
9a : 123 // 此处会报错,如果键名没有加上双引号,那么键名的命名规则同标识符的命名规则,即开头不能出现数字
}
//如果需要使用其中的值时,可以使用一下两种方法
obj['name']或obj.name
1)读取对象中的值
当obj[‘name’]中name的命名符合标识符命名规则,则可以写为;obj.name;
2)删除一个key
delete obj[‘name’]
obj[‘name’] // 删除后此值为undefined,无value
‘name’ in obj // false,无key
obj[‘name’] = undefined // 此种方法删除的话只会删除掉vaule值,但是key还在
3)读取键名for..in
1 | for(var key in obj){ |
7、Symbol
二、其他
1)typeof
1 | typeof(string) //'string' |
三、类型转换
1、转字符串
1)toString()
2) String()
3) 加空字符串
对象 + 字符串会先调用对象的valueOf()方法再调用toString()方法转成字符串再与字符串进行拼接。但是new Date()例外,会直接调用toString()方法再拼接加号后字符串
2、转布尔值
1)Boolean()
2)!!
0、空字符串、null、undefined、NaN为false,1、非空字符串、Object为true
3、转数值
1)Number()
2)parseInt()/parseFloat()
此两种方法默认为按照十进制转换,第二个参数如果声明则按照对应进制进行转换。
3)快捷方法 x + 0 或者 + x ,其中x为任意数据类型
四、内存与垃圾回收
1、内存
举例来说,一般我们开机启动系统,操作系统会占用内存大概512M,Chrome打开占用1G内存,Chrome给每个网页分配一定数量的内存,这些内存要分给页面渲染、网络模块、浏览器外壳和JS引擎等等。JS引擎分为代码区和数据区。这里我们只研究数据区。数据区分为Stack(栈内存)和Heap(堆内存)。简单类型的数据直接存放在Stack栈中,复杂类型的数据是把Heap地址存在Stack中。
请看以下题目:
2、垃圾回收
垃圾回收的意思是如果一个对象没有被引用,它就是垃圾,将被回收。
讲一个示例:1
2
3var a = {'name':'a'};
var b = {'name': 'b'};
var a = b;
解决IE内存泄漏问题:1
2
3window.onunload = function(){
document.body.onclick = null;
}
五、深拷贝 & 浅拷贝
1、深拷贝
1 | var a = 1; |
b的值改变不影响a,则为深拷贝。对于基本类型,赋值就是深拷贝。
2、浅拷贝
再看以下例子:1
2
3var a = {'name':'a'};
var b = a;
b.name = 'b'; // 此时a.name == 'b'为true
此种情况下b变导致a变,则为浅拷贝。
这个暂时不进行过多介绍。以后再说吧。
这个部分内容有点多并且杂乱,有时间还需要再看看。
强势安利一波阮一峰的Javascript标准参考教程,讲真,写的实在是好。