如果在JavaScript中为null或未定义,则替换值
我需要将如果在JavaScript中为null或未定义,则替换值,javascript,Javascript,我需要将?C#操作符应用于JavaScript,但我不知道如何实现。 在C中考虑这一点: 现在,我在JavaScript中设置了以下内容: var options={ filters:{ firstName:'abc' } }; var filter=options.filters[0]||'';//should get 'abc' here, it doesn't happen var filter2=options.filters[1
?
C#操作符应用于JavaScript,但我不知道如何实现。
在C中考虑这一点:
现在,我在JavaScript中设置了以下内容:
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
我如何正确地做它
谢谢
编辑:我发现了问题的一半:我不能对对象使用“索引器”符号(
my_object[0]
)。有办法绕过它吗?(我事先不知道过滤器属性的名称,也不想对它们进行迭代)。以下是JavaScript等价物:
var i = null;
var j = i || 10; //j is now 10
请注意,返回的不是布尔值,而是可以转换为true的第一个值
另外,使用对象数组而不是单个对象:
var options = {
filters: [
{
name: 'firstName',
value: 'abc'
}
]
};
var filter = options.filters[0] || ''; // is {name:'firstName', value:'abc'}
var filter2 = options.filters[1] || ''; // is ''
可以通过索引访问的
我发现了问题的一半:我不能对对象(my_对象[0])使用“indexer”表示法。有办法绕过它吗
没有;顾名思义,对象文字是一个对象,而不是数组,因此不能简单地基于索引检索属性,因为它们的属性没有特定的顺序。检索其值的唯一方法是使用特定名称:
var someVar = options.filters.firstName; //Returns 'abc'
或者使用对它们进行迭代。。。在
循环中:
for(var p in options.filters) {
var someVar = options.filters[p]; //Returns the property being iterated
}
ES2020答案
新的操作符终于可以在JavaScript上使用了。但是,一定要注意这一点。您可能需要使用JavaScript编译器将其转换为更向后兼容的内容
根据文件,
空合并运算符(??)是一个逻辑运算符
当其左侧操作数为空时,返回其右侧操作数
null或未定义,否则返回其左侧操作数
如果过滤器[0]
或过滤器[1]
为null
,或未定义,这将确保两个变量的回退值均为'
请注意,nullish coalescing运算符不会返回其他类型错误值的默认值,例如0
和'
。如果希望计算所有伪值,应使用OR运算符| |
逻辑空值赋值,2020+解决方案
已添加一个新的运算符,??=
。这相当于value=value??默认值
||=
和&&=
类似,下面的链接
检查左侧是否未定义或为空,如果已定义,则检查短路。否则,将为左侧指定右侧值
基本例子
对象/数组示例
功能示例
2021年2月-82%
解构解决方案
问题内容可能已更改,因此我将尝试彻底回答
分解结构允许您从任何具有属性的对象中提取值。当使用空/未定义别名和名称别名时,还可以定义默认值
const options = {
filters : {
firstName : "abc"
}
}
const {filters: {firstName = "John", lastName = "Smith"}} = options
// firstName = "abc"
// lastName = "Smith"
注:资本化事项
如果使用数组,下面是如何操作的
在本例中,将从数组中的每个对象提取名称,并指定其自己的别名。由于对象可能不存在,因此还添加了={}
const options = {
filters: [{
name: "abc",
value: "lots"
}]
}
const {filters:[{name : filter1 = "John"} = {}, {name : filter2 = "Smith"} = {}]} = options
// filter1 = "abc"
// filter2 = "Smith"
92%2020年7月?
应优先于|
,因为它只检查是否有空值和未定义的
以下所有表达式均为真:
(null | |'x')='x';
(未定义的| |‘x’=‘x’;
//大多数时候,你不想看到下面的结果
(''||'x')==='x';
(0 | |‘x’=‘x’;
(假| |'x')=='x';
//-----
//使用??是首选
(空??'x')=='x';
(未定义的?'x')=='x';
//?? 仅适用于null和未定义,这通常更安全
(''??'x')=='';
(0°'x')==0;
(假???'x')==假;
底线:
intj=i??10;
也非常适合在javascript中使用。只需将int
替换为let
星号:检查,如果您真的需要支持这些其他浏览器,请使用。注意,如果0是i的有效值,则这不起作用。如果任何错误都是潜在的有效输入(0
,false
,空字符串),我会这样做:var j=(i==null)?10:i
只替换null
,而不是任何可以计算为false的内容。Groovy中是否有与此等价的内容?如果i
未定义,则会抛出错误。这样对我来说似乎没用。。(?)@phil294var j=(i!=null?i:10)
应该可以工作,因为未定义的是==
空的,所以i!=对于null
和undefined
@LinusGeffarth,null
都是false
,请注意,这个有趣的for in
JS循环只对对象文本有效!它在JS数组(给出索引)和JS映射(给出未定义的)上失败得很惨。希望你不要忘记这一点,否则你会遇到一个惊喜!你是一个指出这一点的精灵。完美,因为我们不支持IE
let a // undefined
let b = null
let c = false
a ??= true // true
b ??= true // true
c ??= true // false
// Equivalent to
a = a ?? true
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" }
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 }
const options = {
filters : {
firstName : "abc"
}
}
const {filters: {firstName = "John", lastName = "Smith"}} = options
// firstName = "abc"
// lastName = "Smith"
const options = {
filters: [{
name: "abc",
value: "lots"
}]
}
const {filters:[{name : filter1 = "John"} = {}, {name : filter2 = "Smith"} = {}]} = options
// filter1 = "abc"
// filter2 = "Smith"