JavaScript 数据类型

一、数据类型

  1. JavaScript 语言的每一个值,都属于某一种数据类型。 JavaScript 共有七种数据类型:
  • 数值(number):包括整数和小数(比如13.14
  • 字符串(string):即文本(比如Hello World
  • 布尔值(boolean):表示真伪的两个特殊值,即truefalse
  • Symbol:ES6 新增,定义对象的唯一属性名
  • undefined:表示“未定义”或不存在,即由于目前没有定义,所以此处暂时没有任何值
  • null:表示空值,即此处的值为空
  • 对象(object):各种值组成的集合
  • 基本(简单)数据类型:数值、字符串、布尔值、Symbol、undefined、null
    复杂数据类型:对象
  • 对象是最复杂的数据类型,又可以分成三个子类型:狭义的对象(object)、数组(array)、函数(function)。
  • 空数组 [] 的类型也是 object,本质上只是一种特殊的对象。
  1. typeof 运算符
    用以判断数据类型,返回一个值的数据类型。
typeof 123 // "number"
typeof 'abc' // "string"
typeof false // "boolean"
typeof undefined // "undefined"
typeof {} // "object"
  • 两种特殊情况:nullfunction
function f() {}  // "function"
typeof null // "object"

二、 null 和 undefined

nullundefined都可以表示“没有”,含义非常相似。

  1. 二者区别:
  • null 是一个表示“”的对象,转为数值时为 0.
  • undefined 是一个表示”此处无定义”的原始值,转为数值时为 NaN.
  1. 常见语法惯例:
  • 变量没有赋值 —— undefined
  • 声明一个对象 object,暂时不想给值 var obj = null —— null
    声明一个非对象,暂时不想给值 var n (= undefined) —— undefined

三、布尔值

布尔值代表“真”和“假”两个状态。
“真”用关键字 true 表示,“假”用关键字 false 表示。

  • 下列运算符会返回布尔值:

两元逻辑运算符: && (And),|| (Or)
前置逻辑运算符: ! (Not)
相等运算符: ===!====!=
比较运算符:>>=<<=

  • 两元运算符运算规则:
a && b:
true && true = true 、 true && false = false 、 false && false = false
a || b:
true && true = true 、 true && false = true 、 false && false = false
  • 如果 JavaScript 预期某个位置应该是布尔值,会将该位置上现有的值自动转为布尔值。转换规则是除了下面六个值被转为 false,其他值都视为 true。

undefinednullfalse0NaN""''(空字符串)

  • 布尔值往往用于程序流程的控制。

四、数值

  1. 整数和浮点数
  • JavaScript 内部,所有数字都是以 64 位浮点数形式储存,整数也是。所以 1===1.0,它们是同一个数。
  • JavaScript 语言的底层根本没有整数,所有数字都是小数(64位浮点数)
  1. 数值精度
  • JavaScript 浮点数的 64 个二进制位组成(从最左边开始):

    第 1 位:符号位,0表示正数,1表示负数
    第 2 位到第 12 位(共11位):指数部分
    第 13 位到第 64 位(共52位):小数部分(即有效数字)

  • 符号位决定了一个数的正负,指数部分决定了数值的大小,小数部分决定了数值的精度。

  • 正常情况下(指数部分在 0 到 2047 之间),一个数在 JavaScript 内部实际的表示形式:(-1)^符号位 * 1.xx...xx * 2^指数部分

  • JavaScript 提供的有效数字最长为 53 个二进制位,绝对值小于等于2的53次方的整数,即 -2^53 到 2^53,都可以精确表示。由于 2 的 53 次方是一个 16 位的十进制数值,所以 JavaScript 对 15 位的十进制数都可以精确处理。大于 2 的 53 次方以后,多出来的有效数字都会无法保存,变成 0.

Math.pow(2, 53)
// 9007199254740992

9007199254740992111
// 9007199254740992000   多出的三个有效数字,将无法保存
  1. 进制

二进制:前缀为0b的数字
八进制:前缀为0u的数字,或以0开头且只含0~7的数字
十进制:不以0开头的数字
十六进制:前缀为0x的数字

  • JavaScript 内部会自动默认将八进制、十六进制、二进制转为十进制。
  • 十进制数值的记法包括整数、小数 和 科学计数法(1.23e2 = 123)。
  1. 特殊数值
  • 正 0 和负 0
    几乎所有场合,正 0 和负 0 都会被当作正常的 0:+0 === -0 === 0
    唯一有区别的场合是,+0 或 -0 当作分母,返回的值是不相等的。

  • NaN
    NaN是 JavaScript 的特殊值,表示“非数字”(Not a Number)。
    NaN不是独立的数据类型,而是一个特殊数值,它的数据类型依然属于 Number.
    NaN在布尔运算时被当作 false.
    NaN不等于任何值,包括它本身;0 除以 0 等于NaNNaN与任何数(包括它自己)的运算,得到的都是 NaN.

  • Infinity
    Infinity 表示“无穷”,用来表示两种场景:一种是一个正的数值太大或一个负的数值太小,无法表示;另一种是非 0 数值除以 0,得到 Infinity

Math.pow(2, 1024)     // Infinity

0 / 0   // NaN
1 / 0   // Infinity

Infinity 有正负之分,Infinity 表示正的无穷,-Infinity 表示负的无穷。
InfinityNaN比较,总是返回 false.

五、字符串

  1. 定义
  • 字符串:放在''""之间的 0 个或多个字符。
    ''字符串里面可以用""""字符串里面可以用''
  • ''含0 个字符,为“空字符串”,length=0;
    ' '含一个空格,为“空格字符串”,length=1.
  • 很多项目约定 JavaScript 语言的字符串只使用''
  1. 多行字符串
  • 字符串默认只能写在一行内,分成多行将会报错;
  • 如果长字符串必须分成多行,可以在每一行的尾部使用反斜杠\
  • 反斜杠的后面必须是换行符,而不能有空格等其他字符,否则会报错。
'ab \
cd \
ef'
// abcdef
  • 模板字符串 (template string)(ES6 新增)
    用反引号(`)标识,可以用作普通字符串,也可以用来定义多行字符串(length 中包含回车),或在字符串中嵌入变量:
`ab
cd
ef`
// abcdef
  1. 连接运算符 +
    + 可以连接多个单行字符串,将长字符串拆成多行书写,输出的时候也是单行。
'ab'
+ 'cd'
+ 'ef'
// abcdef
  1. 转义
    反斜杠\在字符串内有特殊含义,用来表示一些特殊字符,又称为转义符。

\0 :null(\u0000)
\b :后退键(\u0008)
\f :换页符(\u000C)
\n :换行符(\u000A)
\r :回车键(\u000D)
\t :制表符(\u0009)
\v :垂直制表符(\u000B)
\' :单引号(\u0027)
\" :双引号(\u0022)
\\ :反斜杠(\u005C)

  • 反斜杠的三种特殊用法:
    (1)\HHH
    \后面紧跟三个八进制数(000到377),代表一个字符。
    (2)\xHH
    \x后面紧跟两个十六进制数(00到FF),代表一个字符。
    (3)\uXXXX
    \u后面紧跟四个十六进制数(0000到FFFF),代表一个字符。
  1. lenth 属性
    length属性返回字符串的长度,该属性是无法改变的。
var s = 'hello';
s.length   // 5
  1. 字符集
  • JavaScript 引擎内部以 Unicode 储存字符,所有字符都用 Unicode 表示。
  • 程序中可使用 Unicode 码点表示字符,即将字符写成\uxxxx的形式:
var a = '\u006F\u006F';
a   // "oo"
  • 每个字符在 JavaScript 内部都是以16位(即2个字节)的 UTF-16 格式储存。即 JavaScript 的单位字符长度固定为16位长度,2个字节。
    (1)但UTF-16 有两种长度:码点在U+0000U+FFFF之间的字符,长度为16位(即2个字节);码点在U+10000U+10FFFF之间的字符,长度为32位(即4个字节)。
    (2)对于码点在U+10000U+10FFFF之间的字符,JavaScript 总是认为它们是两个字符(length属性为2)。因此JavaScript 返回的 length 可能不正确
  • JavaScript 引擎不能自动识别编号大于 0xFFFF 的 Unicode 字符。
  1. Base64 转码
  • Base64 是一种编码方法,可以将任意值转成 0~9、A~Z、a-z、+和/这64个字符组成的可打印字符。使不出现特殊字符,简化程序的处理。

btoa():任意值转为 Base64 编码
atob():Base64 编码转为原来的值

var string = 'Hello World!';
btoa(string) // "SGVsbG8gV29ybGQh"
atob('SGVsbG8gV29ybGQh') // "Hello World!"
  • 要将非ASCII码(比如中文)字符转为Base64编码,必须中间插入一个转码环节。

六、对象

  1. 定义
  • 对象(object)是一组“键值对”(key-value)的集合,是一种无序的复合数据集合(哈希表)。
  • 对象是复杂类型(其他六类为简单类型),由其他简单类型组成。
  • 对想是 JavaScript 语言的核心概念,也是最重要的数据类型。
  1. 语法
  • 对象的所有键名(属性)都是字符串(ES6 中 Symbol 值也可以作为键名),所以加不加引号都可以;空字符串也可以作为键名。
  • 如果键名不符合“标识符原则”(标识符只能包含字母或数字或汉字或下划线(“_”)或美元符号(“$”),且不能以数字开头),并且也不是数字,则必须加上引号,否则会报错。
  • 键值可以为各种类型,键值的类型也可以为一个“对象”。
  • 对象的属性之间用逗号分隔。
var person = {
  name: 'Frank',
  age: 26,
  gender: 'female',
  married: true,
  children: {name: 'Micle',age: 3} ,    // 键值也可以为对象
  '': 'Frank' ,                          // 属性名也可以为空字符串
  '9a':'Frank'
}
  1. 属性的操作
  • 读取属性的两种方法:
    person['name'](属性名必须放在引号里,''不可省略)
    person.name (特例,当属性名符合标识符规则时才可用)
    注意:数值键名不能使用点运算符(会被当成小数点);
    使用方括号运算符,可以不加引号,因为会自动转成字符串:
var obj = {
  123: 'Hello'
};

obj.123  // 报错
obj['123'] // "Hello"
obj[123]  // "Hello"
  • 查看所有属性:Object.keys方法
Object.keys(person);

// ['name', 'age','gender','married','children','','9a']
  • 删除属性:delete
    用于删除对象的属性,删除成功后返回 true.
delete person['name']  // true
person.name   // undefined 

注意:若 delete 一个不存在的属性, 不报错且返回 true.

  • in 运算符
    检查对象是否包含某个属性,包含就返回 true,否则返回 false.
'age' in person     // true
'phone' in person   // false
  • for...in循环
    遍历一个对象的全部属性。
for (var key in person) {
  console.log(key);
}
// name  (顺序随机)
// age
// ......
for (var key in person) {
  console.log(person[key]);
}
// Frank
// 26
// ......

(1)for...in循环会跳过不可遍历的属性。
(2)它不仅遍历对象自身的属性,还遍历继承的属性。
(3)循环不按声明的顺序遍历属性,顺序随机。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,723评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,003评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,512评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,825评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,874评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,841评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,812评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,582评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,033评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,309评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,450评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,158评论 5 341
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,789评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,409评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,609评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,440评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,357评论 2 352