问题讲述:用js 实现一个clone()克隆函数,该函数会把输入进去的不同类型值Number,String,Undefined,Boolean,Function,Null,Object,Array,RegExp,克隆一份出来

一、解题代码

直接贴代码,

function clone(obj){
var copy;
switch(typeof obj){
case 'undefined':break;
case 'number':
case 'string':
case 'boolean':
case 'function':copy = obj;break;
case 'object':
if(obj == null) copy = null;
else if(toString.call(obj) === '[object Array]')
{
copy = [];
for(var i in obj) copy.push(clone(obj[i]));
}
else if(toString.call(obj) === '[object RegExp]')
{
copy = obj;
}
else
{
copy = {};
for(var j in obj)
copy[j]= clone(obj[j]);
}
}
return copy;
}
var a=undefined;
var b=1;
var c="Hello";
var d=true;
var add=function(a,b){
return a+b;
}
var e=null;
var f=[1,2,3];
var g=/^\s+/;
var h={
a:1,
b:2
}
console.log(typeof clone(a));
console.log(typeof clone(b));
console.log(typeof clone(c));
console.log(typeof clone(d));
console.log(clone(add)(1,2));
console.log(Object.prototype.toString.call(clone(e)));
console.log(Object.prototype.toString.call(clone(f)));
console.log(Object.prototype.toString.call(clone(g)));
console.log(Object.prototype.toString.call(clone(h)));

结果:

二、疑问

一开始看到这个问题的时候,就想到typeof [1,2,3]的结果是,这可怎么办,正则表达式,null,object的typeof都是。看上面的代码,是用Object.prototype.toString.call(obj)或者toString.call(obj)来解决的。

那为什么不直接用obj.toString()呢?我们先来看看obj.toString()会输出什么?

null和undefined居然出错了,这是肯定的,因为toString()不可完成null和undefined的转型,用String()才可以

若String()转换的不是null或者undefined,则自动转换为toString().扯远了。。我们说回正题

那么用Object.prototype.toString.call(obj)的结果是什么呢?

居然不一样,这是怎么回事?

原来,虽然Array,Null等类型虽然是Object的实例,但是他们各自都重写了toString()方法,我们试着来验证一下:

var arr=[1,2,3];
console.log(Array.prototype.hasOwnProperty("toString"));//判断原型中是否有toString()方法
console.log(arr.toString());
delete Array.prototype.toString;//删除Array原型里面重写的toString
console.log(Array.prototype.hasOwnProperty("toString"));
console.log(arr.toString());

结果:

很明显真的被改写了。

三、还有一些话

其实有人会说可以用arr instanceof Array来判断是否为数组,其实instanceof在跨frame对象构建的场景下会失效。

关于JS的clone()函数编写的一些问题的更多相关文章

  1. html css <input> javaScript .数据类型 JS中的函数编写方式 BOM总结 DOM总结

    Day27  html css div 块标签. 特点: 独占一行,有高度和宽度 span 行元素. 特点:在同一行显示,当前行满了自动去下一行显示. 不识别高度和宽度 1.1.1.1 2.输入域标签 ...

  2. JS中的函数,Array对象,for-in语句,with语句,自定义对象,Prototype

    一)函数 A)JS中的函数的定义格式: function add(a,b) { var sum = a+b; document.write("两个数的和是:" + sum); // ...

  3. js中的函数

    [函数的声明及调用] 基础知识 1.函数声明的格式: function 函数名(参数1,参数2,....){ //函数体 return 结果: } >>>函数调用的格式: 直接调用: ...

  4. JS中给函数参数添加默认值

    最近在Codewars上面看到一道很好的题目,要求用JS写一个函数defaultArguments,用来给指定的函数的某些参数添加默认值.举例来说就是: // foo函数有一个参数,名为x var f ...

  5. JS中给函数参数添加默认值(多看课程)

    JS中给函数参数添加默认值(多看课程) 一.总结 一句话总结:咋函数里面是可以很方便的获取调用函数的参数的,做个判断就好,应该有简便方法,看课程. 二.JS中给函数参数添加默认值 最近在Codewar ...

  6. 学习javaScript必知必会(1)~js介绍、函数、匿名函数、自调用函数、不定长参数

    一.简单了解一下JavaScript(js) 1.什么是js? js:是网景公司开发的,是基于客户端浏览器, 面向(基于)对象.事件驱动式的页面脚本语言. 2.什么场景下使用到js? 表单验证.页面特 ...

  7. Node.js 教程 06 - 函数

    前言: 本篇介绍的是Node.js中的函数,相对于上一篇会简单一点,其实和我们Javascript中的function无异. 好了,废话不多说了,我们进入正题吧. Node.js函数: [示例1:创建 ...

  8. 关于js的回调函数的一点看法

    算了一下又有好几个月没写博客了,最近在忙公司android的项目,所以也就很少抽时间来写些东西了.刚闲下来,我就翻了翻之前看的东西.做了android之后更加感觉到手机端开发的重要性,现在做nativ ...

  9. js立即执行函数

    一.JS立即执行函数的写法 方式1.最前最后加括号 (function(){alert(1);}()); 方式2.function外面加括号   (function(){alert(1);})(); ...

随机推荐

  1. 监听css3的animation动画和transition事件

    webkit-animation动画有三个事件: 开始事件: webkitAnimationStart 结束事件: webkitAnimationEnd 重复运动事件: webkitAnimation ...

  2. JavaScript实现邮箱后缀提示功能

    先来个基础的 需求 根据下面需求实现如示意图所示的邮箱输入提示功能,注意,根据要求只需实现下面功能 当用户没有任何输入时,提示框消失 当用户输入字符后,显示提示框,并且把用户输入的内容自动拼上邮箱后缀 ...

  3. 51Nod1782 圣诞树

    传送门 我居然忘写题解啦!(记忆废) 总的来说这题就是道大数据结构……看我代码长度就知道了,真的是长得要死…… …… 这题的操作都是路径修改单点查询,因此可以树上差分,问题就变成了维护子树中的所有标记 ...

  4. Echarts按需引入后没有显示图例问题

    因为Echarts官网的例子都是引入整个Echarts.js.如果使用按需引入对应模块就要记得引入legend模块,才能显示出图例. 例如这样: require("echarts/lib/c ...

  5. easyui grid 里的可编辑text 加清空图标

    $.extend($.fn.datagrid.defaults.editors, { text: { init: function (container, options) { var _opt = ...

  6. Python基础-列表生成式和生成器表达式

    一.列表生成式(List Comprehension) 列表生成式即List Comprehensions,是Python内置的非常简单却强大的可以用来创建list的生成式. 举个例子,要生成list ...

  7. Linux下C语言操作MySQL数据库

    MySQL是Linux系统下广泛使用的开源免费数据库,是Linux应用程序数据存储的首选. Ubuntu下安装 […]

  8. 提升PPT制作效率和颜值

    [大咖分享]By汤帅,PPT定制师 网站有时比素材库更有效 学会多模板整合利用 网站推荐:花瓣,officeplus,演界网,pptstore 演讲提纲 思维导图听课笔记

  9. Leetcode- Find Minimum in Rotated Sorted Array-ZZ

    http://changhaz.wordpress.com/2014/10/15/leetcode-find-minimum-in-rotated-sorted-array/ Suppose a so ...

  10. 关于 Web 安全,99% 的网站都忽略了这些

    Web安全是一个如何强调都不为过的事情,我们发现国内的众多网站都没有实现全站https,对于其他安全策略的实践更是很少,本文的目的并非讨论安全和攻击的细节,而是从策略的角度引发对安全的思考和重视. 1 ...