Tại sao có giá trị `null` trong JavaScript?


115

Trong JavaScript, có hai giá trị về cơ bản nói rằng 'Tôi không tồn tại' - undefinednull.

Một thuộc tính mà một lập trình viên chưa gán bất cứ thứ gì sẽ là undefined, nhưng để một thuộc tính trở thành nullthì nullphải được gán rõ ràng cho nó.

Tôi đã từng nghĩ rằng cần có nullbởi vì undefinedlà một giá trị nguyên thủy và nullmột đối tượng. Nó không phải, ngay cả khi typeof nullsẽ mang lại 'object': Trên thực tế, cả hai đều là giá trị nguyên thủy - có nghĩa là cả hai đều undefinedkhông nullthể trả về từ một hàm tạo, vì cả hai sẽ được chuyển đổi thành một đối tượng trống (người ta phải ném một lỗi để thông báo lỗi trong các hàm tạo).

Cả hai đều đánh giá falsetrong ngữ cảnh boolean. Sự khác biệt thực sự duy nhất mà tôi có thể nghĩ đến là một cái đánh giá NaN, cái kia đánh giá 0trong ngữ cảnh số.

Vì vậy, tại sao lại có cả hai undefinednullnếu điều này chỉ gây nhầm lẫn cho các lập trình viên, những người đang kiểm tra sai nullkhi cố gắng tìm hiểu xem một thuộc tính đã được thiết lập hay chưa?

Điều tôi muốn biết là nếu có ai có một ví dụ hợp lý cần thiết để sử dụng nullmà không thể diễn đạt bằng cách sử dụng undefinedthay thế.

Vì vậy, sự đồng thuận chung dường như có undefinednghĩa là 'không có tài sản đó' trong khi nullcó nghĩa là 'tài sản tồn tại, nhưng không có giá trị gì'.

Tôi có thể sống với điều đó nếu các triển khai JavaScript thực sự thực thi hành vi này - nhưng undefinedlà một giá trị nguyên thủy hoàn toàn hợp lệ, vì vậy nó có thể dễ dàng được gán cho các thuộc tính hiện có để phá vỡ hợp đồng này. Do đó, nếu bạn muốn chắc chắn rằng một thuộc tính có tồn tại hay không, bạn phải sử dụng intoán tử hoặc bằng hasOwnProperty()mọi cách. Vì vậy, một lần nữa: việc sử dụng thực tế cho các giá trị riêng biệt cho undefinedvà là nullgì?

Tôi thực sự sử dụng undefinedkhi tôi muốn bỏ đặt giá trị của các thuộc tính không còn được sử dụng nữa nhưng tôi không muốn delete. Tôi có nên sử dụng nullthay thế không?


3
Để trả lời câu hỏi cuối cùng của bạn: Không, bạn không nên đặt thuộc tính thành undefined.
Shog9

4
"undefined" chỉ là một biến trong phạm vi toàn cục với giá trị nguyên thủy "undefined". Có thể xác định một giá trị khác cho biến: {undefined = "Hello"; alert (không xác định);} Một cách đáng tin cậy hơn để kiểm tra không xác định: {if (typeof myvar === "undefined") alert ("undefined")}
một số

1
Xem phần 4.3.9 - 12 trong ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf cho không xác định / null và 15.1.1.3 cho biến "không xác định" trong phạm vi toàn cầu.
một số

1
Bạn nên xóa một đối tượng hoặc đặt nó thành null nếu điều đó hợp lý hơn, nhưng không phải là không xác định.
một số

4
In JavaScript, there are two values which basically say 'I don't exist' - undefined and null.Không, chỉ undefinednói vậy.
Lightness Races in Orbit

Câu trả lời:


78

Câu hỏi không thực sự là "tại sao lại có giá trị null trong JS" - có một giá trị null nào đó trong hầu hết các ngôn ngữ và nó thường được coi là rất hữu ích.

Câu hỏi là, "tại sao lại có giá trị không xác định trong JS". Những nơi chính nơi nó được sử dụng:

  1. khi bạn khai báo var x;nhưng không gán cho nó, xgiữ nguyên không xác định;
  2. khi hàm của bạn nhận được ít đối số hơn nó khai báo;
  3. khi bạn truy cập thuộc tính đối tượng không tồn tại.

nullchắc chắn sẽ hoạt động tốt cho (1) và (2) *. (3) thực sự nên ném một ngoại lệ ngay lập tức, và thực tế là nó không, thay vì trả lại điều kỳ lạ này undefinedsẽ thất bại sau đó, là một nguồn lớn gây khó khăn cho việc gỡ lỗi.

*: bạn cũng có thể tranh luận rằng (2) nên đưa ra một ngoại lệ, nhưng sau đó bạn phải cung cấp một cơ chế tốt hơn, rõ ràng hơn cho các đối số mặc định / biến.

Tuy nhiên, JavaScript ban đầu không có ngoại lệ hoặc bất kỳ cách nào để hỏi một đối tượng nếu nó có một thành viên dưới một tên nhất định - cách duy nhất là (và đôi khi vẫn là) truy cập vào thành viên đó và xem những gì bạn nhận được. Vì nullmục đích đó đã có sẵn và bạn có thể muốn đặt một thành viên cho mục đích đó, nên cần phải có một giá trị ngoài dải khác. Vì vậy, chúng tôi có undefined, nó có vấn đề như bạn đã chỉ ra, và đó là một 'tính năng' JavaScript tuyệt vời khác mà chúng tôi sẽ không bao giờ loại bỏ được.

Tôi thực sự sử dụng undefined khi tôi muốn bỏ đặt giá trị của các thuộc tính không còn được sử dụng nữa nhưng tôi không muốn xóa. Tôi có nên sử dụng null thay thế không?

Đúng. Giữ undefinednhư một giá trị đặc biệt để báo hiệu khi các ngôn ngữ khác có thể đưa ra một ngoại lệ.

nullnói chung là tốt hơn, ngoại trừ trên một số giao diện DOM của IE nơi thiết lập một cái gì đó nullcó thể gây ra lỗi cho bạn. Thông thường, trong trường hợp này, thiết lập chuỗi trống có xu hướng hoạt động.


10
Args có thể mở rộng. Bạn có thể đăng ký bao nhiêu tùy thích và một hàm có thể lặp lại và tận dụng tất cả chúng. Các đối tượng có thể được gán một thuộc tính mới bất kỳ lúc nào. Đây là cả hai tính năng mạnh mẽ nhưng tôi nghi ngờ rằng việc có các ngoại lệ được đưa ra vì bạn muốn sẽ tốn rất nhiều chi phí. IMO, nó đáng để đánh đổi. Tôi dành ít thời gian hơn để kiểm tra sự tồn tại trong JS so với việc tôi thường làm truyền trong các mô hình ngôn ngữ chặt chẽ hơn.
Erik Reppen

Thật buồn cười làm sao câu trả lời được chấp nhận cho một câu hỏi lại bắt đầu bằng "đây thực sự không phải là câu hỏi ..."
Phillip

@bobince các phiên bản đầu tiên của JS không có intoán tử hay hasOwnProperty? Bởi vì chúng an toàn hơn obj.hello !== undefinedcách kiểm tra xem một thuộc tính có tồn tại trên một đối tượng hay không.
Andy

Đừng bận tâm, tôi đã trả lời câu hỏi của chính mình. Theo MDN, cả hai đều được giới thiệu trong ES3.
Andy

37

Được mô tả tốt nhất ở đây , nhưng tóm lại:

undefined là thiếu kiểu và giá trị, còn null là thiếu giá trị.

Hơn nữa, nếu bạn đang thực hiện các phép so sánh đơn giản '==', bạn đã đúng, chúng giống nhau. Nhưng hãy thử ===, so sánh cả loại và giá trị, và bạn sẽ nhận thấy sự khác biệt.


1
Tôi biết điều đó null !== undefined- câu hỏi của tôi là tại sao lại cần đến hai thứ thể hiện cùng một khái niệm ngữ nghĩa; ngoài ra, liên kết của bạn đề cập rằng 'null là một đối tượng' - sai rồi, nó là một nguyên thủy ...
Christoph

2
Chúng không cùng một khái niệm ngữ nghĩa. Đối với tôi ít nhất, có một sự khác biệt đáng kể giữa một thuộc tính được gán giá trị null và một thuộc tính không tồn tại.
Daniel Schaffer

Nhưng đó chỉ là nó, chúng không cùng một khái niệm ngữ nghĩa. Null bị ép buộc khi sử dụng == để ngụ ý điều tương tự, như một sự thuận tiện cho lập trình viên.
Eddie Parker

1
@EricElliott: typeofdối trá - đọc thông số kỹ thuật hoặc thử quay lại nulltừ một nhà xây dựng
Christoph

5
@EricElliott: giá trị trả về của các hàm tạo không liên quan gì đến falsy-ness, nhưng với object-ness: nếu giá trị trả về là một đối tượng, hãy trả về; nếu đó là một nguyên thủy như nullhoặc 42, loại bỏ các giá trị trả về và trả lại đối tượng mới được tạo ra thay vì
Christoph

17

Tôi không nghĩ rằng có bất kỳ lý do gì để có cả hai nullundefined, bởi vì lý do duy nhất mà nhiều người đã đề xuất (" undefinednghĩa là không có biến / thuộc tính như vậy") là không hợp lệ, ít nhất là trong JavaScript. undefinedkhông thể cho bạn biết liệu biến / thuộc tính có tồn tại hay không.

console.log(foo);               // "ReferenceError: foo is not defined"
                                // foo does not exist
var foo;
console.log(foo);               // "undefined", a different response
console.log(foo === undefined); // "true", but it does exist

var obj = {};
console.log(obj.hasOwnProperty("foo")); // "false", no such property
obj.foo = undefined;
console.log(obj.hasOwnProperty("foo")); // "true", it exists and has the value "undefined"
console.log(obj.foo === undefined);     // "true", but it does exist

obj.bar = "delete me";
obj.bar = undefined;
console.log(obj.hasOwnProperty("bar")); // "true", not actually deleted
delete obj.bar;
console.log(obj.hasOwnProperty("bar")); // "false", deleted

Như bạn có thể thấy, việc kiểm tra foo === undefinedkhông cho bạn biết liệu có footồn tại hay không và cài đặt obj.bar = undefinedkhông thực sự xóa bar.

Nó có thể là mục đích ban đầu của tác giả JavaScript undefinedthể hiện "không tồn tại". Tuy nhiên, việc triển khai không diễn ra theo cách đó.


1
Thay thế undefinedbằng nulltrong các ví dụ mã ở trên của bạn và các phản hồi đều giống nhau. Tôi không chắc điều này trả lời câu hỏi như thế nào. Đây có phải là một nhận xét về câu trả lời của người khác không?
Eric Elliott

1
@EricElliott Câu trả lời của tôi cho câu hỏi là không có lý do gì để có cả hai nullundefinedbởi vì lý do duy nhất mà nhiều người đã đề xuất là không hợp lệ.
Lei Zhao,

Bạn nên chỉnh sửa câu trả lời của mình và thực sự nói điều đó. Tôi có thể đã ủng hộ nếu bạn đưa ra câu trả lời đó. =)
Eric Elliott

@EricElliott Tôi nghĩ bạn đúng. Tôi đã chỉnh sửa câu trả lời của mình. Cảm ơn!
Lei Zhao

3
Ví dụ này thực sự cho thấy rằng nếu bạn không gán một biến, nó sẽ trả về undefined. Nhưng nếu bạn đã gán undefinedcho nó, thì nó không thực sự undefined- nó đã được định nghĩa undefinedvà có tham chiếu đến nó. Sự khác biệt duy nhất giữa undefinednulllà cách sử dụng và mục đích lịch sử của chúng. Chúng đều là nguyên tử.
Aleksej Komarov

6

Hoàn toàn có thể cần cả hai. Ví dụ, nếu bạn truy vấn WMI, bạn hoàn toàn có thể có các thuộc tính trả về của lớp có giá trị null. Chúng được xác định, chúng chỉ xảy ra để giữ null vào thời điểm đó.


6

Tôi nghĩ rằng kết luận của bạn mà JavaScript định nghĩa undefinedlà "không có thuộc tính như vậy" và nulllà "thuộc tính không có giá trị" là hoàn toàn chính xác. Và trong một ngôn ngữ năng động như JavaScript, đó là một sự khác biệt rất quan trọng. Việc sử dụng kiểu gõ vịt có nghĩa là chúng ta cần có khả năng phân biệt giữa thuộc tính không tồn tại và không có giá trị. Nó là phương tiện chính của chúng tôi để lấy thông tin loại. trong một ngôn ngữ được nhập tĩnh, có sự phân biệt rõ ràng giữa trường là null và trường không tồn tại. Trong JavaScript, điều này không khác. Tuy nhiên, nó được kiểm tra trong thời gian chạy và có thể được sửa đổi cho đến thời điểm đó.

Tôi sẽ phải đồng ý rằng việc thực hiện là lạ vì rất nhiều thời gian sự phân biệt bị mờ đi. Tuy nhiên, tôi nghĩ rằng trong JavaScript, sự khác biệt là quan trọng. Và có thể phân công undefinedlà điều cần thiết.

Tôi nhớ mình đã đọc một bài đăng trên blog cách đây không lâu về một game nhập vai trực tuyến được viết bằng JavaScript. Nó sử dụng các ví dụ trong đó các đối tượng được tạo dưới dạng bản sao của các cá thể hiện có chứ không phải là nguyên mẫu (lớp, hàm, bất cứ thứ gì), và sau đó được thay đổi. Điều này thực sự khiến tôi hiểu được sức mạnh của nó undefinedkhi sửa đổi các đối tượng hiện có, nhưng tôi không thể nhớ ai đã viết nó.


Bạn có thể vui lòng chia sẻ RPG này?
Michael

3

Về mặt ngữ nghĩa, chúng có nghĩa là những thứ khác nhau. Kiểu null có chính xác một giá trị trong miền của nó, null và một thuộc tính có thể được gán giá trị cụ thể này. Không xác định đại diện cho sự thiếu rõ ràng của bất kỳ giá trị nào đã được chỉ định.


1
nhưng bạn có thể sử dụng undefinedchỉ fine để gán cho các thuộc tính, vì vậy hợp đồng này (chỉ trả lại undfinednếu không có thuộc tính đó) có thể dễ dàng bị phá vỡ bởi lập trình viên ...
Christoph

2
Bạn có thể , nhưng bạn chắc chắn không nên. Undefined được sử dụng như một dạng ngoại lệ rất cơ bản / đơn giản trong JavaScript - đừng sử dụng nó như một giá trị và gán nó cho một số thuộc tính! Đúng là người điên.
rfunduk

3

Là một lập trình viên Java, tôi thấy có sự khác biệt rất lớn giữa undefined và null. Mã hóa JavaScript, không quá nhiều, bởi vì JavaScript không được nhập mạnh và sự khác biệt giữa không xác định và null bị làm mờ bởi các chuyển đổi tự động thường được thực hiện theo thời gian chạy. BTW, tôi thường xuyên tận dụng những chuyển đổi đó; chúng làm cho mã JS của tôi nhỏ gọn và dễ đọc hơn.

Để trả lời câu hỏi của bạn, không xác định có nghĩa là một giá trị chưa bao giờ được đặt. Thực tế mà nói, điều này thường chỉ ra một lỗi. Nếu yourObject.property không được xác định, điều đó có nghĩa là bạn đã không đặt thuộc tính vì lý do nào đó hoặc tôi đang tìm kiếm thứ gì đó hoàn toàn không tồn tại. Đây là một vấn đề thực sự khi làm việc trong một dự án với nhiều hơn một lập trình viên.

null có nghĩa là "không có giá trị" đã được đặt rõ ràng. Thực tế mà nói, bạn đang nói với tôi điều gì đó về thuộc tính, có lẽ rằng nó không được sử dụng trong ngữ cảnh này hoặc giá trị vẫn chưa được xác định.

Trong Java, những nỗ lực truy cập vào một trường không xác định sẽ luôn dẫn đến một ngoại lệ. Trên thực tế, trình biên dịch có thể được thực hiện để cảnh báo bạn về điều này trong mã của bạn.


0

Hãy thử ví dụ này:

<html>
<head>
    <script type="text/javascript">
        function ShowObjProperties(obj) {
            var property, propCollection = "";

            for(property in obj) {
                propCollection += (property + ": " + obj[property] + "\n");
            }

            alert(propCollection);
        }

        var obj = {
            userid: 3,
            name: 'me!',
            speak: function() { alert('Hi! My name is ' + this.name + ' and my ID is ' + this.userid + '.'); }
        }

        //Shows all properties
        ShowObjProperties(obj);

        //The Speak function is no longer in the list!
        delete obj.speak;
        alert(typeof obj.speak);
        ShowObjProperties(obj);

        //The UserID is still listed, it just has no value!
        obj.userid = null;
        ShowObjProperties(obj);
    </script>
</head>
<body>

</body>
</html>

Tôi nghĩ rằng có một công dụng rất thực tế cho 2 loại khác nhau ở đây.


Và trong nguyên mẫu, tôi nghĩ, là một thành viên rỗng hoặc chỉ là không xác định.
Kev

nhưng điều này chỉ hoạt động càng lâu càng không có ai cố gắng để phá vỡ nó - nếu tôi đặt obj.userid = undefined, nó sẽ thất bại - xem chỉnh sửa cuối cùng cho câu hỏi của tôi
Christoph

0

Bản chất động của javascripts.

Mọi thứ có thể không được xác định để chúng có thể được bổ sung sau này. Đây được cho là lý do tại sao javascript rất mạnh mẽ và có thể mở rộng.


và điều này có liên quan đến câu hỏi của tôi theo cách nào?
Christoph

2
Nó có liên quan vì nó trả lời câu hỏi của bạn. 'null' là một loại 'singleton' có nghĩa là 'không có giá trị'. 'undefined' đang nói với bạn rằng một cái gì đó ... gây sốc, tôi biết ... không xác định. Chúng là những thứ hoàn toàn khác nhau.
rfunduk

0

đó là một tính năng ngôn ngữ quan trọng nếu bạn bao bọc chương trình của mình xung quanh mô hình javascript đã xảy ra.

// a key exists as a placeholder for something
if(obj[name] === null) 
// no key exists int eh hashtable that is in this object
if(obj[name] === undefined)

điều này rất hữu ích nếu bạn đang xử lý một tập hợp dữ liệu cần một giá trị đại diện cho 'không có gì' để biểu thị một số hành động khác với việc sử dụng 'không có gì' để biểu thị hành động mặc định.

filter_func_pt = {
  date:function(d){ return Math.round(d.getTime()/1000);},
  user: null,
}

function transform(obj){
    var ret = {};
    for( var prop in obj){
       var f = filter_func_pt[prop];
       if(f)
          ret[prop] = f(obj);
       else if(filter_func_pt[prop] === null)
         continue;
       else
         ret[prop] == obj;
    }
  return ret;
}

var a = {
   date: new Date(),
   user: 'sam'
   votes: [23, 41, 55] 
};

var b = transform(a);

/* b = {
 *    date: 1298582417
 *    votes: [23, 41, 55]
 * }
 */

trong đoạn mã trên, từ khóa null và máy chủ không xác định rất rõ ràng và mục đích khác nhau. tra cứu không được tìm thấy trong đối tượng filter_func_pt trả về không xác định có nghĩa là thêm thuộc tính vào đối tượng trả về như hiện tại, trong khi giá trị null chỉ ra rằng giá trị đó nên được giữ lại và không được thêm vào và sự hiện diện của bất kỳ giá trị thực nào trong đó case đại diện cho một hàm được sử dụng để biến đổi giá trị trước khi thêm nó vào đối tượng ret .


Ví dụ này là giả tạo và hơi vô nghĩa. Null không làm rõ ý định của bạn - đúng hơn, nó che giấu nó. Bạn có thể đã sử dụng một chuỗi rõ ràng hơn để làm rõ ý nghĩa. Giống như, "với giữ lại" hoặc "dải" và sau đó bạn cũng có thể hiểu rõ hơn về loại hàm và thực sự kiểm tra sự hiện diện của một hàm.
Eric Elliott

0

null là đẹp

cũng như tất cả các loại Live Script khác.

cite: Trong JavaScript, có hai giá trị về cơ bản nói rằng "Tôi không tồn tại" - không xác định và null.

Tại sao bạn lại muốn nói những điều không chính xác ?!

"null""đối tượng rỗng" cũng giống như "0" là "số trống" . 0, không là gì -nhưng nó tồn tại dưới dạng một thứ Số. null tất nhiên cũng là trống nhưng "nó là" và nó là một thứ được xác định rõ ràng của Loại đối tượng .

Người ta thường nói về những thứ này như là "loại", khi chúng không. Thực tế chúng là những "phạm trù". Nhưng giờ đã hết.

Vì vậy, sẽ dính vào nó để nói rằng "null" là một Loại đối tượng không có Loại. Và "null" nói rằng "Tôi rất tồn tại [!], Nhưng tôi không có nội dung thuộc loại của mình".

Trong khi undefined thiếu cả Type và Type, nơi undefined cũng là định nghĩa của Type. Một kiểu không xác định của một kiểu trở thành kiểu đặc trưng của nó. Một loại câu hỏi [không có gì "tồn tại và làm thế nào để bạn xác định" không có gì "?].

cite: undefined hoặc null có thể được trả về từ một hàm khởi tạo, vì cả hai sẽ được chuyển đổi thành một đối tượng trống

Bạn đã cố gắng một lần nữa nói một điều không chính xác. Tất nhiên là không, "undefined" không phải là một Object, nó là một Token đơn giản mà con người chúng ta hiểu được; nhưng trái ngược với null đó là - và nó cho bạn biết rằng: Loại của nó là đúng, nhưng Loại bạn đang tìm không có trong nó, hoặc ít nhất là-không phải tại thời điểm này. Hãy đến thăm chúng tôi sau khi chúng tôi đặt \ gán một số đối tượng vào \ cho nó.

cite: Sự khác biệt thực sự duy nhất mà tôi có thể nghĩ đến là một đánh giá là NaN, còn lại là 0 trong ngữ cảnh số.

Điều đó làm cho toàn bộ điểm phân biệt cốt lõi của chúng, như đã đề cập: undefined là một mã thông báo đơn giản và vì nó được tạo thành từ cùng một vật liệu 'di truyền' với họ hàng xa của nó: chuỗi, nên phép toán [+ undefined] sẽ chuyển nó thành NaN, tương tự null tất nhiên sẽ tự biến đổi thành một loại chính xác 0 \ Number thay vào đó, trái ngược với không xác định sẽ biến đổi thành một chuỗi (! Mà không rỗng!) Và đó chính xác là lý do tại sao nó tạo ra NaN thay thế. Trong đó: + undefined >> + "undefined" >> NaN. Vì ngữ cảnh số mong đợi giá trị rõ ràng.

Trong khi ngữ cảnh Boolean mong đợi tham chiếu - không tìm thấy gì để chuyển đổi và tạo ra 'false'.

Bây giờ chúng ta hãy cắt ngang qua ...

cite: Vì vậy, một lần nữa: việc sử dụng thực tế cho các giá trị riêng biệt cho undefined và null là gì?

Tôi sẽ cố gắng cung cấp cho bạn chỉ hai ví dụ thực nghiệm và hy vọng là đủ

oElement.onclick >> null

// nghĩa là thuộc tính tồn tại; giá trị mong đợi của nó là Type: Object và oElement đó hỗ trợ sự kiện "onclick"!

oElement.innerText >> ""

// có nghĩa là - thuộc tính tồn tại; giá trị mong đợi của nó là Type: String , có nghĩa là oElement hỗ trợ thuộc tính "innerText".

trong cả hai trường hợp - nếu bạn nhận được "không xác định", điều đó có nghĩa là thuộc tính không tồn tại; không được hỗ trợ hoặc triển khai sai (ua nhà cung cấp).

Ở lại sương giá và vui chơi.


Đừng phá hoại bài viết của bạn, aeneas. Xóa chúng (bằng cách sử dụng nút Xóa ngay phía trên nhận xét này) nếu bạn muốn xóa đóng góp của mình.
Michael Petrotta

không có nút xóa - nhưng trong trường hợp bạn thấy nó - hãy nhấp vào nó!

0

sau khi đọc cuộc thảo luận tuyệt vời về undefined và null, tìm kiếm nhỏ trên google đã đưa tôi đến Tài liệu Mozilla https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/null nó được đề cập - null thường là được truy xuất ở nơi có thể mong đợi một đối tượng nhưng không có đối tượng nào có liên quan.

Không giống với mẫu đối tượng Null https://en.wikipedia.org/wiki/Null_object_pattern

Vì vậy, tôi đoán điều này có ý nghĩa khi có kiểu dữ liệu Null.

Tài liệu cũng được đề cập là typeof null // "object" (không phải "null" vì lý do cũ)

Không chắc lý do kế thừa là gì

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.