为了账号安全,请及时绑定邮箱和手机立即绑定

JS (三)数据类型

标签:
JavaScript

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)  // InfinityMath.pow(2,-1075) // 0

2.1.4 数值的表示

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

  • 二进制:0b 或0B 为前缀的数值

  • 八进制:有前缀 0o 或 0O 的数值,或者有前导0、且只用到0-7的八个阿拉伯数字的数值。

  • 十进制:没有前导0的数值

  • 十六进制:前缀为 0x 或 0X 的数值

  • 科学计数法:允许字母e或E后面跟一个整数表示数值的指数部分

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

0b11 // 30o377 // 2550xff // 255// 科学计数法123e3 //123000123e-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'"// 以上均是合法的表达

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

webp

image

所以有3种方式

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

webp

image

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

webp

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 码点。

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

webp

image

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

webp

image

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

webp

image

2.2.3 字符串与数组

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

webp

image

2.2.4 length

length返回字符串的长度

webp

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 typevar name = 'cxy'var age = 18var gender = 'female'// 以下是对象,合成类型complex typevar 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 值也可以作为键名),所以加不加引号都可以。但是如果不加引号就一定要注意取名要符合标识符规则。否则就会报错。

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

webp

image

2.5.3 表达式还是语句

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

{ foo: 123 }

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

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

({ foo: 123})

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

eval('{foo: 123}') // 123eval('({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"



作者:饥人谷_陈杨
链接:https://www.jianshu.com/p/581c44e11d71


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消