toFrankie / blog

种一棵树,最好的时间是十年前。其次,是现在。
20 stars 1 forks source link

JS 包装类 #222

Open toFrankie opened 1 year ago

toFrankie commented 1 year ago

JavaScript 的「原始值」是没有任何的属性和方法的

那么问题来了,

var str = 'abc'
console.log(str.length) // 3

刚不是才说,原始值没有属性和方法吗?那为什么能访问到 length 属性呢?

// console.log(str.length) 经历了什么过程呢?
// 1. 使用 new String(str) ,实例化一个 String 对象;(假设为 obj)
// 2. 这个实例化对象 obj 下面有个 length 属性,然后 obj.length 就能获取到对应的属性值 3;
// 3. 接着马上销毁 delete obj.length。

再来,

var str = 'abc'
str.len = 1
console.log(str.len) // undefined

// 相当于
var str = 'abc'
new String(str).len = 1
console.log(new String(str).len)

所以呢,我们常见的 string.length 并不是我们表面看到的 string 变量有一个 length 属性,它没有。

原始值是不可能有属性和方法的,但 str.len = 1 不报错,为什么呢?

因为经历了一个包装类。BooleanStringNumber 的原始值都可以加属性和方法,因为有包装类,但是 Null 和 Undefined 加属性和方法会报错(例外)。