JS数据类型

112 阅读7分钟

数据类型分类

ES6 之前, JavaScript 的数据类型,共有六种。在之后, ES6 新增了第七种数据类型: Symbol。

Number

JavaScript中的数字型可以用来保存整数浮点数(小数)

var age = 18
var pi = 3.14

科学计数法的格式

  • ECMAScript中科学计数法的格式是:数值(整数或者浮点数)后跟一个大写或者小写的字母e,再加上要乘的10的多少次幂
  • eg:3.125e7== 31250000

常见的进制

  • 八进制:在数字开头加上0,八进制由0~7组成,逢八进位
  • 十进制数:是组成以10为基础的数字系统,有0~9组成,逢10进位
  • 十六进制数:在数字开头加上0x,十六进制数由0-9,a-f组成

数字型的范围:

  • 最大值:Number.MAX_VALUE ,输出结果:1.7976931348623157e+308
  • 最小值:Number.MIN_VALUE,输出结果:5e-324

数字型的特殊值:

  • Infinity(无穷大): 如 Number.MAX_VALUE*2
  • Infinity(无穷小) :如-Number.MAX_VALUE*2
  • NaN(非数值): 如’abc’ – 100
  • isNaN():判断一个’参数’是否为非数字的类型,返回值为true表示非数字,false表示是数字

String

字符串是指计算机中用于表示文本的一系列字符,在JavaScript中使用单引号双引号来包裹字符串。

var str1='单引号字符串';
var str2="双引号字符串";

单双引号嵌套

  • 在单引号字符串中可以直接书写双引号
  • 在双引号字符串中也可以直接书写单引号

字符串的特点:ECMAScript中的字符串是不可变的,意思是一旦创建,值就不能够改变。

转义字符

模版字符串:

let m = `first line
second line`;
console.log(m);

//first line
//second line

字符串插值

  • 模板字面量最常用的特性是进行字符串插值,用过使用${}和模板字符串配合。
  • 所有插入的值都会使用toString()强制转换为字符串。
let value = 5;
let m = 'second';
let n = `${value} + ${m}`;
console.log(n);

//5 + second 

字符串长度

  • 字符的数量就是字符串的长度。
  • 通过字符串的length属性可以获取整个字符串的长度。

访问字符串

  • 字符串可以使用“[index]”语法按照index(索引)访问字符
  • index从0开始,一直到字符串的长度减1
  • 如果超过了index最大值,会返回undefined。
var str = 'I\'m a programmer';
console.log(str[0]);     // 输出结果:I
console.log(str[1]);     // 输出结果:'
console.log(str[15]);   // 输出结果:r
console.log(str[16]);   // 输出结果:undefined

字符串拼接

  • 多个字符串之间可以使用“+”进行拼接
  • 如果数据类型不同,拼接前会把其他类型转成字符串,再拼接成一个新的字符串。

Boolean

布尔型通常用于逻辑判断,它有两个值:truefalse ,表示事物的“真”和“假”。

console.log(true);		// 输出结果:true
console.log(false);	// 输出结果:false
console.log(true + 1);	// true会转换成1 输出结果:2
console.log(false + 1);	// false会转换成0 输出结果:1

undefined

  1. Undefined类型只有一个值,就是特殊值undefined。
  2. 当使用var或let声明了变量但没有进行初始化时,变量的值为undefined。
let message;
console.log(message == undefined);  // true

// 等同于下面的例子
let message = undefined;
console.log(message == undefined);  // true
  1. 不必显示的将变量的值定义为undefined
  2. 增加undefined的作用:明确空对象指针(null)和未初始化变量的区别
  3. 使用typeof进行检测时出现undefined的两种情况:
    未声明
    声明未进行初始化
let message;
console.log(typeof message);    // undefined
console.log(typeof age);    // undefined

null

NULL类型只有一个值,就是null。

null值表示一个空指针对象。

在定义的要保持对象的变量值时,建议使用null进行初始化。

虽然console.log(undefined==null)为true,但两者有本质区别,undefined由null派生而来。

永远不必显式地将变量值设置为undefined。但任何时候,只要变量要保存对象,当时没有对象可保存时,就要用null来填充变量。

Object

对象是一组键值对组成的无序的集合,用{}表示,键值对之间用逗号分隔。

var myObj = {
    isObj = true,
    num: [1,2,3],
    desp: '对象好像什么都可以包含'
}

键均为字符串类型,值可以是任意数字类型。

获取一个对象的属性可用"对象名.属性(键名)的方式"。

ES6允许将表达式作为对象的属性名,即把表达式放在方括号内。

let numproperty = 'num';
var myObj1 = {
    [numproperty]: [1,2,3],
    ['des'+'cription']: '我是一个对象'
};

Symbol类型

数据类型检测

typeof

基础(原始)类型:

typeof 1 === "number" // true
typeof "a" === "string" // true
typeof true === "boolean" // true
typeof undefined === "undefined" // true
typeof Symbol() === "symbol" // true

引用类型:

typeof null === "object" // true
typeof {} === "object" // true
typeof [] === "object" // true
typeof function () {} === "function" // true

instanceof

判断是否出现在该类型原型链中的任何位置。
一般判断一个变量是否属于某个对象的实例

console.log(null instanceof Object) // false
console.log({} instanceof Object) // true
console.log([] instanceof Object) // true
console.log(function(){} instanceof Object) // true

Object.prototype.toString

let toString = Object.prototype.toString

console.log(toString.call(1)) // [object Number]
console.log(toString.call('1')) // [object String]
console.log(toString.call(true)) // [object Boolean]
console.log(toString.call(undefined)) // [object Undefined]
console.log(toString.call(null)) // [object Null]
console.log(toString.call({})) // [object Object]
console.log(toString.call([])) // [object Array]
console.log(toString.call(function(){})) // [object Function]
console.log(toString.call(new Date)) // [object Date]

数据类型转换

转换为String

  • 利用“+”拼接字符串(最常用的一种方式)
  • 利用toString()转换成字符串,用于数值、布尔值、字符串值,null和undefined无法使用toSting()方式进行转换
  • 利用String()转换成字符串

转换为Number

  • 使用parseInt()将字符串转为整数,可以接收两个参数,第二个参数可是是要转换的进制数
  • 使用parseFloat()将字符串转为浮点数
  • 使用Number()将字符串转为数字型
  • 利用算术运算符(-、*、/)隐式转换

Number()

数据类型转换之后
布尔值true转换为1,false转换为0。
数值直接返回原数值
undefined返回NaN。
字符串如果字符串包含有效的浮点值格式eg'1.1',则会转换为相应的浮点值,忽略前面的零。
如果字符串包含有效的十六进制格式eg'0xf',则会转换为该十六进制值对应的十进制整数值。
如果是空字符串(不包含字符),则返回0。
如果字符串包含除上述情况之外的其他字符,则返回NaN。
对象调用valueOf()方法,并按照上述规则转换返回的值。
如果转换结果是NaN,则调用toString()方法,再按照转换字符串的规则转换。
let num1 = Number('Hello World!');  //NaN
let num2 = Number('');  //0
let num3 = Number('000011');    //11
let num4 = Number(true);    //1

parseInt(待转换值,进制数)

考虑到Number()函数转换字符串相对复杂且有点反常规,通常在需要得到整数时可以优先使用parseInt()函数。

parseInt()函数更专注于字符串是否包含数值模式。

  • 字符串最前面的空格会被忽略,从第一个非空格字符开始转换。
  • 如果第一个字符不是数值字符、加号或者减号,parseInt()立即返回NaN。空字符串也会返回NaN,但Number()返回0。
  • 如果第一个字符是数值字符、加号或者减号,则继续依次检测每个字符,直到字符串末尾,或碰到非数值字符。 eg:"1234blue"会被转换为1234 "22.5"会被转换为22。

parseInt()函数也能识别不同的整数格式。如果字符串以"0x"开头,就会被解释为十六进制整数。

parseInt()也接受第二个参数,用于指定底数(进制数)。 如果要解析的值是十六进制,可以传入16作为第二个参数。

parseFloat(带转换值)

parseFloat()函数的工作方式跟 parseInt()函数类似,都是从位置 0 开始检测每个字符。 同样,它也是解析到字符串末尾或者解析到一个无效的浮点数值字符为止。这意味着第一次出现的小数点是有效的,但第二次出现的小数点就无效了,此时字符串的剩余字符都会被忽略。因此,"22.34.5"将转换成 22.34。

转换为Boolean

  • 转换为布尔型使用Boolean()
  • 在转换时,代表空、否定的值会被转换为false
  • 除空字符串、0、NaN、null和undefined之外,其余的值转换为true。