[提高总结八]new String()引发的问题

今天上班,无意看到了一个网页,又学了个知识点“基原数据”,这两个小时算没白费。

/*
关于new String()引发的问题
 var s1 = new String("s1");
 就这么一句话,引发了将近2个小时的试验,所以不得不记录一下~

 问题来源:ide提示:"primitive type object wrapper used";
          意思是"原始类型对象已经被包装好了~"(瞎翻译啊~)
* */

//1,chrome的浏览器输出有PrimitiveValue个东西。PrimitiveValue:原始值(专业:基原数据)
var str = "Hello World";
var objStr = new String(str);//这里有警告,原始类型对象已经被包装好了

console.log(objStr);//chrome:String {0: "H", 1: "e", 2: "l", 3: "l", 4: "o", 5: " ", 6: "W", 7: "o", 8: "r", 9: "l", 10: "d",
                          // length: 11, [[PrimitiveValue]]: "Hello World"}
console.log(typeof objStr);//object
console.log(typeof str);//string
console.log(objStr == str);//true;
console.log(objStr === str);//false;
objStr.appendName = "name";//这里有警告,说是能把原始的值覆盖掉。
console.log(objStr==str);//true;只拿原始值比较。

//2,new Object登场
/**语法:
 * Object对象(或称之为Object()函数),其语法有以下两种:
   用法一:充当Object对象的构造函数使用,用于结合new关键字构造一个新的Object对象。
          Object()会根据传入参数的类型返回一个对应类型的对象。
          new Object( [ value ] )
   用法二:当作普通函数使用,其行为与用法一(使用new关键字)完全一致,相当于用法一省略了new关键字。
          Object( [ value ] )
   参数描述
    value可选/任意类型需要包装为对象的值。
    Object()将会根据参数value的数据类型,返回对应类型的对象:
    如果value为基元数据类型Boolean、Number、String,则返回对应类型的对象,
    例如:Boolean对象、Number对象、String对象。
    如果value本身为对象,则不对其作任何更改,返回其本身。
    如果省略了value参数,或value为null、undefined,则返回自身无任何属性的Object对象。
 * */
console.log("---------------");
var obj = new Object(str);//这里没有有警告
console.log(obj);//chrome:String {0: "H", 1: "e", 2: "l", 3: "l", 4: "o", 5: " ", 6: "W", 7: "o", 8: "r", 9: "l", 10: "d",
                          // length: 11, [[PrimitiveValue]]: "Hello World"}
console.log(typeof obj);//object
console.log(obj == str);//true;
console.log(obj === str);//false;
obj.appendName = "name";//这里没有警告
console.log(objStr==str);//true;只拿原始值比较。

//通过上面比较new Object比new String要省却了2个警告,而且效果一摸一样。
//那么问题来了,new String干什么用呢?
/**
 String对象(或称之为String()函数),其语法有以下两种:
 1、充当String对象的构造函数使用,用于结合new关键字构造一个新的String对象。
    new String( [ str ] )
 2、当作普通函数使用,将其它数据类型转换为String数据类型的原始字符串。简而言之,这是一个类型转换函数。
    String( [ str ] )
 参数	描述
 str	可选/任意类型表示字符串的任意值,默认为空字符串("")。
 如果参数value不是字符串,则调用该参数的toString()方法,将其转为字符串。
 返回值
 1、如果String()函数被当做String对象的构造函数来使用,则以new关键字构造一个新的String对象(String类型)。
   该String对象表示参数所指定的字符串值。
 2、如果String()函数被当作普通函数使用,则返回转换后的String数据类型的数值。
 注意:大多数时候,你无需显示地通过new关键字来构造一个String对象,因为在JavaScript中,
      String对象和String数据类型是相通的,你可以在String数据类型的变量上直接使用String对象的所有属性和方法。*/
console.log("---------------");
var strObj = new String( "CodePlayer" );
str = "CodePlayer";
//String数据类型也可以直接调用String对象的属性和方法
console.log( strObj.constructor === String ); //true
console.log( strObj.constructor === str.constructor ); //true
console.log( strObj.substring( 0, 4 ) ); //Code
console.log( str.substring( 0, 4 ) ); //Code
// 字面值形式的String数据类型也可以直接调用String对象的属性和方法
console.log( "Hello World".substring( 6, 11 ) ); // World
console.log("---------------");
// 添加自定义属性
strObj.newProperty = "String对象的新属性";
str.newProperty = "String数据类型的新属性";

// 修改内置的方法
strObj.substring = function (start, end){
    return "修改String对象的substring()方法";
};

str.substring = function (start, end){
    return "修改String数据类型的substring()方法";
};
console.log( strObj.newProperty ); // String对象的新属性
console.log( str.newProperty ); //undefined.添加的属性未生效
console.log( strObj.substring(0, 4) ); // 修改String对象的substring()方法
console.log( str.substring(0, 4) ); //Code,修改的方法也未生效,使用其内置的方法

/**总结:
 * 1:new Object()和Object()效果一样。
 * 2:new String()用new Object()或者Object()替代。
 * 3:String()可以看成是转换函数:如果参数value不是字符串,则调用该参数的toString()方法,将其转为字符串。
 * 4:如果想用对象,就Object();想转成字符串就String()
 *
 * 参考:http://www.365mini.com/page/javascript-new-string.htm
 *      http://www.365mini.com/page/javascript-new-object.htm
 * */

网站上内容总结的很好啊,收藏之~~

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值