String Primitive和String Object

网上看到下面这段代码,很有意义。

String.prototype.cut = function (len) {
  return this.length > len ? this.substring(0, len) + '...' : this;
};

var obj = ["Superman", "Batman", "Iron Man"];
console.log(typeof obj[1].cut(6));
console.log(obj[1].cut(6));

这段代码很简单,推断字符串的长度,假如大于给定长度(L)输出,输出字符串前L位加上“…”,不然输出字符串自身。

那末,上面的代码是否是和我们期待的一样输出下面的内容呢?

"String"
"Batman"

答案是否认的,现实的输出现实上是:

"object"
<String Object>

这现实上是因为String对象(String Object)和String基础范例(String Primitive)的差别致使的。字符串在JavaScript中有两种存在情势:

new String('object');// String Object
'primitive';// String Primitive

String的一切有用要领实在都是在String对象的prototype上,String基础范例是没有这些要领的。

因而当实行'primitive'.slice(0)时,JavaScript会自动将基础范例包装成对应的对象,挪用对象上的要领,完成以后自动将对象烧毁。因而,最上面的cut函数中this实在已不是String Primitive而是String Object,当我们直接返回this时,返回值现实上是”Batman”的String Object,所以typeof返回object

所以,这个cut函数准确写法应该用String转换函数将Object转为Primitive。

String.prototype.cut = function (len) {
  return this.length > len ? this.substring(0, len) + '...' : String(this);
};
    原文作者:BetaRabbit
    原文地址: https://segmentfault.com/a/1190000004360773
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞