javascript之类型

基本类型和引用类型

基本类型

常见的基本类型有:(还有对应包装类)

  1. number -> Number
  2. string -> String
  3. boolean -> Boolean
  4. null 没有包装类型, Null类型也只有一个值,即null
  5. undefined 没有包装类型, Undefined类型只有一个值,即undefined

基本类型变量和值是存放在栈中的。

引用类型

常见的引用类型有:

  1. Object
  2. Array
  3. Function
  4. Data

引用类型的变量存放在栈中,具体的内容是放在堆中。栈中变量的值为堆中的引用(地址)

注意

注意参数传参数时的基本类型和引用类型

首先我们应该明确一点:ECMAScript中所有函数的参数都是按值来传递的。

  但是为什么涉及到原始类型与引用类型的值时仍然有区别呢?还不就是因为内存分配时的差别。  

  1)原始值:只是把变量里的值传递给参数,之后参数和这个变量互不影响。

2)引用值:对象变量它里面的值是这个对象在堆内存中的内存地址,这一点你要时刻铭记在心!

因此它传递的值也就是这个内存地址,这也就是为什么函数内部对这个参数的修改会体现在外部的原因了,因为它们都指向同一个对象。

实例讲解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
console.log(typeof(1));  // number
console.log(typeof(new Number(1))); // object
console.log(typeof(true)); // boolean
console.log(typeof(new Boolean(true))) // object
console.log(typeof('123')) // string
console.log(typeof(new String('123'))); // object
console.log(typeof(null)); // object
console.log(typeof(undefined)); // undefined

console.log(1 == new Number(1)) // true
console.log(1 === new Number(1)) // false


// Number Boolean String 为基本类型number boolean string的包装类Wrapper
// new Number(1).valueOf() 转化为基本类型 number

console.log('----------------');

// 基本类型的方法和属性都是向包装类借来的。 这是js中的设计
console.log('123'.charAt === String.prototype.charAt) // true

// 因为js设计包装类的主要目的是为了 让基本类型使用
// 所以在求值过程中包装类型总是会强制转化为基本类型
let xixi = new Number(12);
let hh = xixi + 2;
console.log(hh); // 14

console.log(new Boolean(false) === false) //false
if(new Boolean(false)) {
console.log('这里有坑。。。')
}
// 因为对象只有在为 null或者undefined的时候才会为false
// 而包装类型本身是一个对象,所以new Boolean(false) 其实就是一个true。
// 所以,要么不要用new Boolean(false),要用就用new Boolean(false).valueOf() 取得他的基本类型值

// 类型转换 + ~~ !!
// 转为数字
console.log(+'123.123'); // 123.123
console.log(typeof(+'123.123')); // number
// 转为整数
console.log(~~'123.123'); // 123
console.log(typeof(~~'123.123')); // number

// 转为字符串
console.log('' + 123) // 123
console.log(typeof('' + 123)) // string

// 转为boolean
console.log(!!(0)) // false
console.log(!!(-1)); // true
console.log(typeof(!!(1))) // boolean
let hehe;
console.log(!!(undefined)); // false
console.log(!!('')); // false
console.log(!!(null)); // false


console.log(typeof([])); // object
console.log(typeof(new Array())); //object
let toString = Object.prototype.toString;
console.log(toString.call([])) // [object Array]
// call方法会将基本类型转化为他的包装类。所以这里才会为object
console.log(toString.call(1)); // [object Number]
console.log(toString.call(new Number(1))); // [object Number]
console.log(toString.call(new Number(1)).slice(8, -1)); // Number
console.log(toString.call(undefined).slice(8, -1)); // Undefined
console.log(toString.call(null).slice(8, -1)); // Null

let a = new Number(1);
let b = a;
console.log(a) // [Number: 1]
console.log(b); // [Number: 1]
b = new Number(2);
console.log(a) // [Number: 1]

let aa = 'hhhhh';
let bb = aa;
console.log(aa) // hhhhh
bb += '123';
console.log(aa) // hhhhh
console.log(bb) // hhhhh123