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