JavaScript数据类型小结

7种数据类型

数字/数值:

number
整数和小数:1 1.1 .1
科学记数法:1.23e2
二进制:0b11
八进制:011(后来 ES5 添加了 0o11 语法)
十六进制:0x11

number里的几个特殊的值:

1.NaN是 JavaScript 的特殊值,表示“非数字”(Not a Number),主要出现在将字符串解析成数字出错的场合。


image.png

上面代码运行时,会自动将字符串x转为数值,但是由于x不是数值,所以最后得到结果为NaN,表示它是“非数字”(NaN)。

NaN不等于任何值,包括它本身。NaN在布尔运算时被当作false。
NaN与任何数(包括它自己)的运算,得到的都是NaN。


image.png

''需要注意的是,NaN不是独立的数据类型,而是一个特殊数值,它的数据类型依然属于Number,使用typeof运算符可以看得很清楚。

image.png

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

Infinity有正负之分,Infinity表示正的无穷,-Infinity表示负的无穷。


image.png

Infinity大于一切数值(除了NaN),-Infinity小于一切数值(除了NaN)。
Infinity与NaN比较,总是返回false。
3.JavaScript 内部实际上存在2个0:一个是+0,一个是-0,区别就是64位浮点数表示法的符号位不同。它们是等价的。
-0 === +0 // true
几乎所有场合,正零和负零都会被当作正常的0。
+0 // 0
-0 // 0
(-0).toString() // '0'
(+0).toString() // '0'
唯一有区别的场合是,+0或-0当作分母,返回的值是不相等的。
(1 / +0) === (1 / -0) // false

字符串:

string
空字符串:
多行字符串:
var s = '12345' +
'67890' // 无回车符号

var s = 12345 67890 // 含回车符号

反斜杠(\)在字符串内有特殊含义,用来表示一些特殊字符,所以又称为转义符。

需要用反斜杠转义的特殊字符,主要有下面这些。

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

字符串与数组
字符串可以被视为字符数组,因此可以使用数组的方括号运算符,用来返回某个位置的字符(位置编号从0开始)。
var s = 'hello';
s[0] // "h"
s[1] // "e"
s[4] // "o"

// 直接对字符串使用方括号运算符
'hello'[1] // "e"

如果方括号中的数字超过字符串的长度,或者方括号中根本不是数字,则返回undefined。
'abc'[3] // undefined
'abc'[-1] // undefined
'abc'['x'] // undefined

但是,字符串与数组的相似性仅此而已。实际上,无法改变字符串之中的单个字符。
var s = 'hello';

delete s[0];
s // "hello"

s[1] = 'a';
s // "hello"

s[5] = '!';
s // "hello"
上面代码表示,字符串内部的单个字符无法改变和增删,这些操作会默默地失败。

length属性返回字符串的长度,该属性也是无法改变的。
var s = 'hello';
s.length // 5

s.length = 3;
s.length // 5

s.length = 7;
s.length // 5
上面代码表示字符串的length属性无法改变,但是不会报错

Base64 转码
有时,文本里面包含一些不可打印的符号,比如 ASCII 码0到31的符号都无法打印出来,这时可以使用 Base64 编码,将它们转成可以打印的字符。另一个场景是,有时需要以文本格式传递二进制数据,那么也可以使用 Base64 编码。

所谓 Base64 就是一种编码方法,可以将任意值转成 0~9、A~Z、a-z、+和/这64个字符组成的可打印字符。使用它的主要目的,不是为了加密,而是为了不出现特殊字符,简化程序的处理。
JavaScript 原生提供两个 Base64 相关的方法。

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

var string = 'Hello World!';
btoa(string) // "SGVsbG8gV29ybGQh"
atob('SGVsbG8gV29ybGQh') // "Hello World!"

注意,这两个方法不适合非 ASCII 码的字符,会报错
btoa('你好') // 报错

要将非 ASCII 码字符转为 Base64 编码,必须中间插入一个转码环节,再使用这两个方法。
function b64Encode(str) {
return btoa(encodeURIComponent(str));
}

function b64Decode(str) {
return decodeURIComponent(atob(str));
}

b64Encode('你好') // "JUU0JUJEJUEwJUU1JUE1JUJE"
b64Decode('JUU0JUJEJUEwJUU1JUE1JUJE') // "你好"

布尔:

boolean
boolean 的取值
只有两个值:true 和 false
a && b 在 a 和 b 都为 true 时,取值为 true;否则为 false
a || b 在 a 和 b 都为 false 时,取值为 false;否则为 true

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

前置逻辑运算符: ! (Not)
相等运算符:===,!==,==,!=
比较运算符:>,>=,<,<=

除了下面六个值被转为false,其他值都视为true。
undefined
null
false
0
NaN
""或''(空字符串)
例:


image.png

上面代码中,if命令后面的判断条件,预期应该是一个布尔值,所以 JavaScript 自动将空字符串,转为布尔值false,导致程序进入else代码块,输出false

注意,空数组([])和空对象({})对应的布尔值,都是true


image.png

image.png

undefined null
都表示没有值
如果一个变量没有被赋值,那么这个变量的值就是 undefiend 如果你想表示一个还没赋值的对象,就用 null。如果你想表示一个还没赋值的字符串/数字/布尔/symbol,就用 undefined(但是实际上你直接 var xxx 一下就行了,不用写 var xxx = undefined)

null和undefined的区别是
null是一个表示“空”的对象,转为数值时为0;undefined是一个表示"此处无定义"的原始值,转为数值时为NaN

symobel

对象:

object
object 就是上面几种基本类型(无序地)组合在一起
object 里面可以有 object
var person = {
name: 'Frank',
'child': {
name: 'Jack'
}, // 最后这个逗号可有可无
}
object 的 key 一律是字符串,不存在其他类型的 key
object[''] 是合法的
object['key'] 可以写作 object.key
注意 object.key 与 object[key] 不同
delete object['key']
'key' in object
function 和Array 都属于对象

typeof运算符

typeof运算符可以返回一个值的数据类型。

数值、字符串、布尔值分别返回number、string、boolean。


image.png

函数虽然是对象 但是返回的却是function 此处特殊记忆


image.png

还有一个不同的就是null 空值 返回的是object
这是由于历史原因造成的。1995年的 JavaScript 语言第一版,只设计了五种数据类型(对象、整数、浮点数、字符串和布尔值),没考虑null,只把它当作object的一种特殊值。后来null独立出来,作为一种单独的数据类型,为了兼容以前的代码,typeof null返回object就没法改变了。

image.png

undefined 返回undefined


image.png

利用这一点,typeof可以用来检查一个没有声明的变量,而不报错。

对象返回object


image.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

友情链接更多精彩内容