# 1、数据类型概述(一)



# 1、概述

1.简介

JavaScript 共有六种数据类型(ES6 新增了第七种 Symbol 类型的值)

  • 数值(number): 正数和小数

  • 字符串(string): 文本

  • 布尔值(boolean): true | false

  • Undefined: 表示‘为定义’或不存在,因为没有定义所以,此处暂时没有任何值

  • null:表示空值,此刻的值是空。

  • 对象(object):各种值组成的集合。

    通常,数值、字符串、布尔值这三种,合成为原始类型的值,他们是最基本的数据类型,不能再细分了。对象称为合成类型的值,一个对象由多个原始数据类型的值合成,undefined 和 null 一般被看作两个特殊值。

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

    • 狭义的对象(object)
    • 数组(array)
    • 函数(function)--- 函数式编程:函数其实是处理数据的方法,但是 js 把它当作一种数据类型,可以复制给变量,为编程带来了很大的灵活性。

2.typeof 运算符

​ JavaScript 有三种方法,可以确定一个值到底是什么类型。

 - typeof运算符
 - instanceof运算符
 - Object.prototype.toString 方法.   配合call(thisArg) 或apply(thisArg)  使用

typeof 可以判断一个没有定义过的值,为 undefined

if (typeof v === "undefined") {
  // ...
}
 typeof null
 typeof {}
 typeof []
 typeof window
 以上判断都为object,区分对象和数组可以用instanceof // true || false
 或者 {}||[].constructor.toString() //"function Array() { [native code] }"
 或者 Object.prototype.toString.call([]||{})  // "[object Object]"

# 2、null, undefined 和布尔值

1.null, undefined

null 和 undefined 语法效果非常相似

var a = undefined;
// 或者
var a = null;

// 在if中会被自动转化为false,在相等运算符(==)下直接报告两者相等
undefined == null;
// true

// null 是可以转化成数字的, undefined强制转化数字时是NAN
Number(null); // 0
5 + null; // 5

undefined + 2; // NaN
Number(undefined); // NaN

常出现 undefined 的场景

1、 声明变量但未赋值
var i;
i // undefined

2、调用函数没有提供参数
function f(x){return x}
f() // undefined

3、对象没有赋值的属性
var o = new Object();
o.p // undefined

4、函数没有返回值时,没人返回undifined
function f(){}
f() // undefined

2.布尔值

代表真假两种状态

返回布尔的情况

  • 前置运算符:!(Not)
  • 相等运算符 === , !== , == , !=
  • 比较运算符 > , >= , < , <=

当值为 undefined、null、false、0、NaN、“” 或 ‘’ (空字符串)的时候,强制转化 Boolean 时为 false,其他为 true,包括“ ” , [] , {}

# 3、 数值

1. 整数和浮点数

在 Javascript 内部,所以数字都是以 64 为浮点数的形式储存的,整数也一样,所以 1 === 1.0 // true

所以在 js 中不存在 32 位的整数,很多情况会转化整数进行

由于浮点数不精准,要小心

0.1 + 0.2 === 0.3;
// false

0.3 /
  0.1(
    // 2.9999999999999996

    0.3 - 0.2
  ) ===
  0.2 - 0.1;
// false

2. 数值精度

Js 精度最多只能到 53 个二进制位,这意味着,绝对值小于 2 的 53 次方的整数,即-253 到 253,都可以精确表示。

Math.pow(2,53)  // 9007199254740992111
// 9007199254740992000
大于253次方后多出的有效数字会无法保存,变为0
  1. 数值的范围

根据标准,64 位浮点数的指数部分的长度是 11 个二进制位,意味着指数部分的最大值是 2047(2 的 11 次方减 1)。也就是说,64 位浮点数的指数部分的值最大为 2047,分出一半表示负数,则 JavaScript 能够表示的数值范围为 21024 到 2-1023(开区间),超出这个范围的数无法表示。

一个数如果大于 2 的 1024 次方,会发生‘正向溢出’,返回 Infinity。

Math.pow(2, 1024); // Infinity

如果一个数小于等于 2 的-1075 次方(指数部分最小值-1023,再加上小数部分的 52 位),那么就会发生为“负向溢出”,即 JavaScript 无法表示这么小的数,这时会直接返回 0。

Math, pow(2, -1075); // 0

3.特殊数字

0 分为+0 和 -0 ,在任何情况下都一样,除了做分母时有区别 +Infinity 和 -Infinity 的区别

1 / +0 === 1 / -0; // false

4. NaN

NaN 是 Javascript 的特殊值,表示非数字(Not a Number)

//主要出现在字符串解析成数字出错的情况下
5 - 'x'  // NaN

//NaN不是数据类型是特殊的数值,通过typeof可以看出'number'
0/0 也是NaN

// NaN不等于任何值,包括它本身。
NaN === NaN // false

// NaN与任何数运算都是NaN
NaN*32   // NaN

5. Infinity

Infinity 表示无穷,用来表示两种场景。一种是一个正的数值太大,或一个负的数值太小,无法表示;另一种是非 0 数值除以 0,得到Infinity

// 场景一
Math.pow(2, 1024);
// Infinity

// 场景二
0 / 0; // NaN
1 / 0; // Infinity

// Infinity有正负之分,Infinity表示正的无穷,-Infinity表示负的无穷。
1 / -0 - // -Infinity
  1 / 0; // Infinity

//Infinity大于任何值,-Infinity小于任何值。NaN除外

6. 数值相关全局方法

  • parselnt()

要么返回整数要么返回 NaN

// 用于将字符串编程整数
parselnt('123.1')  // 123

// 如果字符串头部有空格,空格会被自动去除。
parselnt('   123')    //123

// 如果parseInt的参数不是字符串,则会先转为字符串再转换。
parselnt('1.23')  => parselnt(1.23)   // 1

// 字符串转为整数的时候,是一个个字符依次转换,如果遇到不能转为数字的字符,就不再进行下去,返回已经转好的部分。
parseInt('10px') => 10
parseInt('8a') => 8
parseInt('12***e2') => 12

// 返回NaN的情况.如果字符串的第一个字符不能转化为数字(后面跟着数字的正负号除外),返回NaN
parseInt('abc')  // NaN
parseInt('')  // NaN
parseInt('+')  // NaN
parseInt('+1')  // 1
parseInt('.1')  // NaN

// parseInt 还有第二个参数,可以写进制2~36之间,超出NaN,默认10进制
parseInt('1000',10)  // 1000
  • parseFloat()
// 用于将字符串转化成浮点数
parseFloat("3.14asd"); // 3.14
Number("123"); // 123
// parseFloat的转换结果不同于Number函数。
parseFloat(true); // NaN
Number(true); // 1

parseFloat(null); // NaN
Number(null); // 0

parseFloat(""); // NaN
Number(""); // 0

parseFloat("123.45#"); // 123.45
Number("123.45#"); // NaN
  • isNaN()

用来判断方法是不是 NaN

isNaN(NaN || "string" || ["zxy"] || {}); // true
isNaN(123 || [] || [212] || ["123"]); // false
  • isFinite()

isFinite 返回一个布尔值,表示某值是否为正常的数值

isFinite(+Infinity || -Infinity); // false
isFinite(NaN); // false
isFinite(undefined); // false
isFinite(null); // true
isFinite(-1); // true

### 4、 字符串

1. 定义

字符串是零个或多个排在一起的字符,放在单引或双引号之中。

因为 html 很多属性是双引,所以 js 最好使用单引号。 单引号中使用单引好或者多行语句需要使用 \

'Did you say \'hello\'';
const longString =
  "Did \
 you \
 see"; // 'Did you see'

const longString = "Did" + "you" + "see"; // 'Did you see'

如果想输出多行字符串,有一种利用多行注释的变通方法。

(function() {
  /*
line 1
line 2
line 3
*/
}
  .toString()
  .split("\n")
  .slice(1, -1)
  .join("\n"));

// "line 1
// line 2
// line 3"

字符串可以被视为字符数组,因此可以使用数组的方括号运算符,用来返回某个位置的字符(位置编号从 0 开始)。

var s = 'hello';
s[0]  // 'h'
s[1]  // 'e'
s[3]  // 'l'
s[10]  // undefined
字符串与数组的相似性,和数组有区别
s[0] = 'k'   // 修改无效
delete s[0]  // 删除无效
s[5] = '!'   // 新增无效
s.length  // 5
s.length = 3  // 5  长度也是无法改变

使用 es6 的解构赋值操作

var s = 'hello'
// [...s]   =>   ["h", "e", "l", "l", "o"]
const [a,b,c] = [...s]
a = 'h'
b = 'e'
c = 'l'
[...s].reverse().join('') // 文字转化成数组倒叙排列成文字 'olleh'
[...s].sort(()=>Math.random()-0.5).join('')   // 文字转化成数组乱序排列成文字

因为字符串也是'类数组的对象',可以通过Array.prototype.slice.call(string)转化成数组。详细看数据类型二中的数组一节。


2020-02-26