# 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
大于2的53次方后多出的有效数字会无法保存,变为0
- 数值的范围
根据标准,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
← Js-Gulid 2、数据类型概述(二) →