JS里的数据

介绍一些JS的数据类型及其常用方法。

一、JSs数据类型

JS有七种数据类型,分别是:String、Number、Boolean、Null、undefined、Object、Symbol(符号)。其中Object包含Array、Function。

1、Number

Number分为十六进制、十进制、八进制、二进制。

十进制:
1
2
3
4
1           //1
1 + .1 //1.1
1.23e2 //123
1.23E2 //123 科学计数法
二进制

二进制以0b开头

1
0b11      //转为十进制:3

八进制

以0开头的数字

1
011     //转为十进制:9

十六进制

以0x开头

1
0x11    //转为十进制:17

2、String

‘’ 和””空字符串长度为0,’ ‘字符串的长度为1,因为里面有一个空格。
重点介绍下转义字符串。
常见的转义符:

1
2
3
4
var a = '\'';     //单引号
var n = '\n'; //换行
var t = '\t'; //制表符
var b = '\\'; //转义符

以上转义符长度为1。
多行字符串:

1
2
3
4
5
6
7
8
9
10
var 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
    15
    var 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
2
3
for(var key in obj){
console.log(key); //name age gender children self....
}

7、Symbol

二、其他

1)typeof

1
2
3
4
5
6
7
8
9
typeof(string)      //'string'
typeof(number) //'number'
typeof(boolean) //'boolean'
typeof(undefined) //'undefined'
typeof(null) //'object',这个比较特殊
typeof(obj) //'object'
typeof(symbol) //'symbol'
//以上是js的类型
typeof(fun) // function fun(){},输出'function',但是function并不是一个类型

三、类型转换

1、转字符串

1)toString()

toString()方法


2) String()

String()方法


3) 加空字符串

加空字符串


对象 + 字符串会先调用对象的valueOf()方法再调用toString()方法转成字符串再与字符串进行拼接。但是new Date()例外,会直接调用toString()方法再拼接加号后字符串

2、转布尔值

1)Boolean()

Boolean转换


2)!!

双叹号转换


0、空字符串、null、undefined、NaN为false,1、非空字符串、Object为true

3、转数值

1)Number()

Number()


2)parseInt()/parseFloat()

parseInt


此两种方法默认为按照十进制转换,第二个参数如果声明则按照对应进制进行转换。

3)快捷方法 x + 0 或者 + x ,其中x为任意数据类型

快捷转换


四、内存与垃圾回收

1、内存

举例来说,一般我们开机启动系统,操作系统会占用内存大概512M,Chrome打开占用1G内存,Chrome给每个网页分配一定数量的内存,这些内存要分给页面渲染、网络模块、浏览器外壳和JS引擎等等。JS引擎分为代码区和数据区。这里我们只研究数据区。数据区分为Stack(栈内存)Heap(堆内存)。简单类型的数据直接存放在Stack栈中,复杂类型的数据是把Heap地址存在Stack中。
请看以下题目:
内存问题


内存问题


内存问题


2、垃圾回收

垃圾回收的意思是如果一个对象没有被引用,它就是垃圾,将被回收。
讲一个示例:

1
2
3
var a = {'name':'a'};
var b = {'name': 'b'};
var a = b;

解决IE内存泄漏问题:

1
2
3
window.onunload = function(){
document.body.onclick = null;
}

五、深拷贝 & 浅拷贝

1、深拷贝

1
2
3
var a = 1;
var b = a;
b = 2; // 此时a = 1

b的值改变不影响a,则为深拷贝。对于基本类型,赋值就是深拷贝。

2、浅拷贝

再看以下例子:

1
2
3
var a = {'name':'a'};
var b = a;
b.name = 'b'; // 此时a.name == 'b'为true

此种情况下b变导致a变,则为浅拷贝。
这个暂时不进行过多介绍。以后再说吧。

这个部分内容有点多并且杂乱,有时间还需要再看看。

强势安利一波阮一峰的Javascript标准参考教程,讲真,写的实在是好。