JS (三)数据类型

作者: 长鲸向南 | 来源:发表于2018-08-09 21:33 被阅读4次

    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

    参考:阮一峰 侵删~

    相关文章

      网友评论

        本文标题:JS (三)数据类型

        本文链接:https://www.haomeiwen.com/subject/ugfhbftx.html