为什么有些人分配JavaScript变量,比如var example=window.example |{};
我看到有人分配JavaScript变量,例如:为什么有些人分配JavaScript变量,比如var example=window.example |{};,javascript,Javascript,我看到有人分配JavaScript变量,例如: var example = window.example || {}; 我想知道为什么会这样。是的,我已经知道| |是OR运算符{};是一个对象文字 如果有人能回答,那就太好了,谢谢 攻击和JavaScript返回最后一个计算表达式的事实 如果LHS是truthy,那么整个表达式都满足(它是|)并且JavaScript返回LHS 如果LHS为falsy,则需要评估RHS,因为它位于逻辑or运算符的另一侧(| |)。即使RHS是falsy,也会返回
var example = window.example || {};
我想知道为什么会这样。是的,我已经知道| |是OR运算符{};是一个对象文字
如果有人能回答,那就太好了,谢谢 攻击和JavaScript返回最后一个计算表达式的事实
如果LHS是truthy,那么整个表达式都满足(它是|
)并且JavaScript返回LHS
如果LHS为falsy,则需要评估RHS,因为它位于逻辑or运算符的另一侧(| |
)。即使RHS是falsy,也会返回它,因为它是最后一个计算的表达式
它通常用于为函数提供默认参数值
var sayHello = function(name) {
name = name || 'Alex';
alert('Hello ' + name);
}
这是一种简写的语法
var example = (typeof window.example == 'undefined') ? {} : window.example;
显然,window.example
只是变量example
注意:这是一个略微的谎言-它不测试“未定义”,它测试“不真实”(空字符串、0、null等)
如果
window.example
包含任何真实值,则将example
设置为该值。如果没有(例如,因为它尚未定义),它将获得一个默认值{}
(空对象)。这通常在多个脚本共享同一对象时使用
每个脚本都包含以下声明:
var example = window.example || {};
当第一个脚本运行时,示例不存在,因此上面的表达式创建一个空对象(window.example的计算结果为false)
然后,当第一个表达式变为true时,其他脚本将重用现有元素
如果您不知道脚本的执行顺序(异步加载或可以移动的小部件),这尤其有用
[编辑]为了跟进您的上述评论,这可能适用于其他JavaScript对象:
Array: var exampleArray = window.exampleArray || [];
String: var exampleString = window.exampleString || "";
如果您知道
|
的功能,那么您就拥有了所需的所有事实。如果window.example
未定义怎么办?如果它已经有值了怎么办?我明白了。所以,如果我想让它成为一个数组文本,我可以选择:var example=window.example | |[];?不仅仅是对象文字,对吗?是的,数组很好。您可以对任何变量类型执行此操作,包括| |
左侧和右侧的不同类型,例如var example=someNumber | | someString
还有一件事,这可以用在函数中声明的变量中吗?这不是有点像:var example=window.functionExampleIsDeclaredIn.example | |{};?你能描述一下“短路评估利用”是什么意思吗?@JamesHay链接的维基百科文章有丰富的信息。“然后整个表达式是true
”-不,整个表达式是truthy-如果整个表达式是true
,那么将返回它而不是RH操作数。(我知道你知道这一点,我只是在措辞上很挑剔。)@nnnnnn好的,我会改成:)“满意”?在短路评估方面甚至更好+1.var-example=window.example更简捷?window.example:{}代码>是的,但是当我们解释事情的时候,让我们尽可能地让它容易理解,嗯?:)当然可以,但可能会改变速记语法,使其更为冗长……我不是那么挑剔:)请随意编辑它,但它似乎太迂腐了,我不必担心lol“not truey”?你是说“法尔西”?