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,-Infinity 和 NaN (非数值)。
字符串(String)
JavaScript 的字符串类型用于表示文本数据。
它是一组16位的无符号整数值的“元素”。在字符串中的每个元素占据了字符串的位置。第一个元素的索引为0,下一个是索引1,依此类推。字符串的长度是它的元素的数量。
布尔值(Boolean)
布尔表示一个逻辑实体,可以有两个值:true 和 false。
布尔运算:
&&(与运算)遵循“一假及假”原则;||(或运算)遵循”一真及真“原则;
五个虚值 falsy 值(通过 if 代码段将 falsy 值转换为false):
0NaN''和""nullundefined
真值 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"