Tôi sẽ đi một con đường khác đến phần còn lại ở đây, mà cố gắng cho biết một biến là một cụ thể, hoặc một thành viên của một tập hợp cụ thể, các loại. JS được xây dựng trên Ducktyping; Nếu một cái gì đó quacks như một chuỗi, chúng ta có thể và nên sử dụng nó như một chuỗi.
JS is built on ducktyping; if something quacks like a string, we can and should use it like a string.
7
có phải là một chuỗi không? Vậy tại sao /\d/.test[7]
hoạt động? {toString:[]=>['hello there']}
có phải là một chuỗi không? Vậy tại sao [{toString:[]=>['hello there']}] + '\ngeneral kenobi!'
hoạt động? Đây không phải là câu hỏi về việc làm trên, vấn đề là họ làm.
Is {toString:[]=>['hello there']}
a string? Then why does [{toString:[]=>['hello there']}] + '\ngeneral kenobi!'
work?
These aren't questions about should the above work, the point is they do.
Vì vậy, tôi đã thực hiện một chức năng duckyString[]
bên dưới tôi kiểm tra nhiều trường hợp không được phục vụ bởi các câu trả lời khác. Đối với mỗi mã:
Below I test many cases not catered for by other answers. For each the code:
- Đặt một biến giống như chuỗi
- Chạy một hoạt động chuỗi giống hệt nhau trên nó và một chuỗi thực để so sánh các đầu ra [chứng minh chúng có thể được đối xử như chuỗi]
- Chuyển đổi giống như chuỗi thành một chuỗi thực để hiển thị cho bạn
duckyString[]
để bình thường hóa các đầu vào cho mã mong đợi chuỗi thực
text = 'hello there';
out[text.replace[/e/g, 'E'] + ' ' + 'hello there'.replace[/e/g, 'E']];
out['Is string? ' + duckyString[text] + '\t"' + duckyString[text, true] + '"\n'];
text = new String['oh my'];
out[text.toUpperCase[] + ' ' + 'oh my'.toUpperCase[]];
out['Is string? ' + duckyString[text] + '\t"' + duckyString[text, true] + '"\n'];
text = 368;
out[[text + ' is a big number'] + ' ' + ['368' + ' is a big number']];
out['Is string? ' + duckyString[text] + '\t"' + duckyString[text, true] + '"\n'];
text = ['\uD83D', '\uDE07'];
out[text[1].charCodeAt[0] + ' ' + '😇'[1].charCodeAt[0]];
out['Is string? ' + duckyString[text] + '\t"' + duckyString[text, true] + '"\n'];
function Text[] { this.math = 7; }; Text.prototype = {toString:function[] { return this.math + 3 + ''; }}
text = new Text[];
out[String.prototype.match.call[text, '0'] + ' ' + text.toString[].match['0']];
out['Is string? ' + duckyString[text] + '\t"' + duckyString[text, true] + '"\n'];
Điều này nằm trong cùng một tĩnh mạch với
hEllo thErE hEllo thErE
Is string? true "hello there"
OH MY OH MY
Is string? true "oh my"
368 is a big number 368 is a big number
Is string? true "368"
56839 56839
Is string? true "😇"
0 0
Is string? true "10"
1 trái ngược với hEllo thErE hEllo thErE
Is string? true "hello there"
OH MY OH MY
Is string? true "oh my"
368 is a big number 368 is a big number
Is string? true "368"
56839 56839
Is string? true "😇"
0 0
Is string? true "10"
2 và thử nghiệm nếu một cái gì đó giống như mảng thay vì bắt buộc một mảng thực tế. Đối tượng jQuery; họ có mảng không? Không. Họ có đủ tốt không? Vâng, bạn có thể chạy chúng thông qua các chức năng hEllo thErE hEllo thErE
Is string? true "hello there"
OH MY OH MY
Is string? true "oh my"
368 is a big number 368 is a big number
Is string? true "368"
56839 56839
Is string? true "😇"
0 0
Is string? true "10"
3 tốt. Chính sự linh hoạt này mang lại cho JS sức mạnh của nó và thử nghiệm các chuỗi đặc biệt làm cho mã của bạn ít tương tác hơn.jQuery objects; are they arrays? No. Are they good enough? Yeah, you can run them through
hEllo thErE hEllo thErE
Is string? true "hello there"
OH MY OH MY
Is string? true "oh my"
368 is a big number 368 is a big number
Is string? true "368"
56839 56839
Is string? true "😇"
0 0
Is string? true "10"
3 functions just fine.It's this flexibility that gives JS its power, and testing for strings specifically makes your code less interoperable.
Đầu ra của những điều trên là:
hEllo thErE hEllo thErE
Is string? true "hello there"
OH MY OH MY
Is string? true "oh my"
368 is a big number 368 is a big number
Is string? true "368"
56839 56839
Is string? true "😇"
0 0
Is string? true "10"
Vì vậy, đó là tất cả về lý do tại sao bạn muốn biết nếu có gì đó là một chuỗi. Nếu, giống như tôi, bạn đã đến đây từ Google và muốn xem có thứ gì đó giống như chuỗi không, đây là một câu trả lời. Nó thậm chí còn không đắt tiền trừ khi bạn làm việc với các mảng char thực sự dài hoặc sâu. Điều này là do tất cả là nếu các câu lệnh, không có chức năng nào gọi như
hEllo thErE hEllo thErE
Is string? true "hello there"
OH MY OH MY
Is string? true "oh my"
368 is a big number 368 is a big number
Is string? true "368"
56839 56839
Is string? true "😇"
0 0
Is string? true "10"
4. Ngoại trừ nếu bạn đang cố gắng xem một mảng char với các đối tượng chỉ có các ký tự của ____ 15 hoặc nhiều byte, trong trường hợp đó không có cách nào khác để kiểm tra ngoại trừ để tạo chuỗi và đếm các ký tự, tương ứngIf, like me, you arrived here from google and wanted to see if something was string-like, here's an answer.
It isn't even expensive unless you're working with really long or deeply nested char arrays.
This is because it is all if statements, no function calls like
hEllo thErE hEllo thErE
Is string? true "hello there"
OH MY OH MY
Is string? true "oh my"
368 is a big number 368 is a big number
Is string? true "368"
56839 56839
Is string? true "😇"
0 0
Is string? true "10"
4.Except if you're trying to see if a char array with objects that only have
hEllo thErE hEllo thErE
Is string? true "hello there"
OH MY OH MY
Is string? true "oh my"
368 is a big number 368 is a big number
Is string? true "368"
56839 56839
Is string? true "😇"
0 0
Is string? true "10"
5's or multi-byte characters, in which case there's no other way to check except to make
the string, and count characters the bytes make up, respectivelyfunction duckyString[string, normalise, unacceptable] {
var type = null;
if [!unacceptable]
unacceptable = {};
if [string && !unacceptable.chars && unacceptable.to == null]
unacceptable.to = string.toString == Array.prototype.toString;
if [string == null]
;
//tests if `string` just is a string
else if [
!unacceptable.is &&
[typeof string == 'string' || string instanceof String]
]
type = 'is';
//tests if `string + ''` or `/./.test[string]` is valid
else if [
!unacceptable.to &&
string.toString && typeof string.toString == 'function' && string.toString != Object.prototype.toString
]
type = 'to';
//tests if `[...string]` is valid
else if [
!unacceptable.chars &&
[string.length > 0 || string.length == 0]
] {
type = 'chars';
//for each char
for [var index = 0; type && index < string.length; ++index] {
var char = string[index];
//efficiently get its length
var length = [[duckyString[char, false, {to:true}]] ?
char :
duckyString[char, true] || {}
].length;
if [length == 1]
continue;
//unicode surrogate-pair support
char = duckyString[char, true];
length = String.prototype[Symbol && Symbol.iterator];
if [![length = length && length.call[char]] || length.next[].done || !length.next[].done]
type = null;
}
}
//return true or false if they dont want to auto-convert to real string
if [![type && normalise]]
//return truthy or falsy with /null if they want why it's true
return [normalise == null] ? type != null : type;
//perform conversion
switch [type] {
case 'is':
return string;
case 'to':
return string.toString[];
case 'chars':
return Array.from[string].join[''];
}
}
Bao gồm là các tùy chọn để
- Hỏi phương pháp nào được coi là chuỗi-y
- loại trừ các phương thức phát hiện chuỗi [ví dụ: nếu bạn không thích
4]hEllo thErE hEllo thErE Is string? true "hello there" OH MY OH MY Is string? true "oh my" 368 is a big number 368 is a big number Is string? true "368" 56839 56839 Is string? true "😇" 0 0 Is string? true "10"
Dưới đây là nhiều bài kiểm tra hơn vì tôi là người hoàn thành:
out['Edge-case testing']
function test[text, options] {
var result = duckyString[text, false, options];
text = duckyString[text, true, options];
out[result + ' ' + [[result] ? '"' + text + '"' : text]];
}
test[''];
test[null];
test[undefined];
test[0];
test[{length:0}];
test[{'0':'!', length:'1'}];
test[{}];
test[window];
test[false];
test[['hi']];
test[['\uD83D\uDE07']];
test[[['1'], 2, new String[3]]];
test[[['1'], 2, new String[3]], {chars:true}];
- Tất cả các trường hợp tiêu cực dường như được tính
- Điều này sẽ chạy trên trình duyệt> = IE8
- Mảng char có nhiều byte được hỗ trợ trên các trình duyệt với hỗ trợ iterator chuỗi
Output:
Edge-case testing
is ""
null null
null null
to "0"
chars ""
chars "!"
null null
chars ""
to "false"
null null
chars "😇"
chars "123"
to "1,2,3"