您现在的位置是:网站首页 > 数据类型(Number, String, Boolean, Null, Undefined, Object)文章详情
数据类型(Number, String, Boolean, Null, Undefined, Object)
陈川
【
JavaScript
】
23797人已围观
4633字
JavaScript中有六种基本数据类型和一种复杂数据类型。这些数据类型决定了变量可以存储什么类型的值以及如何操作这些值。
Number
Number类型用于表示整数和浮点数。JavaScript中的所有数字都是64位浮点数,遵循IEEE 754标准。
javascript
let integer = 42; // 整数
let float = 3.14; // 浮点数
let scientific = 5e3; // 科学计数法,等于5000
let hex = 0xff; // 十六进制,等于255
let octal = 0o10; // 八进制,等于8
let binary = 0b1010; // 二进制,等于10
特殊数值:
javascript
let infinity = Infinity; // 无穷大
let negativeInfinity = -Infinity; // 负无穷大
let notANumber = NaN; // 非数字
Number类型有一些有用的方法:
javascript
let num = 123.456;
num.toFixed(2); // "123.46" - 保留两位小数
num.toPrecision(4); // "123.5" - 保留4位有效数字
num.toString(16); // "7b.74bc6a7ef9dc" - 转换为16进制字符串
String
String类型表示文本数据,可以使用单引号、双引号或反引号创建。
javascript
let single = '单引号字符串';
let double = "双引号字符串";
let backtick = `反引号字符串`;
字符串插值:
javascript
let name = "Alice";
let greeting = `Hello, ${name}!`; // "Hello, Alice!"
字符串方法:
javascript
let str = "JavaScript";
str.length; // 10 - 字符串长度
str.charAt(4); // "S" - 获取第5个字符
str.includes("Script"); // true - 检查是否包含子串
str.indexOf("a"); // 1 - 查找字符位置
str.slice(0, 4); // "Java" - 截取子串
str.toUpperCase(); // "JAVASCRIPT" - 转为大写
Boolean
Boolean类型只有两个值:true和false,用于逻辑运算。
javascript
let isTrue = true;
let isFalse = false;
逻辑运算:
javascript
true && false; // false - 逻辑与
true || false; // true - 逻辑或
!true; // false - 逻辑非
自动类型转换:
javascript
Boolean("hello"); // true
Boolean(""); // false
Boolean(0); // false
Boolean(1); // true
Boolean(null); // false
Boolean(undefined); // false
Boolean({}); // true
Null
Null类型只有一个值:null,表示"无"或"空"的引用。
javascript
let empty = null;
null是一个表示"无"的特殊值,typeof null返回"object"是JavaScript的一个历史遗留bug:
javascript
typeof null; // "object"
Undefined
Undefined类型表示未定义的值,是变量声明但未赋值时的默认值。
javascript
let x;
console.log(x); // undefined
undefined与null的区别:
javascript
undefined == null; // true
undefined === null; // false
Object
Object是JavaScript中唯一的复杂数据类型,用于存储键值对集合。
创建对象:
javascript
let person = {
name: "Alice",
age: 25,
greet: function() {
console.log(`Hello, my name is ${this.name}`);
}
};
访问属性:
javascript
person.name; // "Alice" - 点表示法
person["age"]; // 25 - 方括号表示法
person.greet(); // 调用方法
对象方法:
javascript
Object.keys(person); // ["name", "age", "greet"] - 获取所有键
Object.values(person); // ["Alice", 25, function] - 获取所有值
Object.entries(person); // [["name", "Alice"], ["age", 25], ["greet", function]] - 获取键值对数组
数组也是特殊的对象:
javascript
let colors = ["red", "green", "blue"];
typeof colors; // "object"
colors.length; // 3
colors[1]; // "green"
函数也是对象:
javascript
function sayHello() {
console.log("Hello");
}
typeof sayHello; // "function"
sayHello.name; // "sayHello"
类型检测
检测数据类型的方法:
javascript
typeof 42; // "number"
typeof "hello"; // "string"
typeof true; // "boolean"
typeof undefined; // "undefined"
typeof null; // "object" (历史遗留问题)
typeof {}; // "object"
typeof []; // "object"
typeof function(){}; // "function"
// 更精确的类型检测
Array.isArray([]); // true
Object.prototype.toString.call(null); // "[object Null]"
类型转换
JavaScript是弱类型语言,会自动进行类型转换。
字符串转换:
javascript
String(123); // "123"
String(true); // "true"
String(null); // "null"
String(undefined); // "undefined"
String({}); // "[object Object]"
数字转换:
javascript
Number("123"); // 123
Number("123abc"); // NaN
Number(true); // 1
Number(false); // 0
Number(null); // 0
Number(undefined); // NaN
布尔转换:
javascript
Boolean(0); // false
Boolean(1); // true
Boolean(""); // false
Boolean("hello"); // true
Boolean(null); // false
Boolean(undefined); // false
Boolean({}); // true
原始值与引用值
原始值(Number, String, Boolean, Null, Undefined)是按值访问的:
javascript
let a = 10;
let b = a;
a = 20;
console.log(b); // 10 - b不受a改变的影响
对象是引用类型,按引用访问:
javascript
let obj1 = { value: 10 };
let obj2 = obj1;
obj1.value = 20;
console.log(obj2.value); // 20 - obj2和obj1引用同一个对象
深拷贝与浅拷贝
浅拷贝只复制一层属性:
javascript
let original = { a: 1, b: { c: 2 } };
let shallowCopy = Object.assign({}, original);
original.b.c = 3;
console.log(shallowCopy.b.c); // 3 - 嵌套对象被共享
深拷贝复制所有层级:
javascript
function deepCopy(obj) {
return JSON.parse(JSON.stringify(obj));
}
let deepCopied = deepCopy(original);
original.b.c = 4;
console.log(deepCopied.b.c); // 3 - 完全独立的副本
包装对象
原始值可以临时转换为对象以调用方法:
javascript
let str = "hello";
str.length; // 5 - JavaScript临时将str转换为String对象
// 等价于
let temp = new String(str);
let len = temp.length;
temp = null;
手动创建包装对象:
javascript
let strObj = new String("hello");
typeof strObj; // "object"
strObj instanceof String; // true
上一篇:变量声明(var)