Sau khi xem lại câu trả lời trước của tôi, có vẻ như việc sửa chữa hoàn toàn câu trả lời trước của tôi là cần thiết. Tôi đã được cách trên phức tạp nó như câu trả lời ngắn gọn là đây là những trường hợp đặc biệt tiêu chuẩn quy định.
Các specification cho String()
(String
sử dụng như một chức năng):
15.5.1.1 String ([value])
Trả về một giá trị String (không phải là một đối tượng String) tính bằng ToString (giá trị). Nếu giá trị không được cung cấp, thì chuỗi rỗng " " được trả về.
Chức năng ToString
(tồn tại trong nội bộ, không phải trong Userland) được định nghĩa như sau (9.8):
"The ToString hoạt động trừu tượng chuyển đổi đối số của nó đến một giá trị kiểu String theo Bảng 13"
Argument Type | Result
Null | "null"
Undefined | "undefined"
Điều này có nghĩa rằng String(null)
và String(undefined)
đi vào bảng đặc biệt này của các loại và chỉ trả lại giá trị chuỗi giá trị "null"
và "undefined"
.
Một người sử dụng đất giả thực hiện trông giống như sau: (. Lưu ý rằng ví dụ này bỏ qua trường hợp nhà xây dựng (new MyString()
) và nó sử dụng các khái niệm sử dụng đất chứ không phải là động cơ-đất)
function MyString(val) {
if (arguments.length === 0) {
return "";
} else if (typeof val === "undefined") {
return "undefined";
} else if (val === null) {
return "null";
} else if (typeof val === "boolean") {
return val ? "true" : "false";
} else if (typeof val === "number") {
// super complex rules
} else if (typeof val === "string") {
return val;
} else {
// return MyString(ToPrimitive(val, prefer string))
}
}
tôi bị một chút mang đi và tìm thấy một thực hiện ví dụ (V8 được cụ thể):
string.js
// Set the String function and constructor.
%SetCode($String, function(x) {
var value = %_ArgumentsLength() == 0 ? '' : TO_STRING_INLINE(x);
if (%_IsConstructCall()) {
%_SetValueOf(this, value);
} else {
return value;
}
});
macros.py
macro TO_STRING_INLINE(arg) = (IS_STRING(%IS_VAR(arg)) ? arg : NonStringToString(arg));
runtime.js
function NonStringToString(x) {
if (IS_NUMBER(x)) return %_NumberToString(x);
if (IS_BOOLEAN(x)) return x ? 'true' : 'false';
if (IS_UNDEFINED(x)) return 'undefined';
return (IS_NULL(x)) ? 'null' : %ToString(%DefaultString(x));
}
Các NonStringToString (trong đó chủ yếu là những gì là quan tâm), được may mắn được định nghĩa trong psuedo-JS-đất. Như bạn có thể thấy, có một trường hợp đặc biệt cho null/true/false/undefined.
Cảm ơn câu trả lời của bạn Corbin, rõ ràng. – KooiInc
@Kooilnc Không sao cả. – Corbin
String()! == Chuỗi (không xác định) là vì trong JavaScript hai đối tượng chỉ bằng nhau nếu chúng là cùng một đối tượng trong bộ nhớ. Khi gọi String(), bạn đang tạo một đối tượng bao quanh chuỗi nguyên thủy để về cơ bản so sánh là hai đối tượng khác nhau gói cùng một chuỗi nguyên thủy. – Buzzy