阿里面试:JavaScript中的包装类和new关键词

前言

在 JavaScript 中,包装类是一种特殊的对象类型,用于将基本数据类型(如字符串、数字、布尔值等)包装成对象,以便能够调用对象的方法和属性,今天我们就来聊聊包装类和new关键词

正文

JavaScript中的类型

  1. 基本数据类型

    • Number:包括整数和浮点数。
    • String:字符串类型。
    • Boolean:取值为 truefalse
    • Undefined:变量声明但未初始化时的值。
    • Null:表示一个空值或不存在的对象引用。
  2. 引用数据类型

    • 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]

而对于字符串对象 strlength 属性是只读的,不能直接修改。所以修改 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

  1. var str = "abc";: 声明了一个字符串变量 str
  2. str += 1;: 将 str 与数字 1 拼接,得到新的字符串 "abc1"
  3. var test = typeof str;: 检查 str 的数据类型,结果是 "string"
  4. if (test.length == 6): 检查 test 的长度是否等于 6,条件成立。
  5. test.sign = "type返回的结果是string";: 尝试给 test 添加一个 sign 属性,但 test 是一个字符串,不能直接给它添加属性。这行代码不会产生任何效果。
  6. 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关键词,希望对你有帮助!!

  • 9
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值