有没有"无助"的操作员在JavaScript?
-
20-08-2019 - |
题
是否有一个空结合运营商在Javascript?
例如,在C#我可以这样做:
String someString = null;
var whatIWant = someString ?? "Cookies!";
最好的逼近我可以找出Javascript是使用条件经营者:
var someString = null;
var whatIWant = someString ? someString : 'Cookies!';
这么恶心恕我直言。我可以做的更好?
解决方案
中的JavaScript相当于C#空合并运算符(??
)用逻辑OR(||
)的:
var whatIWant = someString || "Cookies!";
有例(下面澄清),该行为将不匹配的C#,但是这是在JavaScript分配默认/替代值的一般情况下,简洁的方式。
澄清
不管所述第一操作数的类型的,如果它浇铸于false
布尔结果,分配将使用第二操作数。当心以下所有的情况:
alert(Boolean(null)); // false
alert(Boolean(undefined)); // false
alert(Boolean(0)); // false
alert(Boolean("")); // false
alert(Boolean("false")); // true -- gotcha! :)
这意味着:
var whatIWant = null || new ShinyObject(); // is a new shiny object
var whatIWant = undefined || "well defined"; // is "well defined"
var whatIWant = 0 || 42; // is 42
var whatIWant = "" || "a million bucks"; // is "a million bucks"
var whatIWant = "false" || "no way"; // is "false"
其他提示
function coalesce() {
var len = arguments.length;
for (var i=0; i<len; i++) {
if (arguments[i] !== null && arguments[i] !== undefined) {
return arguments[i];
}
}
return null;
}
var xyz = {};
xyz.val = coalesce(null, undefined, xyz.val, 5);
// xyz.val now contains 5
此溶液的工作方式类似于SQL聚结功能,它接受任何数量的参数,并且如果他们都没有的值返回null。它的行为就像C#?运营商在这个意义上说,“”,false和0被认为是NOT NULL,因此算作实际值。如果你来自一个.NET的背景下,这将是最自然的感觉的解决方案。
如果||
作为替代C#的??
的是不是你的情况不够好,因为它吞下空字符串和零,你总是可以编写自己的功能:
function $N(value, ifnull) {
if (value === null || value === undefined)
return ifnull;
return value;
}
var whatIWant = $N(someString, 'Cookies!');
是,它即将到来。这里请参见建议和的建议-nullish - 结合/问题/ 29" 的rel = “noreferrer”>执行情况。
它看起来像这样:
x ?? y
实施例
const response = {
settings: {
nullValue: null,
height: 400,
animationDuration: 0,
headerText: '',
showSplashScreen: false
}
};
const undefinedValue = response.settings?.undefinedValue ?? 'some other default'; // result: 'some other default'
const nullValue = response.settings?.nullValue ?? 'some other default'; // result: 'some other default'
const headerText = response.settings?.headerText ?? 'Hello, world!'; // result: ''
const animationDuration = response.settings?.animationDuration ?? 300; // result: 0
const showSplashScreen = response.settings?.showSplashScreen ?? true; // result: false
没有人提到这里NaN
的潜力,这 - 我 - 也是空肥胖型值。所以,我想我会加入我的两分钱。
对于给定的代码:
var a,
b = null,
c = parseInt('Not a number'),
d = 0,
e = '',
f = 1
;
如果你使用的||
操作,你得到的第一个非假值:
var result = a || b || c || d || e || f; // result === 1
如果您使用典型的聚结的方法,因为这里发布,你会得到c
,其值为:NaN
var result = coalesce(a,b,c,d,e,f); // result.toString() === 'NaN'
<强>的既不强>这些似乎我的权利。在聚结逻辑,可以从你的世界不同的我自己的小世界里,我认为不确定,无效和NaN为所有被“空十岁上下的”。所以,我希望找回从聚结方法d
(零)。
如果任何人的大脑就像我的,要排除NaN
,则此方法将实现这一目标:
function coalesce() {
var i, undefined, arg;
for( i=0; i < arguments.length; i++ ) {
arg = arguments[i];
if( arg !== null && arg !== undefined
&& (typeof arg !== 'number' || arg.toString() !== 'NaN') ) {
return arg;
}
}
return null;
}
对于那些谁想要的代码尽可能短,并且不介意一点点不够清晰,也可以使用这一功能,@impinball的建议。这需要的是,NaN的是永远等于NaN的优势。你可以更多的在这里读了起来:为什么是NaN不等于NaN的“? / A>
function coalesce() {
var i, arg;
for( i=0; i < arguments.length; i++ ) {
arg = arguments[i];
if( arg != null && arg === arg ) { //arg === arg is false for NaN
return arg;
}
}
return null;
}
目前没有支持,但JS-标准化进程正在它:的https:// github上的.com / TC39 /提案-可选链式
当心JavaScript具体定义空。有两个定义为"无价值"在javascript。1.Null:当一个变量是空的,它意味着它没有包含在它的数据,但是可变已经是定义的代码。是这样的:
var myEmptyValue = 1;
myEmptyValue = null;
if ( myEmptyValue === null ) { window.alert('it is null'); }
// alerts
在这种情况下,这种类型的变量是实际的对象。测试它。
window.alert(typeof myEmptyValue); // prints Object
定义:当一个变量没有被定义之前在码,并且正如预期的那样,它不含有任何价值。是这样的:
if ( myUndefinedValue === undefined ) { window.alert('it is undefined'); } // alerts
如果这种情况下,这种类型的你可变是不确定的'.
请注意,如果您使用的类型转换的比较操作员(==),JavaScript会法》同样对于这两个空空的价值观。来区分他们之间始终使用类型的比较严格的操作员(===).
阅读您的澄清后,@Ates古拉尔的答案提供了如何执行你在JavaScript做在C#中相同的操作。
@甘博的回答提供了检查空的最佳方式;然而,需要注意的==
与===
JavaScript中的差异是很重要的尤其的,当涉及到检查undefined
和/或null
的问题。
有是关于两个方面这里的区别一个真正的好文章。基本上,明白,如果你使用==
代替===
的,JavaScript的会尽量合并你比较值和返回什么的这个合并后的比较的的结果。
JS是得到一个空合并运算符! 目前阶段,3搬入阶段-4,耶! https://github.com/tc39/proposal-nullish-coalescing
示例中提案:
const response = {
settings: {
nullValue: null,
height: 400,
animationDuration: 0,
headerText: '',
showSplashScreen: false
}
};
const undefinedValue = response.settings.undefinedValue ?? 'some other default'; // result: 'some other default'
const nullValue = response.settings.nullValue ?? 'some other default'; // result: 'some other default'
const headerText = response.settings.headerText ?? 'Hello, world!'; // result: ''
const animationDuration = response.settings.animationDuration ?? 300; // result: 0
const showSplashScreen = response.settings.showSplashScreen ?? true; // result: false