0%

浅谈 JS 数据

JS 中数据类型有七种 number null undefined string boolean object symbol(es6) 今天就来看看他们的一些平常会用到的东西

JavaScript 历史

这七种不包括 Array Funtion 这两种其实就是 object

注意事项

#####1.number

  • 八进制: 011 (es5新增 0o11 语法)
2.string
  • 多行代码

    1
    2
    3
    4
    5
    6
    7
    8
     var s = '12345' +
    '67890' // 无回车符号

    var s = `12345
    67890` // 含回车符号
    //其实还可以但不推荐,因为若在\后面有' '就会报错且不易发现
    var longString = 'Long \
    string';
3.undefined 与 null

就连 JS 之父都说这是他当初没有设计好的地方

不过一般情况下会对一个未赋值的对象,就用 null

对于不是对象的数据类型没有赋值,就是 undefined

typeof 操作符

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
typeof String
//"function"
typeof 'hello'
//"string"
typeof 1
//"number"
typeof true
//"boolean"
typeof {}
//"object"
typeof null
//"object"
var a = null
//undefined
typeof a
//"object"
var b = Symbol()
//undefined
typeof b
//"symbol"

需要注意的就是 null 和 function, function并不是一个类型

数据转换

可以说在 code 的世界中有很大一部分的事情就是在将数据的格式进行转换

任意类型转 String

有三种 String() .toString() 与最方便的 ''+1/true...

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
String(1)
//"1"
String({})
//"[object Object]"
String({
key: '99',
})
//"[object Object]"
(1).toString()
//"1"
1 + ''
//"1"
null + ''
//"null"
undefined + ''
//"undefined"

需要注意的是 null/undefined 是没有 toString() 方法的,会报错

任意类型转数字
  1. Number(x)
  2. parseInt(x, 10) MDN
  3. parseFloat(x) MDN
  4. x - 0
  5. +x
1
2
3
4
5
6
7
8
9
10
11
12
13
14
var a = '1'
//undefined
Number(a)
//1
parseInt(a)
//1
parseInt(a, 10)
//1
parseFloat(a)
//1
a - 0
//1
+a
//1
任意类型转布尔
  1. Boolean(x)
  2. !!x
  3. 五个 Falsy 值nul undefined NaN '' 0

面试题

1
2
3
4
var a = 1
var b = a
b = 2
请问 a 显示是几?
1
2
3
4
var a = {name: 'a'}
var b = a
b = {name: 'b'}
请问现在 a.name 是多少?
1
2
3
4
var a = {name: 'a'}
var b = a
b.name = 'b'
请问现在 a.name 是多少?
1
2
3
4
var a = {name: 'a'}
var b = a
b = null
请问现在 a 是什么?

主要是画内存图,分清楚 HeapStack ,像复杂类型一般都是放到 Stack中的比如对象。

垃圾回收

JavaScript 的 gc 个人觉得与Java 是很像的,至少表面上看都是当不被引用的时候就会被当做垃圾然后就会等待垃圾车的到来。

深复制与浅复制

这是一个浅拷贝的例子

1
2
3
4
var a = {name: 'frank'}
var b = a
b.name = 'b'
a.name === 'b' // true

因为我们对 b 操作后,a 也变了

什么是深拷贝了,就是对 Heap 内存进行完全的拷贝。

1
2
3
4
var a = {name: 'frank'}
var b = deepClone(a) // deepClone 还不知道怎么实现
b.name = 'b'
a.name === 'a' // true