这里记录的是今天原篇的知识点补充
原篇地址:2024 前端面试题(GPT回答 + 示例代码 + 解释)No.21 - No.40
目录
27补. JavaScript中如何检测一个变量是什么类型?
通过 Object.prototype.toString.call()
方法,可以得到以下类型的变量信息:
- 对象类型:返回
"[object Object]"
。这包括自定义的对象、数组、函数等。 - 数组类型:返回
"[object Array]"
。 - 字符串类型:返回
"[object String]"
。 - 数字类型:返回
"[object Number]"
。 - 布尔类型:返回
"[object Boolean]"
。 - 函数类型:返回
"[object Function]"
。 - 正则表达式类型:返回
"[object RegExp]"
。 - 日期类型:返回
"[object Date]"
。 - 错误类型:返回
"[object Error]"
。 - Map 类型:返回
"[object Map]"
。 - Set 类型:返回
"[object Set]"
。 - Symbol 类型:返回
"[object Symbol]"
。 - Promise 类型:返回
"[object Promise]"
。 - ArrayBuffer 类型:返回
"[object ArrayBuffer]"
。 - DataView 类型:返回
"[object DataView]"
。 - Int8Array 类型:返回
"[object Int8Array]"
。 - Uint8Array 类型:返回
"[object Uint8Array]"
。 - Uint8ClampedArray 类型:返回
"[object Uint8ClampedArray]"
。 - Int16Array 类型:返回
"[object Int16Array]"
。 - Uint16Array 类型:返回
"[object Uint16Array]"
。 - Int32Array 类型:返回
"[object Int32Array]"
。 - Uint32Array 类型:返回
"[object Uint32Array]"
。 - Float32Array 类型:返回
"[object Float32Array]"
。 - Float64Array 类型:返回
"[object Float64Array]"
。
这些字符串表示了各种不同类型的变量。通过使用 Object.prototype.toString.call(variable)
,我们可以根据返回的结果来确定变量的类型。
typeof
是 JavaScript 内置的一个操作符,用于检测给定变量的数据类型。它返回一个字符串,表示变量的数据类型。
typeof
操作符可以返回以下几种数据类型:
"undefined"
:如果变量未定义或未声明时返回该类型。"boolean"
:如果变量是布尔值(true
或false
),返回该类型。"number"
:如果变量是数字(包括整数、浮点数、负数、正数等),返回该类型。"string"
:如果变量是字符串,返回该类型。"object"
:如果变量是一个对象 (不包括 null) 或数组,返回该类型。"function"
:如果变量是一个函数,返回该类型。
需要注意的是,typeof
返回的类型都是字符串类型,而非实际的数据类型。在使用 typeof
进行类型检测时,应该将返回值作为字符串进行比较。
例如:
let x;
console.log(typeof x); // 输出 "undefined"
x = true;
console.log(typeof x); // 输出 "boolean"
x = 42;
console.log(typeof x); // 输出 "number"
x = "Hello, world!";
console.log(typeof x); // 输出 "string"
x = {};
console.log(typeof x); // 输出 "object"
x = [];
console.log(typeof x); // 输出 "object"
x = function() {};
console.log(typeof x); // 输出 "function"
上述示例展示了 typeof
操作符返回的各种数据类型。需要注意的是,在某些情况下,typeof
操作符返回的类型可能与实际数据类型不太相符。例如,typeof null
返回 “object”,而不是 “null”。
37补. 浅拷贝 与 深拷贝 手写实现
浅拷贝
function shallowCopy(obj) {
var target = {};
for (var prop in obj) {
if (obj.hasOwnProperty(prop)) {
target[prop] = obj[prop];
}
}
return target;
}
var source = { name: "Alice", age: 25 };
var target = shallowCopy(source);
console.log(target); // 输出 { name: "Alice", age: 25 }
深拷贝
function deepCopy(obj) {
// 处理 null 和 undefined
if (obj === null || typeof obj !== "object") {
return obj;
}
// 处理日期对象
if (obj instanceof Date) {
return new Date(obj.getTime());
}
// 处理正则表达式对象
if (obj instanceof RegExp) {
return new RegExp(obj);
}
// 处理数组对象
if (Array.isArray(obj)) {
var newArr = [];
for (var i = 0; i < obj.length; i++) {
newArr.push(deepCopy(obj[i]));
}
return newArr;
}
// 处理其他对象
var newObj = {};
for (var prop in obj) {
if (obj.hasOwnProperty(prop)) {
newObj[prop] = deepCopy(obj[prop]);
}
}
return newObj;
}
var source = { name: "Alice", age: 25, hobbies: ["reading", "swimming"] };
var target = deepCopy(source);
console.log(target); // 输出 { name: "Alice", age: 25, hobbies: ["reading", "swimming"] }
target.hobbies.push("running");
console.log(source.hobbies); // 输出 ["reading", "swimming"]
console.log(target.hobbies); // 输出 ["reading", "swimming", "running"]