Hướng dẫn how do you compare two things in javascript? - làm thế nào để bạn so sánh hai thứ trong javascript?

Đối tượng là các loại tham chiếu để bạn có thể chỉ sử dụng

if (foobar === foo ||
    foobar === bar ||
    foobar === baz ||
    foobar === pew) {
     //do something
}
2 hoặc
if (foobar === foo ||
    foobar === bar ||
    foobar === baz ||
    foobar === pew) {
     //do something
}
3 để so sánh 2 đối tượng. Một cách nhanh chóng để so sánh nếu 2 đối tượng có cùng giá trị khóa, là sử dụng
if (foobar === foo ||
    foobar === bar ||
    foobar === baz ||
    foobar === pew) {
     //do something
}
4. Một cách khác là sử dụng chức năng lodash
if (foobar === foo ||
    foobar === bar ||
    foobar === baz ||
    foobar === pew) {
     //do something
}
5

# So sánh sâu thẳm

Yup, 2 cách cũng hoạt động cho các vật thể lồng sâu.

# Tôi nên sử dụng cái nào?

Điều đó phụ thuộc. Đối với

if (foobar === foo ||
    foobar === bar ||
    foobar === baz ||
    foobar === pew) {
     //do something
}
6, thứ tự quan trọng. Vì vậy, nếu cặp giá trị khóa được đặt hàng khác nhau trong hai đối tượng nhưng giống nhau, nó sẽ trả về sai. Trong khi nó không quan trọng trong lodash
if (foobar === foo ||
    foobar === bar ||
    foobar === baz ||
    foobar === pew) {
     //do something
}
5, nó sẽ trả về đúng khi cặp giá trị chính tồn tại.

Đây là đề xuất của tôi. Đối với một giải pháp nhanh chóng và bẩn, tôi sẽ sử dụng

if (foobar === foo ||
    foobar === bar ||
    foobar === baz ||
    foobar === pew) {
     //do something
}
6. Nhưng đối với một giải pháp mạnh mẽ hơn bao gồm nhiều trường hợp cạnh kỳ lạ hơn, hãy sử dụng Lodash Way.

# Es6 cách để so sánh 2 đối tượng

Đây là một giải pháp được đề xuất bởi @mustafauzun0. Mặc dù vậy, rất ít điều cần lưu ý, nó đã giành được công việc với các đối tượng lồng nhau và thứ tự của các phím rất quan trọng. Ý tưởng đằng sau điều này tương tự như cách chuỗi. Nó bao phủ đối tượng thành một chuỗi và so sánh nếu các chuỗi là một kết quả phù hợp. Về cơ bản nó so sánh sự bình đẳng của hai chuỗi. Đó là lý do tại sao đơn đặt hàng quan trọng.

Cảm ơn: @mustafauzun0

# Json.Stringify vs hiệu suất của Lodash

Cole Turner: Đáng chú ý rằng các đối tượng không đảm bảo thứ tự sắp xếp và Stringify sẽ tốn nhiều hiệu suất hơn vì nó phải tuần tự hóa toàn bộ đối tượng trong khi Lodash có thể thoát ra sớm nếu tìm thấy một khóa không khớp. Điều này xuất hiện trong các cuộc phỏng vấn 🙂

Cảm ơn: @Coleturner

BLNKDOTSPACE: Lodash nhanh hơn đáng kể. Bởi vì Lodash sẽ bỏ cuộc ngay khi nó đạt đến sự khác biệt đầu tiên, nhưng Stringify đi ngay cho đến khi kết thúc một cách không cần thiết. Nếu bạn có các mảng nhỏ thì không sao nhưng đối với các trường hợp sử dụng cá nhân của tôi với hơn 1000 sự kiện/sản phẩm trong danh sách, tôi sẽ không bao giờ sử dụng Stringify.

Cảm ơn: @blnkdotspace

# Tài nguyên

  • MDN Web Docs - JSON.Stringify
  • Lodash: Isequal
  • Hiểu các đối tượng JavaScript
  • Bình đẳng đối tượng trong JavaScript
  • JavaScript so sánh đối tượng sâu - JSON.
  • Stack Overflow: Có tốt không khi sử dụng JSON.Stringify để so sánh sâu và nhân bản?
  • Làm thế nào để xác định bình đẳng cho hai đối tượng JavaScript?

89

Mới! Lưu câu hỏi hoặc câu trả lời và sắp xếp nội dung yêu thích của bạn. Tìm hiểu thêm.
Learn more.

Cách đẹp nhất để so sánh một giá trị với các tùy chọn bội số là gì?

Tôi biết có rất nhiều cách để làm điều này, nhưng tôi đang tìm kiếm gọn gàng nhất.

Tôi hỏi bởi vì tôi hy vọng điều này là khả thi (nó không phải, rõ ràng là khi bạn nhìn vào nó):

if (foobar == (foo||bar) ) {
     //do something
}

Hướng dẫn how do you compare two things in javascript? - làm thế nào để bạn so sánh hai thứ trong javascript?

Isherwood

54,6K15 Huy hiệu vàng107 Huy hiệu bạc147 Huy hiệu đồng15 gold badges107 silver badges147 bronze badges

hỏi ngày 2 tháng 2 năm 2012 lúc 23:09Feb 2, 2012 at 23:09

Hướng dẫn how do you compare two things in javascript? - làm thế nào để bạn so sánh hai thứ trong javascript?

Thelastshadowthelastshadowthelastshadow

3.2733 huy hiệu vàng34 Huy hiệu bạc35 Huy hiệu đồng3 gold badges34 silver badges35 bronze badges

3

Đừng cố gắng quá lén lút, đặc biệt là khi nó không cần thiết phải ảnh hưởng đến hiệu suất. Nếu bạn thực sự có cả đống so sánh để làm, chỉ cần định dạng nó một cách độc đáo.

if (foobar === foo ||
    foobar === bar ||
    foobar === baz ||
    foobar === pew) {
     //do something
}

Đã trả lời ngày 2 tháng 2 năm 2012 lúc 23:35Feb 2, 2012 at 23:35

5

Những gì tôi sử dụng để làm, là đặt nhiều giá trị đó vào một mảng như

var options = [foo, bar];

Và sau đó, sử dụng indexof ()

if(options.indexOf(foobar) > -1){
   //do something
}

vì sự xinh đẹp:

if([foo, bar].indexOf(foobar) +1){
   //you can't get any more pretty than this :)
}

và cho các trình duyệt cũ hơn: (https://developer.mozilla.org/en/javascript/reference/global_objects/array/indexof)
( https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/IndexOf )

if (!Array.prototype.indexOf) {
    Array.prototype.indexOf = function (searchElement /*, fromIndex */ ) {
        "use strict";
        if (this == null) {
            throw new TypeError();
        }
        var t = Object(this);
        var len = t.length >>> 0;
        if (len === 0) {
            return -1;
        }
        var n = 0;
        if (arguments.length > 0) {
            n = Number(arguments[1]);
            if (n != n) { // shortcut for verifying if it's NaN
                n = 0;
            } else if (n != 0 && n != Infinity && n != -Infinity) {
                n = (n > 0 || -1) * Math.floor(Math.abs(n));
            }
        }
        if (n >= len) {
            return -1;
        }
        var k = n >= 0 ? n : Math.max(len - Math.abs(n), 0);
        for (; k < len; k++) {
            if (k in t && t[k] === searchElement) {
                return k;
            }
        }
        return -1;
    }
}

Đã trả lời ngày 2 tháng 2 năm 2012 lúc 23:12Feb 2, 2012 at 23:12

7

Vì không có ai thêm giải pháp rõ ràng nhưng hoạt động tốt cho hai so sánh, tôi sẽ cung cấp nó:

if (foobar === foo || foobar === bar) {
     //do something
}

Và, nếu bạn có rất nhiều giá trị (có lẽ hàng trăm hoặc hàng ngàn), thì tôi khuyên bạn nên tạo ra một bộ vì điều này tạo ra mã so sánh rất sạch và đơn giản và nó nhanh trong thời gian chạy:

// pre-construct the Set
var tSet = new Set(["foo", "bar", "test1", "test2", "test3", ...]);

// test the Set at runtime
if (tSet.has(foobar)) {
    // do something
}

Đối với Pre-ES6, bạn có thể nhận được một polyfill đã thiết lập trong đó có rất nhiều. Một được mô tả trong câu trả lời khác này.

Đã trả lời ngày 2 tháng 2 năm 2012 lúc 23:18Feb 2, 2012 at 23:18

Hướng dẫn how do you compare two things in javascript? - làm thế nào để bạn so sánh hai thứ trong javascript?

jfriend00jfriend00jfriend00

655K91 Huy hiệu vàng931 Huy hiệu bạc933 Huy hiệu Đồng91 gold badges931 silver badges933 bronze badges

4

Bạn có thể sử dụng một công tắc:

switch (foobar) {
  case foo:
  case bar:
    // do something
}

Đã trả lời ngày 2 tháng 2 năm 2012 lúc 23:12Feb 2, 2012 at 23:12

Vì không có ai thêm giải pháp rõ ràng nhưng hoạt động tốt cho hai so sánh, tôi sẽ cung cấp nó:Guffa

Và, nếu bạn có rất nhiều giá trị (có lẽ hàng trăm hoặc hàng ngàn), thì tôi khuyên bạn nên tạo ra một bộ vì điều này tạo ra mã so sánh rất sạch và đơn giản và nó nhanh trong thời gian chạy:108 gold badges722 silver badges995 bronze badges

0

Đối với Pre-ES6, bạn có thể nhận được một polyfill đã thiết lập trong đó có rất nhiều. Một được mô tả trong câu trả lời khác này.

Đã trả lời ngày 2 tháng 2 năm 2012 lúc 23:18

if (~[foo, bar].indexOf(foobar)) {
    // pretty
}

655K91 Huy hiệu vàng931 Huy hiệu bạc933 Huy hiệu ĐồngFeb 13, 2013 at 10:27

Bạn có thể sử dụng một công tắc:lucideer

Guffaguffa24 silver badges31 bronze badges

1

674K108 Huy hiệu vàng722 Huy hiệu bạc995 Huy hiệu Đồng

if (foobar === foo ||
    foobar === bar ||
    foobar === baz ||
    foobar === pew) {
     //do something
}
0

Chỉ dành cho những cú đá, vì câu hỏi và trả lời này dường như là về vi phân cú pháp, một sửa đổi nhỏ bé của gợi ý của André Alçada Padez:not work on IE < 9.

.Jun 7, 2013 at 8:54

Đã trả lời ngày 13 tháng 2 năm 2013 lúc 10:27Ionică Bizău

Lucideerlucideer82 gold badges274 silver badges456 bronze badges

2

3.79424 Huy hiệu bạc31 Huy hiệu đồng

David

17.4K4 Huy hiệu vàng42 Huy hiệu bạc57 Huy hiệu đồng4 gold badges42 silver badges57 bronze badges

Đã trả lời ngày 2 tháng 2 năm 2012 lúc 23:21Feb 2, 2012 at 23:21

JamieseejamieseeJamieSee

12.4K2 Huy hiệu vàng30 Huy hiệu bạc47 Huy hiệu đồng2 gold badges30 silver badges47 bronze badges

5

Phương pháp chuyển đổi (như được đề cập bởi Guffa) thực sự hoạt động rất độc đáo. Tuy nhiên, các cài đặt cảnh báo mặc định trong hầu hết các lin sẽ cảnh báo bạn về việc sử dụng giảm. Đó là một trong những lý do chính khiến tôi sử dụng các công tắc, vì vậy tôi đã bỏ qua cảnh báo này khá nhiều, nhưng bạn nên lưu ý rằng việc sử dụng tính năng rơi của câu lệnh Switch có thể là khó khăn. Mặc dù vậy, trong những trường hợp như thế này - tôi sẽ đi cho nó.

Hướng dẫn how do you compare two things in javascript? - làm thế nào để bạn so sánh hai thứ trong javascript?

Đã trả lời ngày 25 tháng 2 năm 2014 lúc 11:43Feb 25, 2014 at 11:43

NinjatoolninjatoolNinjaTool

531 Huy hiệu bạc5 Huy hiệu đồng1 silver badge5 bronze badges

0

Tôi thích hình thức kiểm tra chỉ mục với một mảng, nhưng hãy lưu ý, điều này không hoạt động trong tất cả các trình duyệt (vì Array.Prototype.indexof không có trong IEXPLORER cũ).

Tuy nhiên, có một cách tương tự bằng cách sử dụng jQuery với hàm $ .Inarray ():

if (foobar === foo ||
    foobar === bar ||
    foobar === baz ||
    foobar === pew) {
     //do something
}
1

Nó có thể tốt hơn, vì vậy bạn không nên kiểm tra nếu indexof tồn tại.

Hãy cẩn thận với so sánh (không sử dụng == true/false), vì $ .inArray trả về chỉ mục của vị trí phù hợp nơi giá trị đã được tìm thấy và nếu chỉ mục là 0, nó sẽ sai khi nó thực sự tồn tại thành Mảng.

Đã trả lời ngày 25 tháng 3 năm 2015 lúc 9:56Mar 25, 2015 at 9:56

Hướng dẫn how do you compare two things in javascript? - làm thế nào để bạn so sánh hai thứ trong javascript?

1

Làm thế nào để bạn so sánh mọi thứ trong JavaScript?

JavaScript cung cấp ba hoạt động so sánh giá trị khác nhau: ===-Bình đẳng nghiêm ngặt (ba bằng)=== — strict equality (triple equals) == — loose equality (double equals) Object.is()

Là == và === giống nhau trong javascript?

Sự khác biệt chính giữa toán tử == và === trong JavaScript là toán tử == thực hiện chuyển đổi loại của toán hạng trước khi so sánh, trong khi toán tử === so sánh các giá trị cũng như các loại dữ liệu của toán hạng.the == operator does the type conversion of the operands before comparison, whereas the === operator compares the values as well as the data types of the operands.

Làm cách nào để so sánh hai số trong JavaScript?

JavaScript có hai toán tử khác nhau xác định xem các giá trị có bằng nhau hay không.Không nghiêm ngặt bằng toán tử (==) xác định xem hai giá trị có bằng nhau một cách hiệu quả bất kể loại dữ liệu của chúng không.Các toán tử tương đương với toán tử (===) xác định xem hai giá trị có giống hệt nhau trong cả loại dữ liệu và giá trị hay không.

Toán tử == trong JavaScript là gì?

Toán tử bình đẳng (==) kiểm tra xem hai toán hạng của nó có bằng nhau hay không, trả về kết quả boolean.Không giống như toán tử bình đẳng nghiêm ngặt, nó cố gắng chuyển đổi và so sánh các toán hạng có các loại khác nhau.checks whether its two operands are equal, returning a Boolean result. Unlike the strict equality operator, it attempts to convert and compare operands that are of different types.