一个对象合并的函数引发的错误

我有这样一个需求:将一个对象与第二个对象合并起来,如果第二个对象具有第一个对象的属性,以二个对象的值为准。

刚开始感觉这是个很简单的函数,就写成了这样:

/**
 * 将对象src合并至des,遇到相同的属性已des的属性为准,注意属性也要深拷贝
 * @param des 目标对象
 * @param src 要合并的对象
 */
function merge2Object(des,src){
    if(typeof(des)!="object" || typeof(src)!="object") {
        throw new TypeError();
    }
    for(var prop in src){
        if(des.hasOwnProperty(prop))
            continue;
        else
            des[prop] = src[prop];
    }
}

  结果后来遇到了一些错误,经过排查,发现这个函数真是一个渣:我忘记了如果value又是一个对象的话,就会将src对象的某个key对应的value引用过去。这样子可能导致src被一些不起眼的地方修改掉。所以这个函数需要改一下:

function merge2Object(des,src){
    if(typeof(des)!="object" || typeof(src)!="object") {
        throw new TypeError();
    }
    for(var prop in src){
        if(des.hasOwnProperty(prop))
            continue;
        else
        //des[prop] = src[prop];
            des[prop] = deepclone(src[prop]);
    }
}

  

/**
*深度拷贝一个对象
*@param obj 要深度拷贝的对象
*/
function deepclone(obj){
   if (typeof(obj) != "object" || obj == null) //使用==涵盖null和undefined
     return obj;
  //当obj还是一个对象的时候
   var re_obj = {};
   for(var key in obj){
     re_obj[key] = deepclone(obj[key]);//递归下去
  }
return re_obj;
}

看来以后写东西得小心了。  

时间: 2024-11-10 04:43:25

一个对象合并的函数引发的错误的相关文章

【C/C++】Linux下system()函数引发的错误

http://my.oschina.net/renhc/blog/54582 [C/C++]Linux下system()函数引发的错误 恋恋美食  恋恋美食 发布时间: 2012/04/21 11:33 阅读: 11393 收藏: 21 点赞: 8 评论: 4 今天,一个运行了近一年的程序突然挂掉了,问题定位到是system()函数出的问题,关于该函数的简单使用在我上篇文章做过介绍: http://my.oschina.net/renhc/blog/53580 先看一下问题 简单封装了一下sys

Linux下system()函数引发的错误

先看一下问题 简单封装了一下system()函数: 1 int pox_system(const char *cmd_line) 2 { 3     return system(cmd_line); 4 } 函数调用: 1 int ret = 0; 2 ret = pox_system("gzip -c /var/opt/I00005.xml > /var/opt/I00005.z"); 3 if(0 != ret) 4 { 5     Log("zip file fa

宏与内联函数的差异探究----自定义MIN函数引发的错误反省

在C++编程中,函数(包括内联函数)一般都是小写,而宏定义的"函数"(带参数的宏)往往采用大写. 上面这句话,看似稀松平常,但是不遵循这句话却容易导致意想不到的错误!今天就记录一个典型案例: 由于内联函数和宏十分相似,都是在程序运行之前进行的,都是用函数体取代表达式,都可以规避函数调用带来的开销从而提高效率,因此很容易模糊二者的本质区别,以至于忘记本文开头的话.这不,今天我就这么做了.这样做固然不符合编程的规范,然而并非一定会导致错误,除非内联函数名和带参数的宏重名,这时如果函数形参没

linux system函数引发的错误

转: https://my.oschina.net/renhc/blog/54582 先看一下问题 简单封装了一下system()函数: int pox_system(const char *cmd_line) { return system(cmd_line); } 函数调用: int ret = 0; ret = pox_system("gzip -c /var/opt/I00005.xml > /var/opt/I00005.z"); if(0 != ret) { Log(

linux下转格式函数iconv段错误

今天将windows代码移植到Linux下,其中用到了Unicode转char的函数,被坑了一会,相关函数及编码格式,Linux与windows不同,有几点需要注意: 1.wchar_t 在Linux下占用4个字节,在windows下占2个字节: 2.Linux默认的文本编码方式是UTF-8:Linux终端汉字显示的设置方式:vi /etc/sysconfig/i18n: 设置LANG="en_US.UTF-8"或者LANG="zh_CN.UTF-8": 3.ico

一个Sqrt函数引发的血案

我们平时经常会有一些数据运算的操作,需要调用sqrt,exp,abs等函数,那么时候你有没有想过:这个些函数系统是如何实现的?就拿最常用的sqrt函数来说吧,系统怎么来实现这个经常调用的函数呢? 虽然有可能你平时没有想过这个问题,不过正所谓是"临阵磨枪,不快也光",你"眉头一皱,计上心来",这个不是太简单了嘛,用二分的方法,在一个区间中,每次拿中间数的平方来试验,如果大了,就再试左区间的中间数:如果小了,就再拿右区间的中间数来试.比如求sqrt(16)的结果,你先试

?c++ 调用DLL函数,出现错误

Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call. This is usually a result of calling a function declared with one calling convention with a function pointer declared with a different calling convention. 错误原因

Socket进程处理被中断的系统调用及Accept函数返回EINTR错误处理

我们用慢系统调用来描写叙述那些可能永远阻塞的系统调用(函数调用),如:accept.read等.永远阻塞的系统调用是指调用有可能永远无法返回.多数网络支持函数都属于这一类.比如,假设没有客户连接到server上,则server对accept的调用就没有返回保证.类似的.假设客户从未发送过一行要求server回射的文本.则server对read的调用将永不返回.其它慢系统调用的样例是对管道和终端设备的读写. 有一个例外,就是磁盘IO.他一般都返回调用者. 当一个进程阻塞与慢系统调用时捕获到一个信号

c# 调用 matlab 引发初始化错误 异常

1. 除了matlab 编译的DLL 意外还需要引用 MWArray.dll 这个dill 在安装了  MCRInstaller.exe(matlab运行环境之后就会有了): 2. 最重要的一点.net 的运行环境要保持一致,比如 matlab 编译用的 .net4.0 如果你用 4.5或3.5引用 可能会出错. 3. 在使用了matlab的DLL 之外还要使用c++ 或别的 语言的时候,改变了生成的目标平台 也会引发这个错误.(项目属性->生成->目标平台) 改为使用Any CPU 就不会报