如果未定义,javascript设置变量

ped*_*ete 159 javascript undefined

我知道我可以测试一个javascript变量然后定义它,如果它是未定义的,但是没有一些方法可以说

var setVariable = localStorage.getItem('value') || 0;

似乎是一种更清晰的方式,我很确定我已经在其他语言中看到过这种情况.

Aln*_*tak 291

是的,它可以做到这一点,但严格来说,如果检索到的值为false,则会分配默认值,而不是真正的未定义.它将因此不仅符合undefined而且null,false,0,NaN,"" (但没有 "0").

如果你想只在变量是严格的时候设置为默认值,undefined那么最安全的方法是写:

var x = (typeof x === 'undefined') ? def_val : x;
Run Code Online (Sandbox Code Playgroud)

在较新的浏览器上,它实际上是安全的:

var x = (x === undefined) ? def_val : x;
Run Code Online (Sandbox Code Playgroud)

但请注意,可以在允许声明名为undefined具有已定义值的变量的旧版浏览器上进行颠覆,从而导致测试失败.

  • @marco在旧浏览器中可能会重新定义`undefined`,导致相等测试失败. (3认同)
  • 我很惊讶这种模式没有包含在更多的JS库中。 (2认同)

Gib*_*olt 53

逻辑空赋值,ES2020+ 解决方案

目前正在向浏览器??=||=、 和 中添加新的运算符&&=。这篇文章将重点放在??=.

这将检查左侧是否为undefinednull,如果已定义则短路。如果不是,则将右侧分配给左侧变量。

比较方法

// Using ??=
name ??= "Dave"

// Previously, ES2020
name = name ?? "Dave"

// Before that (not equivalent, but commonly used)
name = name || "Dave" // name ||= "Dave"
Run Code Online (Sandbox Code Playgroud)

基本示例

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

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

// Equivalent to
a = a ?? true
Run Code Online (Sandbox Code Playgroud)

对象/数组示例

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" }
Run Code Online (Sandbox Code Playgroud)

??= 浏览器支持2021 年 3 月 - 85%

??= Mozilla 文档

||= Mozilla 文档

&&= Mozilla 文档

  • 将此答案复制到另外两个问题([如果 JavaScript 中为 null 或未定义则替换值](/sf/answers/4397715451/) 和 [是否存在“空合并”)真的是一个好主意吗? JavaScript 中的运算符?](/sf/answers/4397704461/))?将 VTC 复制或链接到评论中的相关问题不是更好吗? (2认同)
  • 请注意,某些 IDE (NetBeans) 会将“??=”检测为无效语法。默认自动源格式会将其转换为`?? =` 之间有一个空格,这是无效的 JS。现在要弄清楚如何自定义自动格式化程序...... (2认同)

Ste*_*rne 24

2018年的ES6答案是:

return Object.is(x, undefined) ? y : x;
Run Code Online (Sandbox Code Playgroud)

如果变量x未定义,则返回变量y ...否则,如果定义了变量x,则返回变量x.

  • 我不同意.了解它们并使用适当的一个.特别是,如果两个操作数都可能是"NaN",则使用`Object.is`. (4认同)
  • 据我所知,在这种情况下,`Object.is`并不比`===`更好."===运算符(以及==运算符)也将数值-0和+ 0视为相等,并将Number.NaN视为不等于NaN." (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is)这里没关系. (3认同)
  • 如果Object.is()在100%的用例上工作,并且===在98%的用例上工作,为什么你会冒险使用===?例如:console.log(+0 === -0); //输出true,而console.log(Object.is(+ 0,-0)); //输出false - 哪个更好?负0与正0相同吗?这是你必须问自己的问题,但是如果你使用Object.is(),你总能知道答案.它们不相同,因此输出false是正确和预期的结果. (2认同)
  • 这里的特定上下文总是与“未定义”进行比较。所以 `====` 将在 100% 的时间内工作,而不仅仅是 98%。`===` 的优点是更容易阅读,尤其是一目了然,更短,避免了不必要的方法调用。就我个人而言,我只会在情况需要时使用 `Object.is()`,而在所有其他情况下更喜欢 `===`。 (2认同)

wen*_*jun 14

ES2020 答案

使用Nullish Coalescing Operator,您可以设置默认值(如果value为 null 或未定义)。

const setVariable = localStorage.getItem('value') ?? 0;
Run Code Online (Sandbox Code Playgroud)

但是,您应该知道空合并运算符不会返回其他类型的假值(例如0and )的默认值''

但是,请注意浏览器支持。您可能需要使用像Babel这样的 JavaScript 编译器将其转换为更向后兼容的内容。如果您使用的是 Node.js,则从版本 14开始就支持它。


Bru*_*uno 6

检查似乎更合乎逻辑typeof而不是undefined?我假设您期望一个数字,因为您0在未定义时将var设置为:

var getVariable = localStorage.getItem('value');
var setVariable = (typeof getVariable == 'number') ? getVariable : 0;
Run Code Online (Sandbox Code Playgroud)

在这种情况下,如果getVariable不是数字(字符串,对象,等等),则setVariable设置为0


Mce*_*one 5

我需要在几个地方"设置一个未定义的变量".我使用@Alnitak答案创建了一个函数.希望它可以帮助某人.

function setDefaultVal(value, defaultValue){
   return (value === undefined) ? defaultValue : value;
}  
Run Code Online (Sandbox Code Playgroud)

用法:

hasPoints = setDefaultVal(this.hasPoints, true);
Run Code Online (Sandbox Code Playgroud)


tar*_*rkh 5

在我们的日子里,你实际上可以用 JS 来做你的方法:

// Your variable is null
// or '', 0, false, undefined
let x = null;

// Set default value
x = x || 'default value';

console.log(x); // default value
Run Code Online (Sandbox Code Playgroud)

所以你的例子将起作用:

const setVariable = localStorage.getItem('value') || 0;
Run Code Online (Sandbox Code Playgroud)