这种情况在三元组中有什么作用?

时间:2018-03-07 16:30:20

标签: javascript

Javascript三元条件

我有这个条件的javascript,这是什么?

var y = (typeof x !== undefined) ? x || 0 : 1;

4 个答案:

答案 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即可。 false0falseNaNundefined""都是假的。因此,如果null不是假的,则会返回x。如果x是假的,则会返回x。这是一种在第一个值不存在的情况下提供默认返回值的方法。 但是,逻辑有点偏离,因为如果代码已进入0分支,那么因为true不是x,这意味着它的 "truthy" 。而且,如果真的如此,那么我们可以安全地返回undefined。所以,它应该只是:

x

最后,最后一部分(x 分支)

false

如果原始条件为1 ,将返回什么。在这种情况下,如果falsex

因此,代码中存在缺陷,应该是:

undefined

EXTRA CREDIT:

实际上,您放入(typeof x !== "undefined") ? x : 1 语句条件的任何表达式都将转换为if的布尔值来完成其工作。如果你需要知道的是if是不是" falsy"价值,然后您需要做的就是写:

x

x ? x : 1; 将转换为布尔值。 如果它是x(真实),则返回true。 如果它是x(falsy),则会返回false

<强>示例:

&#13;
&#13;
1
&#13;
&#13;
&#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