JS (三)数据类型

1、定义

JS里的每一个值都属于一种数据类型

2、数据类型(7种)

  • number(数值):整数和小数(比如1和0.1)
  • string(字符串):字符组成的文本(比如hello world)
  • boolean(布尔值):两个值,true,flase
  • symbol(符号,ES6新加)
  • object(对象): 各种值的集合
  • undefined:“未定义”或不存在,即由于目前没有定义,所以此处暂时没有任何值
  • null:空值

所以,JS一切皆对象是大大的错误!明明还有其他6种类型,不能太偏心~

2.1 number

2.1.1 整数和浮点数

JS内部,所有数字都是以64位浮点数形式存储,即使是整数也亦然。

1 === 1.0   // true

2.1.2 数值精度

根据国际标准IEEE 754,JS里64个二进制位,从最左边开始:

第一位:符号位,0是正数,1是负数
2~12位:指数部分 (决定数值的大小)
13~63位:小数部分(决定数值的精度)

2.1.3 数值范围

64位浮点数的指数位共11位,也就是0-2047(2^11 -1),又因正负之分,所以JS 的表示范围就是21024~2-1023(开区间)之中。

如果一个数大于2^1024,JS无法表示这么大的数,发生正向溢出,返回Infinity

如果一个数小于2^-1075(指数部分最小值-1023,再加上小数部分的52位), JS无法表示这么小的数,发生负向溢出,返回0

Math.pow(2,1024)  // Infinity
Math.pow(2,-1075) // 0

2.1.4 数值的表示

JS数值有很多种表示方法,如35(十进制),0xFF(十六进制),科学表示法等。

  • 二进制:0b 或0B 为前缀的数值
  • 八进制:有前缀 0o 或 0O 的数值,或者有前导0、且只用到0-7的八个阿拉伯数字的数值。
  • 十进制:没有前导0的数值
  • 十六进制:前缀为 0x 或 0X 的数值
  • 科学计数法:允许字母e或E后面跟一个整数表示数值的指数部分

默认情况下,JavaScript 内部会自动将八进制、十六进制、二进制转为十进制。

0b11 // 3
0o377 // 255
0xff // 255
// 科学计数法
123e3 //123000
123e-3  //0.123

注:以下两种情况,JS会将数值自动转换为科学计数法

  • 小数点前数字多于21位
  • 小数点后的0多于5个
// 22位
1234567890123456789012
// 1.2345678901234568e+21
// 21位
123456789012345678901
// 123456789012345680000

// 小数点后紧跟5个以上的零,
// 就自动转为科学计数法
0.0000003 // 3e-7

// 否则,就保持原来的字面形式
0.000003 // 0.000003

2.2 string

2.2.1 定义

字符串就是0个或多个排在一起的字符,放在单引号或者双引号之中

'abc'
"abc"
'say "hello" '
"say 'hello'"
// 以上均是合法的表达

想要字符串写在多行中,下图这样就会报错

image

所以有3种方式

// 方式1  注意\后不可以有空格,否则就会报错
'345\
453\
78';
// 方式2
'123'
+'456'
+'78';
// 方式3  
`12345
67890`
// ES6新增加,反引号,且下一行首字母需要顶到头,负责空格也会算进去
// 比如上面这行代码,长度是11,尽管6顶到了头,因为5后面还有一个回车。

image

我们最常用的是方式2,毕竟只是多打几个引号,方式1那是坑死你不解释啊,不服来看图

image

第一个和第二个几乎没什么差别,可第一个就是报错了,为什么,因为我加了空格啊,可是几乎看不出来,所以说坑死人不解释啊

2.2.2 转义

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

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

后面跟着的\uXXXX 是\u再加上四个十六进制,XXXX对应该字符的 Unicode 码点。

这个怎么用,我们假设想定义一个单引号

image

很显然报错了,浏览器是这样读的,var a = '' ' ,也就是一对单引号,然后剩下一个不知道干什么的单引号,浏览器不想看到它,当然就报错了。那么我们怎么定义,可以用转义符。

image

如果定义反斜杠呢?同样是使用转义符就可以

image

2.2.3 字符串与数组

字符串可被视为字符数组,因此可以用数组的方括号运算符来返回某个位置字符,但切记,字符串与数组相似性仅此而已,它是无法像真正的数组一样改变字符串内的字符。

image

2.2.4 length

length返回字符串的长度

image

2.3 boolean

布尔值代表真假两个状态,只有两个值,true和false。

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

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

如果 JavaScript 预期某个位置应该是布尔值,会将该位置上现有的值自动转为布尔值。转换规则是除了下面六个值被转为false,其他值都视为true。

  • undefined
  • null
  • false
  • 0
  • NaN
  • ""或''(空字符串)

2.4 null和undefined

null是一种类型,它只有一个值null,undefined也是一种类型,它也只有一个值undefined

var a = null
// 几乎等同于
var a = undefined

null和undefined都代表着空值,一无所有,至于为什么要设置两个空值,这跟历史原因有关,现在也可以算bug了,那么这两个的区别在哪里呢?

(1)、(语法)若是一个变量没有赋值,那么js返回undefined

(2)、(惯例) 若是对象object,不想赋值,推荐给null。若是非对象不想赋值,推荐给undefined

undefined 表示一个变量自然的、最原始的状态值,而 null 则表示一个变量被人为的设置为空对象,而不是原始状态.

2.5 object

2.5.1 定义

数值,字符串和布尔值都是最基本数据类型即原始类型(primitive type)的值。

对象是合成类型(complex type)的值,类似于容器,是由多个原始类型(primitive type)值得合成。

// 以下都是原始类型primitive type
var name = 'cxy'
var age = 18
var gender = 'female'
// 以下是对象,合成类型complex type
var person ={
'name':'cxy',
'age':18,
'gender':'female'
}

对象又可以分成三个类型:

  • 狭义的对象(object)
  • 数组(array)
  • 函数(function)

对象是由键值对组成的无序复合数据组合,包含键名和键值,键值对之间用逗号分隔。

var person ={
'name':'cxy',
'age':18,
'gender':'female'
}

如上面代码,大括号定义了一个对象,它被赋值给变量person,所以变量person就指向一个对象。

该对象内部包含3个键值对(又称为3个“成员”):

第一个键值对是name: 'cxy',其中name是“键名”(成员的名称),字符串cxy是“键值”(成员的值)。

键名与键值之间用冒号分隔。

第二个键值对是'age':18,age是键名,18是键值。

两个键值对之间用逗号分隔。

第三个如上。

2.5.2 键名

对象的所有键名都是字符串(ES6 又引入了 Symbol 值也可以作为键名),所以加不加引号都可以。但是如果不加引号就一定要注意取名要符合标识符规则。否则就会报错。

如果键名是数值,会被自动转为字符串。

image

2.5.3 表达式还是语句

对象采用大括号表示,这导致了一个问题:如果行首是一个大括号,它到底是表达式还是语句?

{ foo: 123 }

比如上述代码,可能就有两层意思,第一种可能是,这是一个表达式,表示一个包含foo属性的对象;第二种可能是,这是一个语句,表示一个代码区块,里面有一个标签foo,指向表达式123。

为了避免这种歧义,V8 引擎规定,如果行首是大括号,一律解释为对象。不过,为了避免歧义,最好在大括号前加上圆括号。

({ foo: 123})

这种差异在eval语句(作用是对字符串求值)中反映得最明显。

eval('{foo: 123}') // 123
eval('({foo: 123})') // {foo: 123}

上面代码中,如果没有圆括号,eval将其理解为一个代码块;加上圆括号以后,就理解成一个对象。

2.5.4 属性的读取

读取对象的属性,有两种方法,一种是使用点运算符,还有一种是使用方括号运算符。

var obj = {
  p: 'Hello World'};
// 以下两种读取方法
obj.p // "Hello World"
obj['p'] // "Hello World"

注:如果使用方括号运算符,键名必须放在引号里面,否则会被当作变量处理。

数值不需要放在引号里,因为会自动转换成字符串

var obj = {
  88: 'Hello World'
};

obj['88'] // "Hello World"
obj[88] // "Hello World"

注:数值键名不能使用点运算符(因为会被当成小数点),只能使用方括号运算符。

image

2.5.5 属性的赋值

点运算符和方括号运算符,不仅可以用来读取值,还可以用来赋值。

image

上图中,分别使用点运算符和方括号运算符,对属性赋值。再读取是成功的。

JavaScript 允许属性的“后绑定”,也就是说,你可以在任意时刻新增属性,没必要在定义对象的时候,就定义好属性。

var obj = { p: 1 };
// 等价于
var obj = {};
obj.p = 1;

2.5.6 属性的查看

查看一个对象本身的所有属性,可以使用Object.keys方法。

image

2.5.7 in:属性是否存在

image

存在就返回true,不存在就返回false.

2.5.8 delete

delete命令用于删除对象的属性,删除成功后返回true。

image

2.5.9遍历 for…in

for...in循环用来遍历一个对象的全部属性。

image

2.6 typeof 运算符

可以返回一个值的数据类型

image

至于typeof null会返回object,这主要是历史遗留原因造成的,1995年的JS 语言第一版只有5个类型(object ,整数,浮点数,string , boolean)当时没有考虑null,当做了object的特殊值,现在虽然独立了出来,为了兼容以前代码,typeof null依旧返回object。


360截图17290501463381.png

参考:阮一峰 侵删~

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

推荐阅读更多精彩内容