Javascript三元条件
我有这个条件的javascript,这是什么?
var y = (typeof x !== undefined) ? x || 0 : 1;
答案 0 :(得分:3)
此(typeof x !== undefined) ? x || 0 : 1;
将始终返回true
,因为typeof
运算符将返回string
。
该条件应比较字符串如下:
(typeof x !== 'undefined') ? x || 0 : 1;
var x;
var str = typeof x !== 'undefined' ? x || 0 : 1;
console.log(str);
.as-console-wrapper { max-height: 100% !important; top: 0; }
条件(三元)运算符说明:
+--- When condition is true
|
| +--- When condition is false
| |
| |
v v
typeof x !== 'undefined' ? x || 0 : 1;
^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
| |
| +---- The condition should be:
| (x === undefined ? 1 : x || 0)
|
+--- Checks for the type of x
var x = 4;
var str = x === undefined ? 1 : x || 0;
console.log(str);// should return 4
var y;
str = y === undefined ? 1 : y || 0;
console.log(str);// should return 1
y = null;
str = y === undefined ? 1 : y || 0;
console.log(str);// should return 0
y = 5;
str = y === undefined ? 1 : y || 0;
console.log(str);// should return 5
y = 5-"5";
str = y === undefined ? 1 : y || 0;
console.log(str); // should return 0
.as-console-wrapper { max-height: 100% !important; top: 0; }
答案 1 :(得分:1)
首先,条件有错误:
(typeof x !== undefined)
因为您要将 类型 与 值 进行比较。
typeof
始终返回一个字符串,而undefined
是一个值。因此,无论类型x
是什么,它都将以字符串形式返回。即使它的值为undefined
,"undefined"
(注意引号?)也会返回其类型,因为字符串"undefined"
有一个typeof === "string"
,条件实际上会分支到true
部分,即使x
实际上 undefined
。
所以,它必须是:(typeof x !== "undefined")
。
或者,您可以针对 值 {{1}测试x
的 值 }}:
undefined
但是,你不能混合搭配价值和类型。
现在,假设我们更正了,下一部分((x !== undefined)
分支):
true
只要不是 "falsy" (即任何可转换为布尔x || 0
的值),只需返回x
即可。 false
,0
,false
,NaN
,undefined
或""
都是假的。因此,如果null
不是假的,则会返回x
。如果x
是假的,则会返回x
。这是一种在第一个值不存在的情况下提供默认返回值的方法。 但是,逻辑有点偏离,因为如果代码已进入0
分支,那么因为true
不是x
,这意味着它的 "truthy" 。而且,如果真的如此,那么我们可以安全地返回undefined
。所以,它应该只是:
x
最后,最后一部分(x
分支)
false
如果原始条件为1
,将返回什么。在这种情况下,如果false
为x
。
因此,代码中存在缺陷,应该是:
undefined
EXTRA CREDIT:
实际上,您放入(typeof x !== "undefined") ? x : 1
语句条件的任何表达式都将转换为if
的布尔值来完成其工作。如果你需要知道的是if
是不是" falsy"价值,然后您需要做的就是写:
x
x ? x : 1;
将转换为布尔值。
如果它是x
(真实),则返回true
。
如果它是x
(falsy),则会返回false
。
<强>示例:强>
1
&#13;
答案 2 :(得分:0)
条件
(typeof x !== undefined)
询问x
是否不属于undefined
类型。或者,如果定义了x
。这将包括任何值,甚至包括null
。
...? x || 0
如果是这样,表达式的计算结果如下。在大多数情况下,x
的值是0
,如果x
被评估为布尔值false
,则为null
,例如false
,... : 1;
等等。
x
否则(即1
未定义的情况),评估为var y;
if(typeof x !== undefined) {
if(x)
y = x;
else
y = 0;
}
else
y = 1;
。
键入Javascript很复杂(在我看来),有时候在比较混合类型的东西时要记住它是不容易的,请参阅https://dorey.github.io/JavaScript-Equality-Table/获取摘要矩阵。
答案 3 :(得分:0)
承认你有一个左手操作数,它的作用与:
相同def currentFunc(api):
#function returns ['banana', 'bananas', 'ban'] but needs the whole lst ...
#['apple', 'banana', 'bananas', 'ban', 'apple phone', 'apple ipad'] returned.
lst = api('ba') #'ba' is chosen for demonstrating the function of api.
return lst
def listFunc():
lst = ['apple', 'banana', 'bananas', 'ban', 'apple phone', 'apple ipad']
api = lambda str: [l for l in lst if l.startswith(str)][:10]
assert currentFunc(api) == lst