var.replace không phải là một chức năng


132

Tôi đang sử dụng đoạn mã dưới đây để cố gắng cắt chuỗi trong Javascript nhưng đang gặp lỗi được đề cập trong tiêu đề:

function trim(str) {
    return str.replace(/^\s+|\s+$/g,'');
}

Biên tập:

Tôi đã sửa lỗi .... xin lỗi tôi nên đặt mã theo cách tôi gọi nó .... tôi nhận ra rằng tôi đã vô tình truyền đối tượng của trường biểu mẫu chứ không phải giá trị của nó.


21
strcó lẽ không phải là một chuỗi
Pekka

Bên cạnh đó: bạn đang thiếu các trích dẫn xung quanh regexchuỗi, dù sao thì điều đó có thể không tốt.
Grant Thomas

4
@MrDisappointment Javascript có các biểu thức chính quy theo nghĩa đen - chúng không cần phải là một chuỗi
Gareth

1
@Clenses: Bạn có thể tìm thấy (hoặc muốn bắt đầu) một cuộc thảo luận tại english.stackexchange.com/search?q=contraction
user113716

15
Sử dụng str.toString().replace(/^\s+|\s+$/g,'')thay thế.
M Rostami

Câu trả lời:


211

Tôi đoán là mã đang gọi trimhàm của bạn không thực sự truyền một chuỗi cho nó.

Để khắc phục điều này, bạn có thể làm cho strmột chuỗi, như thế này: str.toString().replace(...)
... như Alper chỉ ra dưới đây.


39
str.toString()đã khắc phục sự cố của tôi.
alper

Chà, str.toString()chỉ là giải pháp nếu bạn chuyển một giá trị đúng có thể được chuyển đổi thành chuỗi thành công ; trong trường hợp của tôi, tôi đã vượt qua điều sai lầm hoàn toàn. :)
Brett

Tôi cũng gặp lỗi tương tự, tôi đã thử toString () nhưng gặp lỗi: không thể đọc thuộc tính "toString" không xác định và tương tự cho "thay thế"
Hitesh Kumar

89

vấn đề có thể xảy ra:

  • biến là SỐ (thay vì chuỗi);
    num=35; num.replace(3,'three'); =====> ERROR
    num=35; num.toString().replace(3,'three'); =====> CORRECT !!!!!!
    num='35'; num.replace(3,'three'); =====> CORRECT !!!!!!
  • biến là đối tượng (thay vì chuỗi);
  • biến không được xác định;

1
Cảm ơn vì điều này, tôi đã phải đối mặt với một vấn đề, ở đâu, tôi đã nhận được String trong một đối tượng typeof. Tôi đã chuyển đổi đối tượng đó với toString (). Và nó đang hoạt động! Cảm ơn bạn!
Vishwajit R. Shinde

14

Thay thế sẽ không thay thế số. Nó chỉ thay thế các chuỗi.

Điều này nên làm việc.

function trim(str) {
    return str.toString().replace(/^\s+|\s+$/g,'');
}

Nếu bạn chỉ muốn cắt chuỗi. Bạn chỉ có thể sử dụng "str.trim ()"


6

Bạn không truyền một chuỗi nếu không nó sẽ có một replacephương thức. Tôi hy vọng bạn không gõ function trim(str) { return var.replace(blah); }thay vì return str.replace.


6

Bạn có thể nên thực hiện một số xác nhận trước khi bạn thực sự thực hiện chức năng của mình:

function trim(str) {
    if(typeof str !== 'string') {
        throw new Error('only string parameter supported!');
    }

    return str.replace(/^\s+|\s+$/g,'');
}

5

Bạn đã gọi đúng chức năng của mình chưa? I E. điều bạn vượt qua như là một tham số thực sự là một chuỗi?

Mặt khác, tôi không thấy vấn đề với mã của bạn - ví dụ dưới đây hoạt động như mong đợi

function trim(str) {
    return str.replace(/^\s+|\s+$/g,'');
}


trim('    hello   ');  // --> 'hello'

Tuy nhiên, nếu bạn gọi functoin của mình bằng một thứ gì đó không phải là chuỗi, bạn thực sự sẽ gặp lỗi ở trên:

trim({});  // --> TypeError: str.replace is not a function

5

Trong trường hợp số bạn có thể thử chuyển đổi thành chuỗi:

var stringValue = str.toString();
return stringValue.replace(/^\s+|\s+$/g,'');

3

Bạn nên sử dụng Phương thức tập lệnh java của toString () để chuyển đổi thành chuỗi trước vì phương thức thay thế là hàm chuỗi.


1

Tôi đã sửa lỗi .... xin lỗi tôi nên đặt mã theo cách tôi gọi nó .... tôi nhận ra rằng tôi đã vô tình truyền đối tượng của trường biểu mẫu chứ không phải giá trị của nó.

Cảm ơn câu trả lời của bạn nào. :)


1
Bạn có thể chỉnh sửa câu hỏi, điều đó tốt hơn là đưa ra câu trả lời cho chính mình. Ồ, và trong khi bạn đang ở đó, hãy chọn một trong những người tốt và chấp nhận câu trả lời của họ. :-)
Christopher Creutzig

2
@Christopher: Không; nếu anh ta tự giải quyết nó, anh ta nên viết câu trả lời của mình và chấp nhận nó. Đó là cách thực hành tốt nhất. Đặt giải pháp trong câu hỏi và chấp nhận câu trả lời tùy ý là không.
Các cuộc đua nhẹ nhàng trong quỹ đạo

@Tomalak: Có một số câu trả lời đúng ở đây, cũ hơn câu này. Tôi đồng ý rằng chấp nhận câu trả lời của riêng bạn nếu đó là câu trả lời đúng đầu tiên là một điều tốt ™ và chắc chắn không muốn đề xuất đưa giải pháp vào câu hỏi.
Christopher Creutzig

@Christopher: Câu trả lời được chấp nhận phải là câu trả lời có chứa giải pháp mà OP đã sử dụng.
Các cuộc đua nhẹ nhàng trong quỹ đạo

0

hãy chắc chắn rằng bạn đang truyền chuỗi cho phương thức "thay thế". Có cùng một vấn đề và giải quyết nó bằng cách chuyển chuỗi. Bạn cũng có thể tạo chuỗi thành chuỗi bằng phương thức toString ().

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.