最近在看javascript权威指南 ,书上看到以下的代码: var s = 'test'; s.len = 4; var t = s.len ; console.log(t); 这时候 t 报出 undefined ,为何啊?
欢迎选择我的课程,让我们一起见证您的进步~~
var s = 'test'; // s是`string`类型,不是`object` s.len = 4; //既然s不是object,怎么进行属性操作呢?
这里其实就引申出了包装对象的概念,你可以近似理解为这一步等同于下面几步操作
包装对象
var _tmp_var_s = new String(s); // _tmp_var_s是`object`类型,可通过typeof()验证 _tmp_var_s.len = 4; delete _tmp_var_s;
而
var t = s.len ;
同样道理,s不是对象,没有len属性 =>
s
var _tmp_var_s1 = new String(s); var t = _tmp_var_s1.len; // 新创建的对象,可是没这个属性的,即undefined delete _tmp_var_s1;
既然包装对象用完就销毁,没啥实际意义,为啥还要存在?
这是因为原始数据类型string, number等是没有属性的,只有object才有属性 为了为原始数据类型提供属性操作,才引申出包装对象这个概念
string
number
object
原始数据类型
属性
比如当我们取string类型变量的length属性也是隐含了这一步操作
length
var str = 'hello!'; var len = str.length;
等效于
var len = new String(str).length;
找到答案了,var s = 'test'创建的只是一个字符串,而不是对象,所以s.len = 4这时候赋值的对象属性是临时创建对象的属性,创建完就直接销毁了, 到了var t = s.len时候就找不到这个属性了,所以显示是undefined。
这里其实就引申出了
包装对象
的概念,你可以近似理解为这一步等同于下面几步操作而
同样道理,
s
不是对象,没有len属性 =>既然包装对象用完就销毁,没啥实际意义,为啥还要存在?
这是因为原始数据类型
string
,number
等是没有属性的,只有object
才有属性为了为
原始数据类型
提供属性
操作,才引申出包装对象这个概念比如当我们取
string
类型变量的length
属性也是隐含了这一步操作等效于
找到答案了,var s = 'test'创建的只是一个字符串,而不是对象,所以s.len = 4这时候赋值的对象属性是临时创建对象的属性,创建完就直接销毁了, 到了var t = s.len时候就找不到这个属性了,所以显示是undefined。