为什么 JavaScript 中字符串创建 Str 对象 为什么不用加new?

特爱点赞的野蛮人
  • 1.2k
    var sj=Date();
    document.write(sj.getHours());
    


    var str="大家好!"
    document.write(str.replace("好", "不好"));

大家好,第一个就不行,第二个就行?
请问为什么 date 对象必须加 new;
而string 对象为什么不用加 new?

我刚学 JavaScript ,所以这可是个 解剖麻雀 的问题,有利于我理解 JavaScript ;

谢谢了!

评论
阅读 2.4k
3 个回答

javascript引用类型的值是一个实例或者说对象,它是通过new + 构造函数创建。常见的引用类型包括ObjectArrayFunctionStringNumberBooleanDate等。在创建实例时我们都可以使用如下方式

var obj = new Object();
var arr = new Array();
//甚至
var fn = new Function('val', 'return val');

但有更简洁,并且更友好的方式来创建这些类型的实例叫字面量表示法如下

var obj = {};
var arr = [];
var fn = functon (val) {
    return val;
}

同时StringNumberBoolean属于特殊的引用类型,我们叫它基本包装类型。我们平时都是使用字面量来表示它们而很少用new方式:

var str = '';
var num = 0;
var boo = false;

但是我们为什么可以使用类似str.slice()呢? 要知道要是一个对象实例才有其对应的方法。

var str = 'text';
var subStr = str.substring(2);
/*原因在于在第二行代码访问时,访问过程处于一种读取模式,后台会自动完成以下处理。
1.创建String对象实例
2.实例中调用指定方法
3.销毁这个实例*/
var str = new String('text');
var subStr = str .substring(2);
str = null;

引用类型与基本包装类型主要区别在于对象的生存期,使用new创建的对象会在执行流离开当前作用域之前一直保存在内存中,而自动创建的基本包装类型对象只存在于一行代码的执行瞬间,然后立即被销毁。

car a="" 是 car a= new String 的简单实现

Date是构造函数,new是操作符
new Date() 就是创建一个日期对象

var s = 'abc'
typeof s //"string"  基本类型

var s = new String('abc')
typeof s //"object"  对象

所以就算要比较也是

// 一:
var s = String('大家好')   // string
var s = new String('大家好')   // object

// 二:
var sj=Date();
console.log(typeof sj)  // string  返回的是一个字符串,当然不能使用日期对象的方法getHours
console.log(sj);    // Sat Apr 02 2016 09:32:56 GMT+0800

var sj=new Date();
console.log(typeof sj); // object 返回的是对象,自然能使用日期对象的方法。
console.log(sj.getHours);  // 9        
宣传栏