数据类型
数据类型
基础类型存储在栈内存,被引用或拷贝时,会创建一个完全相等的变量
引用类型存储在堆内存,存储的是地址,多个引用指向同一个地址,这里会涉及一个“共享”的概念
基本数据类型
数值(number)
字符串(string)
布尔值(boolean)
undefined
null
symbol
bigInt
引用数据类型
对象(Object)
正则(RegExp)
数组(Array)
函数(Function)
日期(Date)
数学工具库(Math)
首先明确一个点 原始类型中存储的都是对应的数值 是没有方法可以调用的 比如 undefined.toString()
但是你顺着这个思路 如果去调用 ‘1’.toString() 你会发现调用成功了
因为这种情况下 ‘1’已经被强转成了 String 类型 所以可以调用 toString 方法
number
js 内部,所有数字都是以 64 位浮点数形式储存,所以 1 === 1.0 为 true 即 1 和 1.0 是同一个数
常用方法
parseInt
parseFloat
isNaN
isFinite
isInteger
常用属性
EPSILON
const a = 0.4;
const b = 0.1;
const c = 0.3;
console.log(a - b === c); // false
console.log(Math.abs(a - b - c) < Number.EPSILON); // true
特殊数值
NaN (not a number)
+0 / -0
Infinite
本质上还是 number
string
无法改变字符串之中的单个字符
const username = chou;
username[0] = 'z';
//username还是chou
常用方法
charAt
返回指定索引的字符
如果指定的 index 值超出了该范围,则返回一个空字符串
slice
split
trim / trimStart / trimEnd
删除字符串两侧的空白 多用于 input 去除用户输入的空格
includes
endsWith / startsWith
concat
indexOf
返回第一次出现的索引值 未找到返回-1
padStart / pafEnd
填充字符串达到指定长度
'123'.padEnd('5', 0); //12300
'123'.padStart('5', 0); //00123
repeat
'1'.repeat(5); //11111
toLowerCase / toUpperCase
boolean
原始值
转换目标
结果
number
boolean
除了 -0 +0 NaN 都是 true
string
boolean
除了 空串 都是 true
undefined / null
boolean
false
引用类型
boolean
true
object
对象就是一组键值对(key - value)的集合
对象的键会转换为 string 类型
对象是引用类型
具体可以参考 https://luckychou.gitee.io/FE/JS/object/
function
函数是一等公民
由于函数与其他数据类型地位平等,所以在 js 中又称函数为第一公民
具体可以参考 https://luckychou.gitee.io/FE/JS/function/
array
数组是一种特殊的对象
具体可以参考 https://luckychou.gitee.io/FE/JS/array/
undefined
对象没有这个属性名,属性值默认就是 undefined
函数定义形参不传值,默认就是 undefined
在数组的 find 方法中,没有找到的情况下是 undefined
函数定义没有返回值(return 或者 return 后面什么也不带),默认的返回值就是 undefined
在变量提升(预解析)阶段,只声明未定义,默认值就是 undefined
在 JS 的严格模式下(”use strict”),没有明确的主体,this 指的就是 undefined
null
typeof null; // object
确定数据类型
typeof
instanceof
Object.prototype.toString
typeof
作用于基础数据类型时 除了 null 会返回 object 其他都返回正确的数据类型
作用于引用数据类型时 除了 function 会返回正确的数据类型时 其他都返回 object
const _undefined = undefined;
const _null = null;
const _number = 1;
const _string = 'chou';
const _boolean = true;
const _bigint = 1n;
const _symbol = Symbol();
const _regexp = new RegExp('/w/g');
const _date = new Date();
const _function = function () {};
const _array = [];
console.log(typeof _undefined);
console.log(typeof _null); // 返回object
console.log(typeof _number);
console.log(typeof _string);
console.log(typeof _boolean);
console.log(typeof _bigint);
console.log(typeof _symbol);
console.log(typeof _regexp);
console.log(typeof _date);
console.log(typeof _function); // 返回function
console.log(typeof _array);
instanceof
通过 instanceof 我们能判断这个对象是否是之前那个构造函数生成的对象
const _regexp = new RegExp('/w/g');
const _date = new Date();
const _function = function () {};
const _array = [];
console.log(_regexp instanceof RegExp); // true
console.log(_date instanceof Date); // true
console.log(_function instanceof Function); // true
console.log(_array instanceof Array); // true
此外 number/boolean/string 也可以用它们的构造函数来创建
Object.prototype.toString
可见 上述两种方法都无法准确判断出每一种数据类型 那么有没有一种方法可以判断出所有的数据类型呢
答案就是Object.prototype.toString
例如
console.log(Object.prototype.toString.call(undefined)); // [object,Undefined]
我们可以得到一个[object,xxx]的字符串 []中的后者就是我们想要的每一种数据类型
我们稍微包装一下方法
function getDataType(type) {
return Object.prototype.toString.call(type).slice(8, -1);
}
特殊类型比较
var str1 = '1';
var str2 = new String('1');
console.log(str1 == str2); // true
console.log(str1 === str2); // false
console.log(null == null); // true
console.log(null === null); // true
console.log(undefined == undefined); // true
console.log(undefined === undefined); // true
console.log(NaN == NaN); // false
console.log(NaN === NaN); // false
console.log(/a/ == /a/); // false
console.log(/a/ === /a/); // false
console.log({} == {}); // false
console.log({} === {}); // false
console.log([] == []); // false
console.log([] === []); // false
Symbol
Symbol 是一种原始数据类型 表示独一无二的值
const symbol1 = Symbol();
const symbol2 = Symbol();
console.log(symbol1 === symbol2); // false
BigInt
BigInt 可以表示任意大的整数
BigInt 和 Number 不能混合运算
四组运算
在进行四则运算的时候 都会转成基础数据类型再进行运算
加法运算符
运算中其中一方为字符串,那么就会把另一方也转换为字符串
如果一方不是字符串或者数字,那么会将它转换为数字或者字符串
1 + '1'; // '11'
true + true; // 2
4 + [1, 2, 3]; // "41,2,3"
'a' + +'b'; // "aNaN"
除了加法运算符 只要其中一方是数字,那么另一方就会被转为数字
Last updated
Was this helpful?