Обработка типов null в прототипе строки

#javascript #string

Вопрос:

У меня есть функция

 String.prototype.capitalize = function() {
    return this.charAt(0).toUpperCase()   this.slice(1);
}
 

Где мне нужно адаптировать это, чтобы вернуть «» (пустая строка)

 "".capitalize must return ""
undefined.capitalize must return ""
null.capitalize must return ""
 

Я пробовал с

 String.prototype.capitalize = function() {
    return this.charAt(0).toUpperCase()   this.slice(1) || "";
}
 

но для неопределенного я получаю ошибку:

 Uncaught TypeError: Cannot read property 'capitalize' of undefined at <anonymous>:1:6
 

Комментарии:

1. Вы хотите использовать 1-й символ с большой буквы ?

2. undefined.capitalize или null.capitalize никогда не сможет работать. Для них вам придется использовать функцию вместо метода-прототипа. В качестве альтернативы, если вы используете String.prototype.capitalize.call(undefined) и String.prototype.capitalize.call(null) , вы можете использовать return (this || "").charAt(0).toUpperCase() this.slice(1) . Подумайте ?? вместо || этого . Имейте в виду, что расширение собственных прототипов не рекомендуется.

3. Я согласен с @SebastianSimon. undefined.capitalize не должно быть ничего особенного. Если вы используете какую-либо функцию undefined или null она вернет: «Ошибка ввода: неопределенная не имеет свойств».

4. вы вызываете прототип строки для null и undefined. Но null и undefined не являются строковыми типами. Если вы хотите достичь желаемого результата, просто создайте функцию, которая это делает.

Ответ №1:

null и undefined не являются строковыми типами, поэтому вы всегда будете получать ошибку типа. ваш подход не сработает. Но вы можете создать функцию, которая делает это

 function capitalize(str){
    if(str === null || str === undefined ){return ""}
    else {return str = str[0].toUpperCase()   str.slice(1)}
}

let str1 = null
let str2 = undefined
let str3 = "abc"
console.log(capitalize(str1))
console.log(capitalize(str2))
console.log(capitalize(str3)) 

Комментарии:

1. Вы не получаете ошибку TypeError, потому null что и undefined не относятся к типу String; вы получаете ошибку, потому что чтение свойств из null и undefined невозможно.

2. @SebastianSimon да. правильный. Моя формулировка была не самой точной, но именно это я и имел в виду.

Ответ №2:

Я счел это полезным ответом.

 function capitalize(l){return null==l?"":null==l?"":l.charAt(0).toUpperCase() l.slice(1)}
 

Комментарии:

1. Почему null==l?"": повторяется?

Ответ №3:

Если this.length больше 0, вы возвращаетесь "" .

 String.prototype.capitalize = function() {
  return (this.length > 0) ? this.charAt(0).toUpperCase()   this.slice(1) : "";
}

console.log(typeof "test string".capitalize(), ":", "test string".capitalize());
console.log(typeof "".capitalize(), ":", "".capitalize()); 

Комментарии:

1. Это не касается null или undefined вообще не касается.