JS 的数据类型

234 阅读3分钟

JavaSript 是一种动态语言。这意味着你不用提前声明变量的类型,在程序运行过程中,类型会被自动确定。这也意味着你可以使用同一个变量保存不同类型的数据:

var a = 100    // a is Number now
a = 'hello'    // a is String now
a = true       // a is Boolean now

数值(Number)

根据 ECMAScript 标准,JavaScript 中只有一种数字类型:基于 IEEE 754 标准的双精度 64 位二进制格式的值。它并没有为整数给出一种特定的类型,所有数字都是小数(64位浮点数)。

除了能够表示浮点数外,还有一些带符号的值:+Infinity-InfinityNaN (非数值)。

字符串(String)

JavaScript 的字符串类型用于表示文本数据。

它是一组16位的无符号整数值的“元素”。在字符串中的每个元素占据了字符串的位置。第一个元素的索引为0,下一个是索引1,依此类推。字符串的长度是它的元素的数量。

布尔值(Boolean)

布尔表示一个逻辑实体,可以有两个值:truefalse
布尔运算:

  • &&(与运算)遵循“一假及假”原则;
  • ||(或运算)遵循”一真及真“原则;

五个虚值 falsy 值(通过 if 代码段将 falsy 值转换为false):

  • 0
  • NaN
  • ''""
  • null
  • undefined

真值 truthy 值(通过 if 代码段将 truthy 值转换为true):

  • 除了被定位为 falsy 值的值都是 truthy 值
  • 对象都是 truthy 值,空对象也是 truthy 值

Symbol

ES6 引入了一种新的原始数据类型Symbol,表示独一无二的值。

Symbol 值通过Symbol函数生成。这就是说,对象的属性名现在可以有两种类型,一种是原来就有的字符串,另一种就是新增的 Symbol 类型。

// s 的类型为Symbol
var s = Symbol()

typeof s
// "symbol"

凡是属性名属于 Symbol 类型,就都是独一无二的,可以保证不会与其他属性名产生冲突。

// 没有参数的情况
var s1 = Symbol()
var s2 = Symbol()

s1 === s2 // false

// 有参数的情况
var s1 = Symbol('hello')
var s2 = Symbol('hello')

s1 === s2 // false

Null 和 Undefined

历史由来

1995年 JavaScript 诞生时,最初像 Java 一样,只设置了 null 表示"无"。根据 C 语言的传统,null 可以自动转为0。

Number(null) // 0
5 + null // 5

但是,JavaScript 的设计者 Brendan Eich 觉得这样做还不够。
首先,第一版的 JavaScript 里面,null 就像在 Java 里一样,被当成一个对象,Brendan Eich 觉得表示“无”的值最好不是对象。其次,那时的 JavaScript 不包括错误处理机制,Brendan Eich 觉得,如果null自动转为0,很不容易发现错误。

因此,他又设计了一个 undefined。区别是这样的:null是一个表示“空”的对象,转为数值时为0;undefined 是一个表示"此处无定义"的原始值,转为数值时为 NaN。

Number(undefined) // NaN
5 + undefined // NaN

常规用法

声明变量后,没有直接赋值 —— 默认赋值为 undefined
声明一个非对象变量时,没有直接赋值(想稍后赋值):

var a    // 默认赋值为undefined
var a = undefined    //直接赋值为undefined

声明一个对象变量时,没有直接赋值(想稍后赋值):

var obj = null    //直接赋值为null

对象(Object)

在计算机科学中, 对象是指内存中的可以被标识符引用的一块区域。(栈内存和堆内存)
对象就是一组“键值对”(key-value)的集合,是一种无序的复合数据集合。对象是复杂类型,由基本类型组成。

var name = 'kari'
var age = '18'

typeof name      typeof age
// "string"      // "string"
var person = {
    'name' : 'kari',
    'age' : '18'
}

typeof person
// "object"