gpt4 book ai didi

javascript - Javascript 表达式 'a = a || function() {...}' 是什么意思?

转载 作者:可可西里 更新时间:2023-11-01 01:22:55 24 4
gpt4 key购买 nike

我不确定这个构造是什么意思,但我已经见过几次了。下面的示例来自另一个 Stack Overflow 问题。我不确定如何解释初始的“或”构造本身:

Object.keys = Object.keys || (function () {
var hasOwnProperty = Object.prototype.hasOwnProperty,
hasDontEnumBug = !{toString:null}.propertyIsEnumerable("toString"),
DontEnums = [
'toString', 'toLocaleString', 'valueOf', 'hasOwnProperty',
'isPrototypeOf', 'propertyIsEnumerable', 'constructor'
],
DontEnumsLength = DontEnums.length;
//etc...
});

最佳答案

a = a || function(){...} 是一个在 Javascript 中非常常见的习语。它依赖于两个概念,虽然这两个概念不是 Javascript 独有的,但您可能还不熟悉。

1。 运营商短路

Operator short circuiting[wikipedia]是一种编译器优化,旨在防止不必要的评估。

为了证明这一点,让我们假设我们要确定一个人是否是青少年:也就是说,一个人的年龄是否在 13 到 19 岁之间(含)。

var isTeenager = person.age >= 13 && person.age <= 19;

现在,让我们假设代码执行后发现此人小于 13 岁。第一个条件将被评估并返回 false。由于程序现在知道 && 运算符的左侧是 false,并且由于 && 要求两边都是 true 为了评估为 true,它知道评估右侧是没有意义的。

换句话说,程序看到这个人的年龄不超过13岁,就知道他不是青少年,不会在意他是否小于19岁。

同样的原则适用于 || 运算符。假设我们想知道一个人是否可以免费乘坐公共(public)汽车:也就是说,这个人是否超过 70 岁或有残疾。

var canRideFree = person.age >= 70 || isHandicapped(person);

如果这个人超过 70 岁,程序已经知道他可以免费乘车。此时,程序不关心他是否残疾,因此不评估对 isHandicapped 函数的调用。另一方面,如果此人小于 70 岁,则 canRideFree 将设置为 isHandicapped 返回的值。

2。 真假值

Truthy and falsy values[some random person's blog]是对象的 bool 值评估。在 Javascript 中,每个对象都将评估为“真实”或“虚假”值。

如果表达式的值是以下任何一个,则表达式是“假的”:

false, null, undefined, 0, "", NaN

其他都是真实的。

人们利用 null 或 undefined variable 的计算结果为 false 这一事实。这意味着您可以非常轻松地检查变量是否存在:

if (a) { /* a exists and is not a falsy value */ }

结合我们所知道的

|| 运算符短路并返回它计算的最后一个表达式的值。这个原则与真实性结合在这个单一的陈述中:

Object.keys = Object.keys || function() {...}

如果 Object.keys 为真,它将被评估并分配给自己。否则,Object.keys 将被分配给函数。这是 Javascript 中非常常见的习惯用法,用于检查值是否已经存在,如果不存在则将其分配给其他对象。

一些其他语言,例如 C#,没有真实性,有一个 null-coalescing operator[MSDN]具有相似的目的。

object Value = PossiblyNullValue ?? ValueIfNull;

在此代码中,Value 将被分配给 PossiblyNullValue,除非它为空,在这种情况下它将被分配给 ValueIfNull

tl;dr [wikipedia]

如果你懒得看我上面说的任何东西,你只需要知道 a = a || function() {...} 基本上完成这段代码的作用:

if (exists(Object.keys)) {
Object.keys = Object.keys;
} else {
Object.keys = function() {...};
}

function exists(obj) {
return typeof obj !== "undefined" &&
obj !== null &&
obj !== false &&
obj !== 0 &&
obj !== "" &&
!isNaN(obj);
}

关于javascript - Javascript 表达式 'a = a || function() {...}' 是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7069302/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com