为什么它能用length?原来是包装类这小子搞鬼

在 JavaScript 中,原始值是不能具有属性和方法的,因为属性和方法是对象独有的。但是 JavaScript 提供了包装类的机制,使得我们可以在原始值上使用属性和方法。

当我们访问原始类型的属性或方法时,JavaScript 会临时使用包装类来实现这一操作,然后立即销毁这个临时对象。例如,当我们使用 . 操作符访问字符串的 length 属性时,JavaScript 会将字符串转换为临时的包装类对象 ,获取其 length 属性值,然后立即销毁这个临时对象。

包装类

包装类提供了一种方便的方式来操作原始值,但需要注意保持包装类和原始类型之间的转换。如果我们对原始值进行修改,不会影响到原始值本身。

js 复制代码
 var num = 123
 num.a = 'hello'
 console.log(num.a);    

这段代码执行不会报错,会打印undefined,那这是为什么呢?我们继续往下看

js 复制代码
 var num = 123   //String()  Number()  Boolean()  Object()  Arry()  Date()  内部函数
 num.a = 'hello' 
// delete num.a
 console.log(num.a);   

没有报错是因为var num = 123解读成var num = new Number(123);但是num是一个原始值,会有一个delete删除num.a,所以打印undefined(访问对象不存在的属性时也会打印undefined)

上一篇对象文章juejin.cn/post/730124...说明 var num = new Number(123);new将num变成了对象 ,那么 num.a = 'hello' 合情合理,可以拿到hello。

但是它又可以乘法(对象是不能使用乘除等操作) ?
console.log(num*2) //打印246

说明num本质上还是原始类型

包装类考点

原始值身上能有属性和方法吗? 没有,为什么还能见到原始值身上有属性和方法?

js 复制代码
var arr =[1,2,3,4]
arr.length = 2
 console.log(arr); //可以打印数组[1,2] 
 var str = 'abcd'  
 console.log(str.length); //4
}

字符串str是原始类型,没有length属性,为什么可以打印4?

数组可以通过arr.length = 2改变数组长度,那字符串str可以吗?

js 复制代码
var arr =[1,2,3,4]
arr.length = 2
// console.log(arr);    //[1,2]
 var str = 'abcd'  
str.length = 2

console.log(str.length);

很显然字符串不能通过str.length = 2改变字符串长度。

那下面解决运行打印4的问题

js 复制代码
var arr =[1,2,3,4]
arr.length = 2
// console.log(arr);    //[1,2]
 var str = 'abcd'  
str.length = 2
// new String('abcd').length = 2  
console.log(str.length);//上面length属于 new String('abcd').length
// 构造函数天生有这个
//function String(s){
  //  this.length = 0
//}

字符串在调用str.length = 2时会产生new String('abcd').length = 2(包装类)这样一个代码,length属于它,同样它在调用后有一个delete删除它。

这篇文章juejin.cn/post/730124...讲到了String为实例对象==this,而构造函数会创建function String(s){this.length = 0}fun会遍历s,有几个就有多长,最后再把this.length返回,这样字符串就可以拥有长度了。这全都是包装类在搞鬼

相关推荐
laboratory agent开发1 小时前
企业AI Agent落地前,先回答四个工程问题
java·前端·人工智能
微三云 - 廖会灵 (私域系统开发)1 小时前
电商系统国际化架构设计:多语言、多币种、多时区、多税制的全链路实现
java·前端·数据库
不简说2 小时前
JS 代码技巧 vol.5 — 10 个错误处理套路,从 try/catch 到 Error Boundary
前端·javascript·程序员
wordpress资料库2 小时前
Next.js更适合移动开发 不适合web开发
开发语言·前端·javascript·next.js
卷无止境2 小时前
Quarkdown:赋予 Markdown 超能力的现代排版系统
前端·markdown
BerryS3N3 小时前
C++23新特性在CLion中的实战体验:从语法糖到生产力提升
前端·c++23
申君健24864182772023 小时前
# WebGPU 的渲染原理与 Shader
前端
随风123weber3 小时前
从前端响应式到后端背压:深度拆解生成式 UI(Generative UI)
前端
用户059540174463 小时前
用 Pytest 接管大模型记忆存储测试,状态一致性问题减少 90%
前端·css
IT_陈寒3 小时前
JavaScript的异步地狱里,我的Promise掉进了微任务陷阱
前端·人工智能·后端