阿里面试: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