为什么'这个'在String.prototype里面是指对象类型,而不是字符串类型?

时间:2015-01-02 03:04:40

标签: javascript node.js

我正在尝试扩展字符串以提供自身的哈希值。我正在使用Node.js加密库。

我像这样扩展字符串:

String.prototype.hashCode = function() {
    return getHash(this);
};

我有一个getHash函数,如下所示:

function getHash(testString) {
    console.log("type is" + typeof(testString));
    var crypto = require('crypto');
    var hash = crypto.createHash("sha256");
    hash.update(testString);
    var result = hash.digest('hex');
    return result;
}

直接调用时该函数可以正常工作,如

var s = "Hello world";
console.log(getHash(s));

但是当我尝试时:

var s = "ABCDE";
console.log(s.hashCode());

方法调用失败。 this中的String.prototype.hashCode似乎在调用crypto.hash.update时被标识为对象,但预计会出现字符串。我认为this内的String.prototype将是字符串本身,但由于某种原因,它看起来像是getHash()的对象。我该如何解决?

2 个答案:

答案 0 :(得分:7)

this不能是strict mode之外的原始类型,因此它变为String wrapper type,它根本不像原始字符串(特别是typeof和平等 - 严格和宽松 - 去)。你可以施展它:

String.prototype.hashCode = function () {
    return getHash('' + this);
};

其中'' +用于将任何值强制转换为原始字符串。 (String(this)如果你觉得它更清楚也会奏效。)

您也可以进入严格模式,只是有意义

String.prototype.hashCode = function () {
    'use strict';
    return getHash(this);
};

答案 1 :(得分:2)

当您对基本类型的变量调用方法时,会发生所谓的自动装箱。该过程将原始值包装到相应的对象中,例如'asdf'new String('asdf')。由于技术原始值不具备方法属性,因此它们托管在对象原型中。使用自动装箱,您可以调用原始值的方法。在方法中,this始终是具有该方法的对象

如果要访问方法中的原始值,可以将其作为参数传递,或者根据需要从this检索原始值。例如:

var str = new String('asdf') // String {0: "a", 1: "s", 2: "d", 3: "f", length: 4, formatUnicorn: function, truncate: function, splitOnLast: function, [[PrimitiveValue]]: "asdf"}
String(str) // 'asdf'

var num = new Number(123) // Number {[[PrimitiveValue]]: 123}
Number(num) // 123

var bool = new Boolean(true) // Boolean {[[PrimitiveValue]]: true}
Boolean(bool) // true