javascript数据类型详解
浏览:43
评论:0
JavaScript 中的数据类型可以分为两大类:基本数据类型(也称为原始数据类型)和引用数据类型。 最新的 ECMAScript 标准定义了 8 种数据类型
基本数据类型(值类型)
1.String(字符串)
表示文本数据,使用单引号 ' 或双引号 " 来包裹。
let name = 'Alice'; // "Alice"
模板字符串:
- 语法是使用反引号(`)括起来,而不是双引号(")或单引号(')
- 可以包含占位符——一种由美元符号和大括号分隔的嵌入式表达式:${expression}
- 还可以把字符串和占位符被传递给一个函数(要么是默认函数,要么是自定义函数)
// 基本语法
let str = `123`; // 123
// 定义占位符
let str1 = `123 - ${str}`; // 123 - 123
// 自定义函数
function myTag(strings, personExp, ageExp) {
const str0 = strings[0]; // "That "
const str1 = strings[1]; // " is a "
const str2 = strings[2]; // "."
const ageStr = ageExp > 99 ? "centenarian" : "youngster";
// 我们甚至可以返回使用模板字面量构建的字符串
return `${str0}${personExp}${str1}${ageStr}${str2}`;
}
const person = "Mike";
const age = 28;
const output = myTag`That ${person} is a ${age}.`;
console.log(output); // That Mike is a youngster.
2.Number(数字)
包括整数和浮点数,以及其他特殊数值如Infinity、-Infinity和NaN。
let age = 30;
let pi = 3.14;
当一个算术运算的结果超过了JavaScript能够表示的最大数值(Number.MAX_VALUE)时,结果会被设置为 Infinity 当除数为零且被除数为正数时,除法运算的结果也会是 Infinity 使用 isFinite() 函数检测一个数值是否为有限数值时,返回布尔值
let result = 1 / 0; // 结果为 Infinity
let veryLargeNumber = Number.MAX_VALUE;
let result = veryLargeNumber * 2; // 结果为 Infinity
console.log(isFinite(Infinity)); // 输出:false
反过来,当一个算数运算的结果超过了JavaScript能够表示的最小数值(-Number.MAX_VALUE)时,结果会被设置为 -Infinity 当除数为零且被除数为负数时,除法运算的结果也会是 -Infinity 使用 isFinite() 函数检测一个数值是否为有限数值时,返回布尔值
let result = -1 / 0; // 结果为 -Infinity
let veryLargeNumber = -Number.MAX_VALUE;
let result = veryLargeNumber * 2; // 结果为 Infinity
console.log(isFinite(-Infinity)); // 输出:false
NaN 是 JavaScript 中的一个特殊值,全称为 Not-a-Number,表示一个非数字值。它表示一个本来应该返回数值的操作未能返回有效的数字结果。 NaN 不等于自身 isNaN() 函数判断一个值是否为 NaN
console.log(0 / 0); // 输出:NaN
console.log(Math.sqrt(-1)); // 输出:NaN
console.log(NaN === NaN); // 输出:false
console.log(isNaN(NaN)); // 输出:true
console.log(isNaN("hello")); // 输出:true
3.Boolean(布尔型)
只有两个可能的值 true 和 false
let isStudent = true; // false
4.Null(空)
表示一个特殊的空对象指针,仅有一个值 null 空值表示一个变量没有值,或者一个对象不包含任何属性。
let age = null; // 显式赋值为 null,表示空值
// 判断是否为null
if (age === null) {
console.log('The value is null');
}
// 空值合并运算符 判断是否为 null 或 undefined
let result = age ?? 'default value';
5.Undefined(未定义)
undefined 表示变量未赋值时的属性
let myVar; // 声明了变量 myVar,但没有赋值
console.log(myVar); // 输出:undefined
const obj = {};
console.log(obj.nonExistentProperty); // 输出:undefined,因为该属性在
function getUndefined() {
// 没有 return 语句
}
console.log(getUndefined()); // 输出:undefined
6.Symbol(符号)
每次调用 Symbol() 函数都会生成一个全新的、独一无二的 Symbol 值。 一旦创建,Symbol 的值就不能改变。 Symbol 类型的属性默认是不可枚举的,这意味着它们不会出现在 for...in 循环或 Object.keys() 等方法的结果中。 Symbol 属性不会出现在 Object.prototype.toString.call(obj) 的输出中,即不会显示为 [object Object] 字符串的一部分。
let symbolExample = Symbol("123"); // 可选的描述性字符串,仅用于调试目的
console.log(symbolExample); // 输出:Symbol(123)
console.log(symbolExample === Symbol("123")); // 输出:false
7.BigInt(大整数)
BigInt 可以安全地存储和操作任意大小的整数,没有精度损失。 BigInt 和 Number 是两种不同的数据类型,它们之间不能直接进行数学运算。例如,BigInt 不能与 Number 直接相加或比较,必须先将其中一个转换为相同类型。
let bigIntA = 123456789012345678901234567890n;
let bigIntB = 98765432109876543210n;
// BigInt 运算
let sum = bigIntA + bigIntB; // 结果是一个 BigInt 类型
console.log(sum);
// 类型转换
let number = BigInt(12345) + 1n; // 报错,因为左侧是 BigInt,右侧是 Number
let safeSum = BigInt(12345) + BigInt(1); // 正确转换并计算
// 转换为 BigInt
let convertedBigInt = BigInt("123456789012345678901234567890");
引用数据类型
8.Object(对象)
在 JavaScript 中,Object 是一种复杂的数据类型,它用于表示一组数据和它们相关的操作。每个 JavaScript 对象都是基于
Object
构造函数创建的,因此所有对象都继承自Object.prototype
。
// 要实现一个变量即等于1又等于2还可以等于3,可以使用对象
let obj = {
num: 1,
toString() {
return this.num + 1;
}
}
if(obj == 1 && obj == 2 && obj == 3) {
console.log('obj 等于 1,2,3');
}
// 对象Symbol.toPrimitive
let a1 = {
i: 0
}
a1[Symbol.toPrimitive] = function () {
return ++this.i;
}
if (a1 == 1 && a1 == 2 && a1 == 3) {
console.log('OK');
}
// 数组
let a2 = [1, 2, 3];
a2.toString = a2.shift;
if (a2 == 1 && a2 == 2 && a2 == 3) {
console.log('OK');
}
// 数据劫持
var i = 0;
Object.defineProperty(window, 'a3', {
get () {
// 获取window.a的时候触发getter函数
return ++i;
},
set (value) {
// 设置window.a属性值的时候触发setter函数
}
})
if (a3 == 1 && a3 == 2 && a3 == 3) {
console.log('OK');
}