欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

JavaScript 数据类型

程序员文章站 2022-06-04 22:54:59
...

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 标准参考教程)