Open toFrankie opened 1 year ago
JavaScript 的「原始值」是没有任何的属性和方法的。
那么问题来了,
var str = 'abc' console.log(str.length) // 3
刚不是才说,原始值没有属性和方法吗?那为什么能访问到 length 属性呢?
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)
str.len = 1
len
1
delete new String(str).len
undefined
所以呢,我们常见的 string.length 并不是我们表面看到的 string 变量有一个 length 属性,它没有。
string.length
string
原始值是不可能有属性和方法的,但 str.len = 1 不报错,为什么呢?
因为经历了一个包装类。Boolean、String、Number 的原始值都可以加属性和方法,因为有包装类,但是 Null 和 Undefined 加属性和方法会报错(例外)。
Boolean
String
Number
JavaScript 的「原始值」是没有任何的属性和方法的。
那么问题来了,
刚不是才说,原始值没有属性和方法吗?那为什么能访问到
length
属性呢?再来,
str.len = 1
里面,虽然给 String 的实例化对象的len
属性赋值1
,但由于没有保存起来,所以,接着系统会马上给销毁掉delete new String(str).len
。len
属性(或方法),所以输出的是undefined
。所以呢,我们常见的
string.length
并不是我们表面看到的string
变量有一个length
属性,它没有。原始值是不可能有属性和方法的,但
str.len = 1
不报错,为什么呢?因为经历了一个包装类。
Boolean
、String
、Number
的原始值都可以加属性和方法,因为有包装类,但是 Null 和 Undefined 加属性和方法会报错(例外)。