今天看啥  ›  专栏  ›  热忱c

JS 里的数据类型

热忱c  · 掘金  ·  · 2019-06-07 15:02
阅读 21

JS 里的数据类型

概述

JavaScript语言的每一个值,都属于一种数据类型,共有七种:numberstringbooleansymbol(ES6新增)、undefinednullobject。 注意没有 array 类型也没有 function 类型。

一、number

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

二、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)
复制代码

上面这些字符前面加上反斜杠,都表示特殊含义。如果在非特殊字符前面使用反斜杠,则反斜杠会被省略。如果字符串的正常内容之中,需要包含反斜杠,则反斜杠前面需要加一个反斜杠,用来对自身转义。

三、boolean

  • boolean 的取值只有两个值:truefalse

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

undefined
null
false
0
NaN
""''(空字符串,引号之间没有空格)
复制代码
  • a && bab 都为 true 时,取值为 true;否则为 false
  • a || bab 都为 false 时,取值为 false;否则为 true

四、symbol

Symbol 是ES6引入的一种新原始数据类型,表示独一无二的值。

Symbol 值通过 Symbol 函数生成。这就是说,对象的属性名现在可以有两种类型,一种是原来就有的字符串,另一种就是新增的 Symbol 类型。凡是属性名属于 Symbol 类型,就都是独一无二的,可以保证不会与其他属性名产生冲突。

五、undefined 和 null

nullundefined 都可以表示“没有”,含义非常相似。将一个变量赋值为 undefinednull ,语法效果几乎没区别。

if 语句中,它们都会自动转为 false,相等运算符 == 甚至直接报告两者相等。

    undefined == null  //true
复制代码

都表示没有值,至于 JS 为什么有两个表示「没有值」的东西:

1995年JavaScript诞生时,最初像Java一样,只设置了null作为表示"无"的值。根据C语言的传统,null被设计成可以自动转为0。但是,JavaScript的设计者Brendan Eich,觉得这样做还不够,有两个原因。首先,null像在Java里一样,被当成一个对象。但是,JavaScript的数据类型分成原始类型和合成类型两大类,Brendan Eich觉得表示"无"的值最好不是对象。其次,JavaScript的最初版本没有包括错误处理机制,发生数据类型不匹配时,往往是自动转换类型或者默默地失败。Brendan Eich觉得,如果null自动转为0,很不容易发现错误。因此,Brendan Eich又设计了一个undefined。

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

六、object

  • object 就是上面几种基本类型(无序地)组合在一起;
  • object 里面可以有 object
  var person = {
      name: 'aaa', 
      'child': {
          name: 'bbb'
      }, // 最后这个逗号可有可无
  }
复制代码
  • objectkey 一律是字符串,不存在其他类型的 key;
  • object[''] 是合法的;
  • object['key'] 可以写作 object.key;
  • 注意 object.keyobject[key] 不同;
  • delete object['key'](delete命令用于删除对象的属性);
  • 'key' in object(in运算符用于检查对象是否包含某个属性,注意检查的是键名,不是键值);

七、type of 操作符

  • 数值、字符串、布尔值分别返回字符串 numberstringboolean
    typeof 123    //"number"
    typeof '你好'  //"string"
    typeof true  //"boolean"
复制代码
  • 函数返回字符串 function
    function f() {}
    typeof f   //"function"
复制代码
  • undefined undefined 返回字符串 'undefined'
    typeof undefined   //"undefined"
复制代码

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

    v    //ReferenceError: v is not defined
    typeof v    //"undefined"
复制代码

上面代码中,变量 v 没有用 var 命令声明,直接使用就会报错。但是,放在 typeof 后面,就不报错了,而是返回 undefined。 实际编程中,这个特点通常用在判断语句:

    // 错误的写法
    if (v) { // ...}    //ReferenceError: v is not defined
    // 正确的写法
    if (typeof v === "undefined") { // ...}
复制代码
  • 其他 除此以外,其他情况都返回 object
    typeof window    //"object"
    typeof {}        //"object"
    typeof []        //"object"  数组本质上只是一种特殊的对象
    typeof null      //"object"
复制代码

这里 null 的类型也是 object,这是由于历史原因造成的。为了兼容以前的代码,后来就没法修改了。这并不是说 null 就属于对象,本质上 null 是一个类似于 undefined 的特殊值。




原文地址:访问原文地址
快照地址: 访问文章快照