search

Home  >  Q&A  >  body text

javascript - js 中关于String对象的创建和销毁,何时创建,何时销毁

最近在看javascript权威指南 ,书上看到以下的代码:
var s = 'test';
s.len = 4;
var t = s.len ;
console.log(t);
这时候 t 报出 undefined ,为何啊?

天蓬老师天蓬老师2794 days ago677

reply all(2)I'll reply

  • 阿神

    阿神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;
    

    reply
    0
  • 天蓬老师

    天蓬老师2017-04-10 14:58:36

    找到答案了,var s = 'test'创建的只是一个字符串,而不是对象,所以s.len = 4这时候赋值的对象属性是临时创建对象的属性,创建完就直接销毁了, 到了var t = s.len时候就找不到这个属性了,所以显示是undefined。

    reply
    0
  • Cancelreply