解决方案 »

  1.   

    “那么第二次给document.cookie赋值的时候应该完全覆盖第一次赋值”
    有什么根据?
      

  2.   

    document.setCookie= function('xxxx'){
    }document.getCookie=function(){
       return 'xxxx';
    }属性访问
    cookie就是一个属性 面向对象中的属性 并不是直接意义上的 = 赋值
    当你调用 cookie = 'xxxxx'的时候实际调用的是 setCookie('xxxxxx');
      

  3.   

    首先了解一下Cookiede格式和内容:
    document.cookie="name=value;expires=DATE;path=PATH";后面还有几个属性没有写
    第一个为cookie的名字(每个cookie都有一个名字,不然就没法区分哦!)  第二个为有效日期
    LZ的问题中有两个name而且值不一样 说明是两个不同的cookie...
      

  4.   

    var a = "a";
    a = "b";
    alert(a);
    结果应该是“b”不是“ab”吧
      

  5.   

    那估计是这样了...就是搞不懂着内在怎么实现的!也不像是模拟的java运算符重载!
      

  6.   

    那估计是这样了...就是搞不懂着内在怎么实现的!也不像是模拟的java运算符重载!
    不要估计  就是这样 这样才叫属性
      

  7.   

    那估计是这样了...就是搞不懂着内在怎么实现的!也不像是模拟的java运算符重载!
    不要估计  就是这样 这样才叫属性
    恩..看来我面相对象的思想还不成熟!需要慢慢修炼..谢大虾赐教..改日必当猴宝
      

  8.   

    var a = "a";
    a = "b";
    alert(a);
    结果应该是“b”不是“ab”吧
    你这里的a是变量,cookie不是变量~
    楼上也都解释的差不多了,简单来讲就是每“document.cookie=...”一次,就往cookie里放一个字符串格式的键值对,最后所有的键值对一起才构成完整的cookie。
      

  9.   

    var cookie  这么写不对的吧、、
      

  10.   


    难道cookie是关键字!就算不是关键字  按照我的理解也是  “声明一个交过cookie的变量”。。
      

  11.   

    我当时的思维:
    1.document.cookie 并不是简简单单的string!
    2.假设其为Object.
    3.var cookie = document.cookie; 就拿到一个Object的引用。
    4.通过改变 cookie引用和直接改变document.cookie的结果一样!
    5.实验结果越是不同!
    6.最终结果:A.当把document.cookie当右值使用,表现出String的特性!
               B.当document.cookie当左值使用时,表现出Object的特性!
    7.至于怎么实现的,至今没搞懂!以后再看吧
      

  12.   

    很明显,document.cookie= ***的赋值方式,
    是累加的。
      

  13.   

    不像是累加,document.cookie="star=escape('Jordan')"
    如果cookie中已经有了name为star的,不累加而是改变原来的值!
      

  14.   

    楼主楼主,我来给你解释!!在C++中,有一种东西叫操作符重载,这里完全可以理解为赋值符号“=”被重载了。好吧,你要是说这里是js,不用操作符重载的概念解释也ok。在javascript 1.8版本中(不好意思,不知道是不是1.8,反正最新的就是),有一种东西叫属性的setter和getter,其中的setter就是用来处理属性的赋值操作的。新版中,object可以写成这样:var obj = {
      get a(){ return 1;},
      set a(){ }
    };
    console.log(a);
    我们来构造一个和cookie属性一样神奇的属性。var obj = (function(){
      var data = {};
      return {
        set cookie(c){
           c = c.split('=');
           if(c[0] && c[1]) {
              data[c[0]] = c[1];
           }
        },
        get cookie(){
           var r = [];
           for(var i in data) {
               r.push(i+'='+data[i]);
           }
           return r.join(';');
        }
      }
    })();obj.cookie = "sid=fdsafasf";
    obj.cookie = "lang=zh-cn";
    console.log(obj.cookie)://sid=fdsafasf;lang=zh-cn
    这里只是简单的模仿了document.cookie的运作方法。
    LZ的疑惑关键在于这个赋值号,其实这个符号和普通的变量的赋值不一样,它在引擎内部被重载了,实际运行了某个方法。请在最新的chrome中测试以上代码。
      

  15.   

    笔误,更正,第一段代码最后一行应为console.log(obj.a);var obj = {
      get a(){ return 1;},
      set a(){ }
    };
    console.log(obj.a);
      

  16.   

    不像是累加,document.cookie="star=escape('Jordan')"
    如果cookie中已经有了name为star的,不累加而是改变原来的值!是啊,就像session一样,你有对应的name就不会生成新的了,
    看是否累加,你每次赋值后,alert打印下cookie的值就知道了。
      

  17.   

    不像是累加,document.cookie="star=escape('Jordan')"
    如果cookie中已经有了name为star的,不累加而是改变原来的值!是啊,就像session一样,你有对应的name就不会生成新的了,
    看是否累加,你每次赋值后,alert打印下cookie的值就知道了。
    其实我就是想知道它内部是怎么实现的!
      

  18.   

    不像是累加,document.cookie="star=escape('Jordan')"
    如果cookie中已经有了name为star的,不累加而是改变原来的值!是啊,就像session一样,你有对应的name就不会生成新的了,
    看是否累加,你每次赋值后,alert打印下cookie的值就知道了。
    其实我就是想知道它内部是怎么实现的!就是简单的字符串操作啊,你可以模拟一下。
      

  19.   

    不像是累加,document.cookie="star=escape('Jordan')"
    如果cookie中已经有了name为star的,不累加而是改变原来的值!是啊,就像session一样,你有对应的name就不会生成新的了,
    看是否累加,你每次赋值后,alert打印下cookie的值就知道了。
    其实我就是想知道它内部是怎么实现的!就是简单的字符串操作啊,你可以模拟一下。要是cookie是简单的属性,第二次赋值,应该会被覆盖,然而cookie显然不是。var my = {}; my.name = "aaa"; my.name ="bbb"; alert(my.name);name属性只记住了最后的bbb,然后document.cookie不然。这就是LZ开这个贴的目的。cookie岂止不是简单字符串赋值,也不是简单的字符串拼接操作,其实cookie操作时,浏览器内部还会有互斥锁,因为如果多tab同时对同一个域下的某个同名cookie写操作,没有互斥锁那显然要出问题,和数据库锁的概念是相同的。题外话了。
      

  20.   

    不像是累加,document.cookie="star=escape('Jordan')"
    如果cookie中已经有了name为star的,不累加而是改变原来的值!是啊,就像session一样,你有对应的name就不会生成新的了,
    看是否累加,你每次赋值后,alert打印下cookie的值就知道了。
    其实我就是想知道它内部是怎么实现的!就是简单的字符串操作啊,你可以模拟一下。要是cookie是简单的属性,第二次赋值,应该会被覆盖,然而cookie显然不是。var my = {}; my.name = "aaa"; my.name ="bbb"; alert(my.name);name属性只记住了最后的bbb,然后document.cookie不然。这就是LZ开这个贴的目的。cookie岂止不是简单字符串赋值,也不是简单的字符串拼接操作,其实cookie操作时,浏览器内部还会有互斥锁,因为如果多tab同时对同一个域下的某个同名cookie写操作,没有互斥锁那显然要出问题,和数据库锁的概念是相同的。题外话了。tab页是共享sission和cookie的,新窗口才是不同的session和cookie,至于cookie内部怎么实现的,我觉得不应该有那么复杂吧。
      

  21.   

    不像是累加,document.cookie="star=escape('Jordan')"
    如果cookie中已经有了name为star的,不累加而是改变原来的值!是啊,就像session一样,你有对应的name就不会生成新的了,
    看是否累加,你每次赋值后,alert打印下cookie的值就知道了。
    其实我就是想知道它内部是怎么实现的!就是简单的字符串操作啊,你可以模拟一下。要是cookie是简单的属性,第二次赋值,应该会被覆盖,然而cookie显然不是。var my = {}; my.name = "aaa"; my.name ="bbb"; alert(my.name);name属性只记住了最后的bbb,然后document.cookie不然。这就是LZ开这个贴的目的。cookie岂止不是简单字符串赋值,也不是简单的字符串拼接操作,其实cookie操作时,浏览器内部还会有互斥锁,因为如果多tab同时对同一个域下的某个同名cookie写操作,没有互斥锁那显然要出问题,和数据库锁的概念是相同的。题外话了。tab页是共享sission和cookie的,新窗口才是不同的session和cookie,至于cookie内部怎么实现的,我觉得不应该有那么复杂吧。正因为共享cookie,所以才需要写互斥啊。LZ说的是cookie作为document的属性,和js中普通的属性表现的不一样,这才是题主的问题所在。
    敢说LZ提出来的不对么?document.cookie这个属性和js中其他内置或者自定义的对象的属性对比一下,难道不古怪么?