0%

JaveScript 数据类型

JaveScript 数据类型

JavaScript 的基本数据类型

最新的 ECMAScript 定义了6种原始数据类型以及 Object 对象:
原始数据类型:

  • string (字符串)
  • number (数字、NaN)
  • boolean (布尔类型,只有两个值:true、false)
  • null (表示为空的特殊关键字)
  • undefined (表示定义的变量未被赋值)
  • symbol (ES6新增,表示独一无二的值)

引用数据类型:

  • Object 对象

原始值和引用值的区别

原始值:

  • 原始值是存储在栈(stack)中的简单数据段,它们的值直接存储在变量访问的位置;
  • 所有的原始数据都是不可改变的。

引用值:

  • 引用值是存储在堆(heap)中的对象,存储在变量处的值是一个指针(point),指向存储变量的内存处;
  • JavaScript的引用值即对象。

typeof 操作符

typeof 操作符返回一个字符串,判断给定表达式的数据类型。

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
> typeof undefined
'undefined'
> typeof null
'object'
> typeof true
'boolean'
> typeof 12
'number'
> typeof Number(1) // 不推荐使用
'number'
> typeof Infinity
'number'
> typeof NaN
'number'
> typeof 1/0
NaN
> typeof 'hello world'
'string'
> typeof String('abc')
'string'
> typeof Symbol()
'symbol'
> typeof {a:1}
'object'
> typeof [1,2,3]
'object'
> typeof function(){}
'function'
> typeof new Boolean(true) // 不推荐使用
'object'
> typeof new Number(1) // 不推荐使用
'object'
> typeof new String('123') // 不推荐使用
'object'

数据类型的转换

JavaScript是一种动态类型语言(dynamically typed language)。这意味着你声明变量时可以不必指定数据类型,而数据类型会在脚本执行时根据需要自动转换。

强制转换

  • Number()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Number("123")                   // 123
Number("") // 0
Number("0x11") // 17
Number("0b11") // 3
Number("0o11") // 9
Number("foo") // NaN
Number("100a") // NaN
Number(null) // 0
Number(undefined) // NaN
Number(new Date("2018-01-01")) // 1514764800000
Number(true) // 1
Number(false) // 0
Number([1,2,3]) // NaN
Number([5])
// 5
Number({a:1}) // NaN
Number(" 12.04 ") // 12.04 (消除前后多余空格)
  • String()
1
2
3
4
5
6
7
8
9
String(123)                     // '123'
String(true) //'true'
String(false) //'false'
String([1,2,3]) //'1,2,3'
String({a:1}) //'[object Object]'
String(null) //'null'
String(undefined) //'undefined'
String(new Date("2018-01-01")) // 'Mon Jan 01 2018 08:00:00 GMT+0800 (CST)'
String(NaN) //'NaN'
  • Boolean()
1
2
3
4
5
6
7
8
Boolean(undefined)             // false
Boolean(null) // false
Boolean(0) // false
Boolean(NaN) // false
Boolean('') // false
Boolean({}) // true
Boolean([]) // true
Boolean(new Boolean(false)) // true

自动转换

1
2
3
4
5
6
7
8
9
10
11
// 1. 不同类型的数据互相运算
123 + 'abc' // "123abc"

// 2. 对非布尔值类型的数据求布尔值
if ('abc') {
console.log('hello')
} // "hello"

// 3. 对非数值类型的数据使用一元运算符(即“+”和“-”)
+ {foo: 'bar'} // NaN
- [1, 2, 3] // NaN
  • 自动转换为布尔值
1
2
3
4
5
6
7
8
9
10
11
12
13
14
if ( !undefined
&& !null
&& !0
&& !NaN
&& !''
) {
console.log('true');
} // true

// 写法一
expression ? true : false

// 写法二
!! expression
  • 自动转换为字符串
1
2
3
4
5
6
7
8
9
10
11
12
13
14
'5' + 1 // '51'
'5' + true // "5true"
'5' + false // "5false"
'5' + {} // "5[object Object]"
'5' + [] // "5"
'5' + function (){} // "5function (){}"
'5' + undefined // "5undefined"
'5' + null // "5null"

var obj = {
width: '100'
};

obj.width + 20 // "10020"
  • 自动转换为数值
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
'5' - '2' // 3
'5' * '2' // 10
true - 1 // 0
false - 1 // -1
'1' - 1 // 0
'5' * [] // 0
false / '5' // 0
'abc' - 1 // NaN
null + 1 // 1
undefined + 1 // NaN

+'abc' // NaN
-'abc' // NaN
+true // 1
-false // 0

参考资料

语法和数据类型 [https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Guide/Grammar_and_Types]
typeof [https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/typeof]
ECMAScript 原始值和引用值 [http://www.w3school.com.cn/js/pro_js_value.asp]
数据类型转换 – JavaScript 标准参考教程(alpha)[http://javascript.ruanyifeng.com/grammar/conversion.html]