JavaScript'te boş veya tanımsızsa bir değeri değiştirin


128

??C # operatörünü JavaScript'e uygulama zorunluluğum var ve nasıl yapılacağını bilmiyorum. Bunu C # ile düşünün:

int i?=null;
int j=i ?? 10;//j is now 10

Şimdi bunu JavaScript'te kurdum:

var options={
       filters:{
          firstName:'abc'
       } 
    };
var filter=options.filters[0]||'';//should get 'abc' here, it doesn't happen
var filter2=options.filters[1]||'';//should get empty string here, because there is only one filter

Bunu nasıl doğru yaparım?

Teşekkürler.

DÜZENLEME: Sorunun yarısını tespit ettim: 'indeksleyici' gösterimini nesnelere ( my_object[0]) kullanamıyorum . Atlamanın bir yolu var mı? (Önceden filtre özelliklerinin adlarını bilmiyorum ve üzerlerinde yinelemek istemiyorum).

Yanıtlar:


271

İşte JavaScript eşdeğeri:

var i = null;
var j = i || 10; //j is now 10

O Not mantıksal operatör|| bir boolean değer ama dönüştürülebilir ilk değer döndürmez doğrudur .

Ek olarak, tek bir nesne yerine bir nesne dizisi kullanın:

var options = {
    filters: [
        {
            name: 'firstName',
            value: 'abc'
        }
    ]
};
var filter  = options.filters[0] || '';  // is {name:'firstName', value:'abc'}
var filter2 = options.filters[1] || '';  // is ''

Buna indeks ile erişilebilir.


57
0 geçerli bir i değeri ise bunun işe yaramayacağını unutmayın.
jt000

13
Eğer falsey herhangi bir şey potansiyel olarak geçerli bir girdiyse ( 0,, falseboş dizge), bunun yerine şöyle bir şey yapacağım: Yanlış olarak değerlendirilebilecek herhangi bir şeyden ziyade var j = (i === null) ? 10 : i;yalnızca yerini alacak null.
DBS

Groovy'de bunun bir eşdeğeri var mı?
user6123723

eğer itanımlanmamış, bu bir hata atar. bana yararsız görünüyor bu yüzden .. (?)
phil294

@ phil294 var j = (i != null ? i : 10);çünkü çalışması gerekir undefinedise ==boş yüzden i != nullolduğu falseher ikisi için nullve undefined.
ToolmakerSteve

6

Problemin yarısını tespit ettim: Nesneler için 'indeksleyici' gösterimini kullanamıyorum (my_object [0]). Atlamanın bir yolu var mı?

Hayır; bir nesne değişmezi, adından da anlaşılacağı gibi, bir nesnedir ve bir dizi değildir; bu nedenle, özelliklerinin belirli bir sırası olmadığından, bir dizini temel alan bir özelliği basitçe alamazsınız. Değerlerini almanın tek yolu belirli bir adı kullanmaktır:

var someVar = options.filters.firstName; //Returns 'abc'

Veya for ... indöngüyü kullanarak bunların üzerinde yineleyerek :

for(var p in options.filters) {
    var someVar = options.filters[p]; //Returns the property being iterated
}

1
@LinusGeffarth Bu komik for inJS döngüsünün yalnızca nesne değişmezlerinde çalıştığını unutmayın ! JS dizilerinde (dizin verir) ve JS Haritalarında (verir undefined) berbat bir şekilde başarısız olur . Umarım bunu unutmazsın, yoksa bir hata ayıklama sürpriziyle karşılaşırsın! xP
varun

4

ES2020 Cevap

Yeni Nullish Coalescing Operatörü, tarayıcı desteği sınırlı olsa da nihayet JavaScript'te mevcuttur. Caniuse'den alınan verilere göre , tarayıcıların yalnızca% 48,34'ü desteklenmektedir (Nisan 2020 itibariyle).

Belgelere göre,

Boş birleştirme operatörü (??), sol taraftaki işleneni boş veya tanımsız olduğunda sağ taraftaki işleneni döndüren ve aksi takdirde sol taraftaki işleneni döndüren mantıksal bir işleçtir.

const options={
  filters:{
    firstName:'abc'
  } 
};
const filter = options.filters[0] ?? '';
const filter2 = options.filters[1] ?? '';

Bu, her iki değişkeninizin de ''if filters[0]veya filters[1]are null, veya için bir geri dönüş değerine sahip olmasını sağlayacaktır undefined.

Boş birleştirme operatörünün, 0ve gibi diğer yanlış değer türleri için varsayılan değeri döndürmediğini unutmayın ''. Tüm hatalı değerleri hesaba katmak isterseniz, OR operatörünü kullanmanız gerekir ||.


0

Mantıksal sıfır atama, 2020+ çözümü

Tarayıcılara şu anda yeni bir operatör ekleniyor ??=. Bu eşdeğerdir value = value ?? defaultValue.

||=ve &&=ayrıca aşağıdaki bağlantılar geliyor.

Bu, sol tarafın tanımlanmamış veya boş olup olmadığını, önceden tanımlanmışsa kısa devre olup olmadığını kontrol eder. Değilse, sol tarafa sağ taraf değeri atanır.

Temel Örnekler

let a          // undefined
let b = null
let c = false

a ??= true  // true
b ??= true  // true
c ??= true  // false

// Equivalent to
a = a ?? true

Nesne / Dizi Örnekleri

let x = ["foo"]
let y = { foo: "fizz" }

x[0] ??= "bar"  // "foo"
x[1] ??= "bar"  // "bar"

y.foo ??= "buzz"  // "fizz"
y.bar ??= "buzz"  // "buzz"

x  // Array [ "foo", "bar" ]
y  // Object { foo: "fizz", bar: "buzz" }

İşlevsel Örnek

function config(options) {
    options.duration ??= 100
    options.speed ??= 25
    return options
}

config({ duration: 555 })   // { duration: 555, speed: 25 }
config({})                  // { duration: 100, speed: 25 }
config({ duration: null })  // { duration: 100, speed: 25 }

?? = Tarayıcı Desteği Temmuz 2020 -% 0,03

?? = Mozilla Belgeleri

|| = Mozilla Belgeleri

&& = Mozilla Belgeleri


0

Yıkıcı çözüm

Soru içeriği değişmiş olabilir, bu yüzden ayrıntılı olarak yanıtlamaya çalışacağım.

Yıkım, özellikleri olan her şeyden değerleri çekmenize olanak sağlar. Null / undefined olduğunda varsayılan değerleri ve ad takma adlarını da tanımlayabilirsiniz.

const options = {
    filters : {
        firstName : "abc"
    } 
}

const {filters: {firstName = "John", lastName = "Smith"}} = options

// firstName = "abc"
// lastName = "Smith"

NOT: Büyük harf kullanımı önemlidir

Bir dizi ile çalışıyorsanız, işte nasıl yapacağınız.

Bu durumda, dizideki her nesneden ad çıkarılır ve kendi takma adı verilir. Nesne mevcut olmayabileceği = {}için de eklendi.

const options = {
    filters: [{
        name: "abc",
        value: "lots"
    }]
}

const {filters:[{name : filter1 = "John"} = {}, {name : filter2 = "Smith"} = {}]} = options

// filter1 = "abc"
// filter2 = "Smith"

Daha Ayrıntılı Eğitim

Tarayıcı Desteği % 92 Temmuz 2020

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.