最近在看javascript权威指南 ,书上看到以下的代码:
var s = 'test';
s.len = 4;
var t = s.len ;
console.log(t);
这时候 t 报出 undefined ,为何啊?
阿神2017-04-10 14:58:36
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属性 =>
var _tmp_var_s1 = new String(s);
var t = _tmp_var_s1.len; // 新创建的对象,可是没这个属性的,即undefined
delete _tmp_var_s1;
既然包装对象用完就销毁,没啥实际意义,为啥还要存在?
这是因为原始数据类型string
, number
等是没有属性的,只有object
才有属性
为了为原始数据类型
提供属性
操作,才引申出包装对象这个概念
比如当我们取string
类型变量的length
属性也是隐含了这一步操作
var str = 'hello!';
var len = str.length;
等效于
var len = new String(str).length;
天蓬老师2017-04-10 14:58:36
找到答案了,var s = 'test'创建的只是一个字符串,而不是对象,所以s.len = 4这时候赋值的对象属性是临时创建对象的属性,创建完就直接销毁了, 到了var t = s.len时候就找不到这个属性了,所以显示是undefined。