JavaScript中字符串和字符串对象

    今天被人问道这样一个问题,问题代码如下

    var str = 'str';
    str.func = function() { console.log('test');};
    str.func() //Object str has no method 'func'

    这个地方最终会报错的。

    解决这个问题首先要搞清楚JavaScript中字符串和字符串对象这两个概念,JavaScript中的字符串和其他编程语言中的字符串概念是一致的,在内存中也是以数组的形式存放,而字符串变量其实是指向整个数组的第一个元素。字符串是JavaScript中的内置对象。可以这样检测:

    var s = "123";
    var type = typeof s;
    alert(type);//输出string

    字符串对象,是一个js对象,它的类是String,类型是Object。可以这么理解,字符串对象,是包含了一个字符串变量的对象。

    var s = new String("123");
    var type = typeof s;
    alert(type);    //输出object

    下来来说明之前的问题。之前的问题出在误把字符串和字符串对象混为一谈,觉得字符串就是一个对象,是可以给这个对象添加属性的。其实字符串变量本身是一个地址变量根本不能添加属性。那么为什么最开始没有报语法错误呢?这是因为js解释器将上面的代码翻译成下面的样子:

    var str = 'str';
    new String(str).func = function() { console.log('test');};
    str.func() //Object str has no method 'func'

    这样看就明白许多,其实func这个方法并没有添加到str变量上,而是添加到一个匿名生成的字符串对象上去,而这个字符串对象的内存地址和str的内存地址显然是不一样的,所以当使用str调用func时会报错。

    而这样的用法还有很多,比如我们经常这么做:

    var s = "12345";
    var ss = s.substring(0,1);//其实js会将其翻译成下面的写法
    var ss = new String(s).substring(0,1);

    也就是说对于任何一个字符串,都可以直接调用String类的方法,但是并不是说字符串本身有这些方法,而是js解释器帮我们简化了语法。

    转载请注明出处:http://gagalulu.wang/blog/detail/21 您的支持是我最大的动力!