JS里的数据类型

220 阅读4分钟

1. 概述

JavaScript一共有7种数据类型:

  • 数值(number):整数和小数
  • 字符串(string):文本(比如Hello World)。
  • 布尔值(boolean):表示真伪的两个特殊值,即true(真)和false(假)
  • undefined:表示“未定义”或不存在,即由于目前没有定义,所以此处暂时没有任何值
  • null:表示空值,即此处的值为空。
  • 对象(object):各种值组成的集合。
  • 符号(symbol):ES6新增。暂不讨论。

一般将number,string,boolean视为原始类型(primitive type)的值,对象则称为合成类型(complex type)的值,undefined和null为JS特有的特殊的值。

对象又可以分为三个子类型:

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

需要注意的是array和function并不是七种类型之一。

2. 数值

  1. 所有数字都是以64位浮点数形式储存(很浪费)
  2. 小数运算不精确
0.1 + 0.2
0.30000000000000004
  1. JavaScript的精度范围为-253到253 ,能够表示的数值范围为21024到2-1023
  2. 数值的进制:开头有0要小心
    1. 十进制:没有前导0的数值。
    2. 八进制:有前缀0o0O的数值,或者有前导0、且只用到0-7的八个阿拉伯数字的数值。
    3. 十六进制:有前缀0x0X的数值。
    4. 二进制:有前缀0b0B的数值。
0xff // 255
0o377 // 255
0b11 // 3
  1. 特殊数字
    1. NaN:Not a Number
    2. +Infinity-Infinity

3. 字符串

  1. JavaScript 不仅以 Unicode 储存字符,还允许直接在程序中使用 Unicode 码点表示字符,即将字符写成\uxxxx。但 JavaScript 对 UTF-16 的支持是不完整的,只编到U+FFFF
  2. 空字符串:''
  3. 多行字符串
var a = '123' +
'456';
var a = `123
456`;
  1. 转义符
\n :换行符(\u000A)
\r :回车键(\u000D)
\' :单引号(\u0027)
\" :双引号(\u0022)
\\ :反斜杠(\u005C)
\0 :null(\u0000)
\b :后退键(\u0008)
\f :换页符(\u000C)
\t :制表符(\u0009)
\v :垂直制表符(\u000B)
  1. Base64 转码
    • btoa():任意值转为 Base64 编码
    • atob():Base64 编码转为原来的值
    • 要将非 ASCII 码字符转为 Base64 编码,必须中间插入一个转码环节,再使用这两个方法

4. 布尔值

  1. 布尔值代表“真”和“假”两个状态。“真”用关键字true表示,“假”用关键字false表示。布尔值只有这两个值。
  2. 运算符号
前置逻辑运算符:! (Not)
相等运算符:===,!==,==,!=
比较运算符:>,>=,<,<=
  1. 以下6个值转化为Boolean时为false,称为falsy(虚值)。undefined null false 0 NaN ""或''(空字符串)

5. null 和 undefined

  1. 都表示没有值,null表示空值,即该处的值现在为空。undefined表示“未定义”。
undefined == null    // true
  1. (习俗)如果你想表示一个还没赋值的对象,就用null。如果你想表示一个还没赋值的字符串/数字/布尔/symbol,就用 undefined(但是实际上你直接var xxx一下就行了,不用写var xxx = undefined

6. 对象

  1. 对象就是一组“键值对”(key-value)的集合,是就是几种基本数据类型(无序地)组合在一起。
  2. 因此对象里面也可以有对象
  3. key必须为字符串,不符合标识符条件必须加引号(更多人不喜欢加)。
  4. 属性读取:有两种方法,一种是使用点运算符,还有一种是使用方括号运算符
    1. 符合标识符规则时,object['key']可以写作object.key
    2. 如果使用方括号运算符,键名必须放在引号里面,否则会被当作变量处理。注意object['key']object[key]区别
  5. 属性删除:delete object['key']
    1. 查询该属性值为undefined,此时key也删掉了,用in查为false
    2. 如果给key赋值undefined,用in查为true
  6. 属性查看:Object.keys
  7. 属性是否存在:用in运算符,自身和继承的都能看到。
var obj = { p: 1 };
'p' in obj  // true
'toString' in obj   // true
  1. 属性遍历:for...in
    1. 它遍历的是对象所有可遍历(enumerable)的属性,会跳过不可遍历的属性。
    2. 它不仅遍历对象自身的属性,还遍历继承的属性。

7. typeof 运算符

typeof可以用来判断数据类型,但是存在两个bug:

  • typeof null //'object'
  • 并没有function数据类型,但会显示
function f() {}
typeof      // "function"

8. Symbol

详见:JS 中的 Symbol 是什么?

9. 参考资料

JavaScript教程——阮一峰