Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/464.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如果在JavaScript中为null或未定义,则替换值_Javascript - Fatal编程技术网

如果在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
未定义,则会抛出错误。这样对我来说似乎没用。。(?)@phil294
var 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"