阿里面试:JavaScript中的包装类和new关键词
前言
在 JavaScript 中,包装类是一种特殊的对象类型,用于将基本数据类型(如字符串、数字、布尔值等)包装成对象,以便能够调用对象的方法和属性,今天我们就来聊聊包装类和new关键词
正文
JavaScript中的类型
-
基本数据类型
Number:包括整数和浮点数。String:字符串类型。Boolean:取值为true或false。Undefined:变量声明但未初始化时的值。Null:表示一个空值或不存在的对象引用。
-
引用数据类型
Object:对象类型,包括普通对象、数组、函数等。Array:数组类型,用于存储一组有序的数据。Function:函数类型,可用于定义可执行的代码块。
ES6 中新增了 Symbol(唯一且不可变的值)
谷歌67版本中还出现了BigInt(用于表示任意精度的整数)。
那么今天要聊的包装类和new关键词就和数据类型Object关系很大了,我们就先来聊聊对象类型
Object-对象类型
对象是属性的无序集合,每个属性都有一个名称(键)和一个对应的值
属性的值可以是任何数据类型,包括基本数据类型(如数字、字符串、布尔值等),也可以是对象、数组或函数
创建对象的方式有两种
- 第一种:对象字面量
let person = {
name: "John",
age: 30,
sayHello: function() {
console.log("Hello!");
}
};
- 第二种:
new Object()构造函数
let person = new Object();
person.name = "John";
person.age = 30;
person.sayHello = function() {
console.log("Hello!");
};
对象的属性可以通过点号(.)操作符或方括号([])操作符来访问和修改
通过构造函数构建对象时我们可以发现,当我们通过点号(.)操作符去访问对象里面的变量的时候,如果对象里面没有这个数据,那么会自动为这个对象添加上这个数据
包装类
分析一下以下代码
var str = 'hello';
console.log(str.length);
当访问str.length时,JavaScript 会自动将字符串'hello'转换为String对象,然后访问length属性
我们 继续分析下面的代码
var num = 123
num.abc = 'hello'
console.log(num.abc);
执行 console.log(num1.abc); 时,会得到 undefined 的输出
因为他创建事实上当成对象 new Number()
- 然后添加了一个abc属性值为abc
- 但是为什么是最后返回一个undfined呢?
- 因为引擎发现这是一个基本数据类型
- 然后就做一个deleate操作
- 这个隐式的过程就是包装类的过程-->new Number()
相当于下面的过程
new Number(123).abc = 123
delect new Number(123).abc
console.log(num.abc)
我们继续分析一下代码
var arr = [1, 2, 3, 4, 5];
arr.length = 2;
console.log(arr);
var str = new String("abcde");
str.length = 2;
console.log(str);
对于数组 arr,当修改其 length 属性为 2 时,数组会被截断,只保留前两个元素。所以 console.log(arr) 输出 [1, 2]
而对于字符串对象 str,length 属性是只读的,不能直接修改。所以修改 str.length = 2 这一操作是无效的,console.log(str) 仍然输出 abcde
接下来我们分析一道阿里的面试题
var str = "abc";
str += 1;
var test = typeof str;
if (test.length == 6) {
test.sign = "type返回的结果是string";
}
console.log(test.sign);
这题的结果为 undefined
var str = "abc";: 声明了一个字符串变量str。str += 1;: 将str与数字1拼接,得到新的字符串"abc1"。var test = typeof str;: 检查str的数据类型,结果是"string"。if (test.length == 6): 检查test的长度是否等于 6,条件成立。test.sign = "type返回的结果是string";: 尝试给test添加一个sign属性,但test是一个字符串,不能直接给它添加属性。这行代码不会产生任何效果。console.log(test.sign);: 试图输出test.sign属性,但由于前一步没有成功添加属性,所以输出为undefined。
在经历test.sign = "type返回的结果是string";这一步时,会发生隐式的包装类转换,可以看做为
new String(test).sign = "type返回的结果是string"
delect new String(test).sign = "type返回的结果是string"
总结
本文讲解了JavaScript中的包装类和new关键词,希望对你有帮助!!
转载自:https://juejin.cn/post/7383609946833043471