Глядя на добавление функции обрезки в прототип String, я наткнулся на что-то, что мне кажется странным с помощью строк JavaScript.
if (typeof console === 'undefined') {
var console = { };
console.log = function(msg) {
alert(msg)
}
}
function isString(str) {
return ((str && typeof str === 'string') ||
(str && (str.constructor == String && (str.toString() !== 'null' && str.toString() !== 'undefined'))));
}
if (!String.prototype.trim) {
String.prototype.trim = function () {
return this.replace(/^\s*(\S*(?:\s+\S+)*)\s*$/, "$1");
};
}
function testing (str) {
if (isString(str)) {
console.log("Trimmed: " + str.trim() + " Length: " + str.trim().length);
} else {
console.log("Type of: " + typeof str);
}
return false;
}
function testSuite() {
testing(undefined);
testing(null);
testing("\t\r\n");
testing(" 90909090");
testing("lkkljlkjlkj ");
testing(" 12345 ");
testing("lkjfsdaljkdfsalkjdfs");
testing(new String(undefined)); //Why does this create a string with value 'undefined'
testing(new String(null)); //Why does this create a string with value 'null'
testing(new String("\t\r\n"));
testing(new String(" 90909090"));
testing(new String("lkkljlkjlkj "));
testing(new String(" 12345 "));
testing(new String("lkjfsdaljkdfsalkjdfs"));
}
Теперь я знаю, что мы не должны создавать строки с оператором new, но я не хотел бы, чтобы кто-то вызывал это для неопределенной или нулевой строки, которая была создана в следующем виде:
new String ( someUndefinedOrNullVar );
Чего мне не хватает? Или проверка! == 'null' &&! == 'undefined' действительно необходима (при удалении этой проверки будут отображаться 'null' и 'undefined')?