2010-11-01 31 views

Trả lời

7

Built-in giấy gói đối tượng (tạo ra với Boolean, Number, StringDate constuctors) lưu trữ các nguyên thủy giá trị được bọc trong một tài sản nội tên [[PrimitiveValue]], mà không thể thay đổi, nhưng ...

bạn có thể ghi đè lên các phương pháp valueOf của đối tượng test của bạn:

var test = new Boolean(0); 
test.prop = "OK!" 
// override valueOf: 
test.valueOf = function() { return true; }; 

if (test == true) { // using the equals operator explicitly for type conversion 
    alert(test.prop); //"OK!" 
} 

Nó sẽ hoạt động vì phương pháp valueOf được sử dụng trong nội bộ bởi các cơ chế chuyển đổi loại được kích hoạt bởi toán tử bằng.

Khi một trong các toán hạng là giá trị Boolean, cả hai đều được chuyển đổi ở cuối thành Số.

Nếu chúng tôi không sử dụng toán tử bằng (ví dụ: if (test) { ... }), vì test là một đối tượng, khi được chuyển trực tiếp sang Boolean, nó sẽ luôn mang lại true.

Bất kỳ đối tượng chuyển đổi sang Boolean sẽ tạo ra giá trị true, các giá trị duy nhất có thể tạo ra một kết quả false, là những giá trị "falsey" (null, undefined, 0, NaN, một chuỗi rỗng, và tất nhiên giá trị false), mọi thứ khác sẽ sản xuất true. Thông tin

thêm:

+0

mặc dù đại diện chuỗi vẫn 'false', vì giá trị cơ bản đã không thực sự thay đổi .. –

+2

@Gaby, tốt, nó phụ thuộc vào cách chuyển đổi loại được thực hiện, ví dụ nếu bạn nối một chuỗi vào nó, ví dụ 'test + ''' kết quả vẫn sẽ là ''true'' (' valueOf' sẽ được sử dụng trước), nếu bạn sử dụng hàm tạo 'String' làm hàm, ví dụ:' String (test); 'nó sẽ gọi Phương pháp ['Boolean.prototype.toString'] (http://ecma262-5.com/ELS5_HTML.htm#Section_15.6.4.2). Tôi đồng ý, đó là một ý tưởng tốt để ghi đè 'toString' cũng. – CMS

+0

ah rất đẹp .. tôi chỉ cảnh báo giá trị 'alert (test)' và nó cho thấy 'false'. Có vẻ như phương thức 'alert' sử dụng hàm tạo String hoặc gọi' toString' trên các đối số của nó .. cảm ơn những người đứng đầu. –

1

số

var test = new Boolean(0); 

tạo ra một đối tượng mới và đặt một tham chiếu đến nó trong 'test'

test.prop = 'ss' 

động đặt một thuộc tính mới trên đối tượng (siêu lập trình FTW!)

test = true; 

gán phép thử cho kiểu nguyên thủy boolean. Tham chiếu đến đối tượng Boolean bị mất.

Cuối cùng, đối tượng Boolean dường như không có bất kỳ phương pháp nào để chuyển đổi hoặc gán lại giá trị của nó, tức là các đối tượng Boolean là không thay đổi.

Tuy nhiên, bạn có thể thêm một phương pháp để Boolean.prototype để thay đổi điều đó nếu bạn muốn ....

0

Các wrappers đối tượng tạo ra một loại tài liệu tham khảo không thay đổi trong JS. Vì trong JS các kiểu dữ liệu nguyên thủy là không thay đổi, nên các tham chiếu của chúng cũng không thay đổi.Nó có thể hữu ích cho một số trường hợp hiếm hoi nhưng hầu hết có thể sẽ không làm những gì bạn muốn. Ví dụ, nếu bạn cần thay đổi giá trị nguyên thủy nguồn và xem các tham chiếu để theo nó, bạn không thể sử dụng hàm tạo của đối tượng để đạt được hiệu quả mong muốn. Sau đó, đặt cược tốt nhất của bạn sẽ là để tránh các nhà xây dựng Object và sử dụng một đối tượng thích hợp chữ để chứa giá trị nguyên thủy của bạn dưới một tài sản như sau;

var pv = "test", 
 
    pvr = {0: pv}, 
 
    arr = new Array(5).fill().map(_ => pvr); 
 
console.log(JSON.stringify(arr)); 
 
pvr[0] = "Hello"; 
 
console.log(JSON.stringify(arr));

Các vấn đề liên quan