document.cookie 究竟是如何工作的?

Posted

技术标签:

【中文标题】document.cookie 究竟是如何工作的?【英文标题】:How exactly does document.cookie work? 【发布时间】:2011-10-11 03:22:02 【问题描述】:

如果我通过进入控制台并输入 document.cookie; 让 Chrome 向我显示 document.cookie,它会给我说:

"name=John; gender=male";

但是如果我输入,比如说,document.cookie = 5;,它所做的只是将5; 添加到字符串的开头,所以我得到:

"5; name=John; gender=male";

如果我尝试document.cookie = null;,那么它甚至什么都不做。

这怎么可能?这是一个变量,不是吗?那么为什么赋值运算符没有按应有的方式工作呢?它实际上只是一点语法糖而不是真正的变量吗?如果是这样,糖到底掩盖了什么?

【问题讨论】:

顺便说一句,我不知道这个问题的答案,但是许多语言允许运算符(包括在某些情况下的赋值,很奇怪)被自定义行为覆盖。这非常有用,但也可能导致混乱,例如您在此处的内容。 @Matthew:javascript 不是其中之一,除了宿主对象(如 document)几乎可以做任何他们想做的事情,因为它们不是原生对象。 【参考方案1】:

document.cookie 具有 非常 特殊行为。如您所见,分配给它添加(或更新)一个cookie(或多个cookie),而不是替换所有cookie。这很不寻常。

在MDN阅读所有相关信息。

【讨论】:

@Daniel:这里没有异议。我无法想象为什么它需要如此……迟钝,即使在过去也是如此。我的意思是,带有Cookie 元素的类似数组的东西,多么前沿! ;-) 那么这种“不寻常”的行为是如何实现的呢?是在解释器级别还是 javascript 支持某种运算符重定义? @Jack:document 是 ECMAScript 规范所称的“宿主对象”,而不是本机对象。宿主对象几乎可以做任何他们想做的事情,它们的语义大多在规范之外。最终,the assignment 成为对宿主对象的抽象 PutValue 调用。主机环境(在本例中为浏览器)如何处理取决于主机环境。 我希望我能投票更多...这个信息拯救了我的一天。【参考方案2】:

Why not have a look at MDN?

document.cookies 的赋值运算符右侧的字符串应该是以分号分隔的键值对列表,即document.cookie = "aKey=5" 将设置/更新aKey cookie。

所以是的,document.cookie 表现出特殊行为。

【讨论】:

我希望我不会在这里挑剔,但你的第一个 document.cookie 的复数是故意的吗?我不确定这是否是一个独特的概念。 此外,它现在显示“这篇文章需要技术审查”。尽管如此,它仍然是一个很好的参考页面。谢谢!【参考方案3】:

这是您的“issue”的示例。此外,它还说:

您只需将 cookie 的过期时间更新为 零。

【讨论】:

以上是关于document.cookie 究竟是如何工作的?的主要内容,如果未能解决你的问题,请参考以下文章

尾递归究竟是如何工作的?

泛型究竟是如何工作的?

这个 Promise 示例究竟是如何工作的?

Spring BeanPostProcessor 究竟是如何工作的?

Django 内容类型究竟是如何工作的?

bufferedReader() 在 Kotlin 中究竟是如何工作的?