JavaScript中的虚假值

Mik*_*gin 18 javascript

今天我有一个有趣的面试问题,让我有点困惑.我被问及虚假的价值观.所以undefined,NaN,null,0和一个空字符串都计算为false.在JavaScript中知道这有用的原因是什么?我唯一能想到的就是不必这样做:

if (mystring === '' || mystring === undefined) { }
Run Code Online (Sandbox Code Playgroud)

我可以做这个:

if (!mystring)
Run Code Online (Sandbox Code Playgroud)

这是唯一有用的应用程序吗?

Mar*_*pel 20

您必须注意的一个关于虚假价值的危险问题是在检查某个财产的存在时.

假设您要测试新属性的可用性; 当该属性实际上具有的价值0或者"",你不能简单地通过检查其可用性

if (!someObject.someProperty)
    /* incorrectly assume that someProperty is unavailable */
Run Code Online (Sandbox Code Playgroud)

在这种情况下,您必须检查它是否真的存在:

if (typeof someObject.someProperty == "undefined")
    /* now it's really not available */
Run Code Online (Sandbox Code Playgroud)

还要注意,NaN不等于任何东西,甚至不等于它自己(NaN != NaN).

  • @Adam:一个缺点:`undefined`*可能*被覆盖.或者使用`in`操作符:`if(对象中的"property")` (4认同)
  • 检查类型是不必要的.如果要检查属性是否存在,通常需要知道它是未定义还是null.对于该检查,请执行if(someObject.someProperty == null).如果你只是想检查它是否未定义do if(someObject.someProperty === undefined). (2认同)

kyb*_*kos 8

JavaScript中有'falsey'值有两个独立的问题.

首先是官方转换方案,即Boolean(x)返回的方案.当x为false或0或NaN或null或undefined或""时返回false,否则返回true.这与行为相同

if (condition) {/*true path*/} else {/*false path*/}
Run Code Online (Sandbox Code Playgroud)

也就是说,如果Boolean(condition)返回false则执行false path,否则执行true path.此行为通常用于检查是否已定义属性.但是,除非您确定属性是对象或数组(如果已定义),否则这样做是不安全的.测试属性是否已定义的最安全方法是执行此操作

if (property != null) { /*property is defined*/} 
Run Code Online (Sandbox Code Playgroud)

这可以确保该属性不为null或未定义.如果您只想确保该属性未定义,请执行

if (property !== undefined) { /*property is not undefined (but may be null)*/ } 
Run Code Online (Sandbox Code Playgroud)

(注意额外= in!==).

其次,有所有值== false.这是可以强制为0的所有内容(这是被强迫的内容).这包括除NaN之外转换为false的所有值(由于它永远不= =任何东西而不能== false),null和undefined.但它还包括转换为字符串然后转换为数字的所有对象等于0.例如,这包括转换为字符串时为空字符串""或"0"或"-0"的所有内容例如,"或"+"0"或"0x00"或"000"或"0e0"或"0.0000"....

({toString: function() {return "-00.0e000";}}) == false
Run Code Online (Sandbox Code Playgroud)

是真的.有趣的是,这包括空数组,以及只包含一个返回空或0字符串的其他项的任何数组嵌套,因为呈现为字符串的数组仅显示没有周围括号的内容.那是,

[[[[0]]]] == false; // Because [[[[0]]]].toString() === "0"
[] == false;
[[[""]]] == false;
["0"] == false;
[[({toString: function() {return "0";}})]] == false;
Run Code Online (Sandbox Code Playgroud)

这里描述用于计算== false的完整算法.

这很重要的原因是,如果您不理解这些规则中的大多数,它会导致细微的,难以发现的错误.最重要的要点可能是if (condition)作品和使用===的方式避免了大多数其他疯狂的东西.


JAL*_*JAL 5

了解它在JS中是如何工作的很重要,所以你并不感到惊讶.不一定是什么是虚假的,但什么是真实的以及它们如何相互比较.

一个例子是'0'被认为等于0 = =,但它不等于'' - 尽管0是.JavaScript比较并不总是传递的.

所以这意味着仅仅因为(foo==bar && bar==fizz)是真的,(foo==fizz)并不总是如此.要使用上面的示例,'0'== 0,0 =='',但是'0'!='' - 因为您正在比较后一个实例中的字符串,因此将它们作为字符串进行比较而不是强制数字.