JavaScript 是一种弱类型或者说动态语言。这意味着你不用提前声明变量的类型,在程序运行过程中,类型会被自动确定。
数据类型
最新的 ECMAScript 标准定义了7种数据类型:
typeof运算符
typeof运算符可以返回一个值的数据类型,返回一个字符串。
数值
根据 ECMAScript 标准,JavaScript 中只有一种数值类型:基于 IEEE 754 标准的双精度 64 位二进制格式的值(-( $2^{63}$ -1) 到 $2^{63}$ -1)。它并没有为整数给出一种特定的类型。除了能够表示浮点数外,还有一些带符号的值:+Infinity,-Infinity 和 NaN (非数值,Not-a-Number)。
在JavaScript语言的底层,根本没有整数,所有数字都是小数(64位浮点数)。
1 | 1 === 1.0 // true |
由于浮点数不是精确的值,所以涉及小数的比较和运算要特别小心。
1 | 0.1 + 0.2 === 0.3 |
2 | // false |
3 | 0.1 + 0.2 |
4 | // 0.30000000000000004 |
数值的进制
JavaScript对整数提供四种进制的表示方法:十进制、十六进制、八进制、2进制。
十进制:没有前导0的数值
八进制:有前缀0o或0O的数值,或者有前导0、且只用到0-7的七个阿拉伯数字的数值。
十六进制:有前缀0x或0X的数值。
二进制:有前缀0b或0B的数值。
NaN
NaN是JavaScript的特殊值,表示“非数字”(Not a Number),主要出现在将字符串解析成数字出错的场合。
1 | typeof NaN // 'number' |
运算规则
NaN不等于任何值,包括它本身。
1 | NaN === NaN // false |
字符串
字符串就是零个或多个排在一起的字符,放在单引号或双引号之中。
1 | 'abc' |
2 | "abc" |
如果长字符串必须分成多行,可以在每一行的尾部使用反斜杠。
1 | var longString = "Long \ |
2 | long \ |
3 | long \ |
4 | string"; |
5 | |
6 | longString |
7 | // "Long long long string" |
转义
反斜杠(\)在字符串内有特殊含义,用来表示一些特殊字符,所以又称为转义符。
\0 null(\u0000)
\b 后退键(\u0008)
\f 换页符(\u000C)
\n 换行符(\u000A)
\r 回车键(\u000D)
\t 制表符(\u0009)
\v 垂直制表符(\u000B)
' 单引号(\u0027)
" 双引号(\u0022)
\ 反斜杠(\u005C)
反斜杠还有三种特殊用法。
(1)\HHH
反斜杠后面紧跟三个八进制数(000到377),代表一个字符。HHH对应该字符的Unicode码点,比如\251表示版权符号。显然,这种方法只能输出256种字符。
(2)\xHH
\x后面紧跟两个十六进制数(00到FF),代表一个字符。HH对应该字符的Unicode码点,比如\xA9表示版权符号。这种方法也只能输出256种字符。
(3)\uXXXX
\u后面紧跟四个十六进制数(0000到FFFF),代表一个字符。HHHH对应该字符的Unicode码点,比如\u00A9表示版权符号。
Base64转码
Base64是一种编码方法,可以将任意字符转成可打印字符。
JavaScript原生提供两个Base64相关方法。
btoa():字符串或二进制值转为Base64编码
atob():Base64编码转为原来的编码
1 | var string = 'Hello World!'; |
2 | btoa(string) // "SGVsbG8gV29ybGQh" |
3 | atob('SGVsbG8gV29ybGQh') // "Hello World!" |
要将非ASCII码字符转为Base64编码,必须中间插入一个转码环节,再使用这两个方法。
1 | function b64Encode(str) { |
2 | return btoa(encodeURIComponent(str)); |
3 | } |
4 | |
5 | function b64Decode(str) { |
6 | return decodeURIComponent(atob(str)); |
7 | } |
8 | |
9 | b64Encode('你好') // "JUU0JUJEJUEwJUU1JUE1JUJE" |
10 | b64Decode('JUU0JUJEJUEwJUU1JUE1JUJE') // "你好" |
布尔值
布尔值只有两个值:true和false。
除了下面六个值被转为false,其他值都视为true。
undefined
null
false
0
NaN
“”或’’(空字符串)
null和undefined
null与undefined都可以表示“没有”,含义非常相似。将一个变量赋值为undefined或null,老实说,语法效果几乎没区别。
null的特殊之处在于,JavaScript把它包含在对象类型(object)之中。
1 | typeof null // "object" |
注意,JavaScript的标识名区分大小写,所以undefined和null不同于Undefined和Null(或者其他仅仅大小写不同的词形),后者只是普通的变量名。
null表示空值,即该处的值现在为空。调用函数时,某个参数未设置任何值,这时就可以传入null。比如,某个函数接受引擎抛出的错误作为参数,如果运行过程中未出错,那么这个参数就会传入null,表示未发生错误。
undefined表示“未定义”。
Symbol
Symbol 是JavaScript的原始数据类型,Symbol实例是唯一且不可改变的.
1 | let s = Symbol(); |
2 | |
3 | typeof s |
4 | // "symbol" |
Symbol函数可以接受一个字符串作为参数,表示对 Symbol 实例的描述。注意,Symbol函数的参数只是表示对当前 Symbol 值的描述,因此相同参数的Symbol函数的返回值是不相等的。
1 | // 没有参数的情况 |
2 | var s1 = Symbol(); |
3 | var s2 = Symbol(); |
4 | |
5 | s1 === s2 // false |
6 | |
7 | // 有参数的情况 |
8 | var s1 = Symbol('foo'); |
9 | var s2 = Symbol('foo'); |
10 | |
11 | s1 === s2 // false |
对象
对象(object)是JavaScript的核心概念,也是最重要的数据类型。JavaScript的所有数据都可以被视为对象。
所谓对象,就是一种无序的数据集合,由若干个“键值对”(key-value)构成。
1 | var o = { |
2 | p: 'Hello World' |
3 | }; |
p是“键名”,字符串Hello World是“键值”,键名与键值之间用冒号分隔。
对象的所有键名都是字符串。对象的每一个“键名”又称为“属性”(property),它的“键值”可以是任何数据类型。
检查变量是否声明
1 | if ('a' in window) { |
2 | // 变量 a 声明过 |
3 | } else { |
4 | // 变量 a 未声明 |
5 | } |
查看所有属性
查看一个对象本身的所有属性,可以使用Object.keys方法。
1 | var o = { |
2 | key1: 1, |
3 | key2: 2 |
4 | }; |
5 | |
6 | Object.keys(o); |
7 | // ['key1', 'key2'] |
(摘自 JavaScript 标准参考教程)