我正在尝试扩展字符串以提供自身的哈希值。我正在使用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()
的对象。我该如何解决?
答案 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