javascript中的变量类型思考

有一个小任务,要求如下:

// 使用递归来实现一个深度克隆,可以复制一个目标对象,返回一个完整拷贝// 被复制的对象类型会被限制为数字、字符串、布尔、日期、数组、Object对象。不会包含函数、正则对象等题目解析:

深度克隆一个对象。首先明白这里的对象有哪些类型:数字对象,字符串对象,布尔对象,日期对象,数组对象,Object对象。
其中Number,String,Boolean对象是原始对象,String,Date,Array,Object对象是合成对象数字对象的特点:http://www.w3school.com.cn/jsref/jsref_obj_number.asp字符串对象特点:http://www.w3school.com.cn/jsref/jsref_obj_string.asp对于这些原始对象,直接根据类型(可以通过constructor来判断,例如obj.constructor),然后直接创建该类型的对象,并且返回即可:new Number(obj.valueOf()); new Boolean(obj.valueOf());new String(obj.valueOf());对于复杂对象,那么情况就不一样了。例如日期对象,日期对象的讲解:http://www.w3school.com.cn/jsref/jsref_obj_date.asp
new Date(obj)和 new Date(obj.valueOf())均可以。最需要关注的是数组对象和Object对象:

数组对象可以通过new Array或者字面量方式创建,此处推荐使用字面量创建:[];但是在给克隆数组的时候,需要注意一个问题,数组的属性是否克隆?即当var src=[];src.name="gaga";的时候,src的name属性,到底是否克隆过去??我的理解:既然是克隆么,就是一毛一样,一毛一样么,自然要都克隆了。所以在这里用for(var i in src)的方式进行克隆,也是可以理解的。

function cloneObject(src) {    if(src == null || src == undefined ||typeof(src) != "object"){        return src;    }else{        //为引用类型的        if(src.constructor == Array){//数组            var obj=[];        }else if(src.constructor == Date){//日期            obj = new Date(src);        }else{            obj={};            debugger;            obj.constructor = src.constructor;            obj.__proto__ = Object.getPrototypeOf(src);        }

        for(var i in src){            if(typeof src[i] == "object"){//对象的属性为对象                obj[i] = cloneObject(src[i]);//复制对象给obj            }else{                obj[i] = src[i];            }        }        return obj;    }}

参考文档:http://qianduanblog.com/post/js-learning-30-object-clone-copy.html
时间: 2024-12-11 21:19:44

javascript中的变量类型思考的相关文章

javascript中对变量类型的判断

本文正式地址:http://www.xiabingbao.com/javascript/2015/07/04/javascript-type 在JavaScript中,有5种基本数据类型和1种复杂数据类型,基本数据类型有:Undefined, Null, Boolean, Number和String:复杂数据类型是Object,Object中还细分了很多具体的类型,比如:Array, Function, Date等等.今天我们就来探讨一下,使用什么方法判断一个出一个变量的类型. 在讲解各种方法之

JavaScript中判断变量类型最简洁的实现方法(#################################)

这篇文章主要介绍了JavaScript中判断整字类型最简洁的实现方法,本文给出多个判断整数的方法,最后总结出一个最短.最简洁的实现方法,需要的朋友可以参考下 我们知道JavaScript提供了typeof运算符,因此最容易想到的是用typeof来判断是否是number类型. 复制代码代码如下: 1 2 3 function isNumber(obj) {     return typeof obj === 'number' } 这个函数对于整数和浮点数都没有问题,但对于NaN值也返回true这让

(转)JavaScript中判断对象类型的种种方法

我们知道,JavaScript中检测对象类型的运算符有:typeof.instanceof,还有对象的constructor属性: 1) typeof 运算符 typeof 是一元运算符,返回结果是一个说明运算数类型的字符串.如:"number","string","boolean","object","function","undefined"(可用于判断变量是否存在). 但 type

JavaScript中的值类型和引用类型

先抛出一个题目,阿里的笔试面试题(很基础,但确实是阿里的笔试题) var a = {"x": 1}; var b = a; a.x = 2; a = {"x": 3}; console.log(b.x); 大家觉得最后在控制台输出的结果是多少? 如果你答案是2,那你就没必要接下去看了.如果不是.那你就接着看下去来解决你的疑惑吧! JavaScript中的值类型和引用类型 在javascript里面有两种变量类型,一种是值类型,一种是引用类型. 值类型:数值.布尔型.

JavaScript中的变量

JavaScript作为一种弱类型编程语言,其变量也是松散类型的.但是,这样松散的缺少拘束的变量规则,总会出现很多问题,而事实上,JavaScript中的变量,其实是包含两种数据类型的值:基本类型值和引用类型值,下面就对于这两种形式的变量值进行区分. 首先,要明确的一点是,变量只是一个容器,用来存放不同的值,所以说我们进行的所有操作,只是对存储在变量中的值的操作.先对这两种类型的值进行本质上的区分.第一.保存方式不同.基本类型的值只是一个单纯的字符串,它没有属性和方法(当然例如字符串的lengt

JavaScript中的变量在内存中的具体存储形式

栈内存和堆内存 JavaScript中的变量分为基本类型和引用类型 基本类型是保存在栈内存中的简单数据段,它们的值都有固定的大小,保存在栈空间,通过按值访问 引用类型是保存在堆内存中的对象,值大小不固定,栈内存中存放的该对象的访问地址指向堆内存中的对象,JavaScript不允许直接访问堆内存中的位置,因此操作对象时,实际操作对象的引用 结合代码与图来理解 let a1 = 0; // 栈内存let a2 = "this is string" // 栈内存let a3 = null;

一篇文章带你了解JavaScript中的变量,作用域和内存问题

作者 | Jeskson 来源 | 达达前端小酒馆 1 在JavaScript中的变量分别区分为两种: 一种为基本类型值,一种为引用类型值. 基本类型值指的是简单的数据段 引用类型值为可能由多个值组成的对象 引用类型的值是保存在内存中的对象,JavaScript不允许直接操作对象的内存空间,实际上操作对象的引用而不是实际对象. var dada = new Object(); undefined dada.name = "dada"; "dada" console.

JavaScript 中对变量和函数声明的提前示例

如题所示,看下面的示例(可以使用Chrome浏览器,然后F12/或者右键,审查元素.调出开发者工具,进入控制台console输入)(使用技巧: 控制台输入时Shift+Enter可以中途代码换行) var name = "xiaoming"; (function(){ var name = name || "小张"; console.info(name); })();// 小张 (function(){ name = name || "小张";

JavaScript中的Date类型详解与moment简介

关于JavaScript中的Date类型,相信JSer们都不会陌生吧,但是也必然为那个复杂难记的各种转换函数所头疼,本文将分享一下我对JS中的Date类型的一些知识小总结,并把其中容易犯错的地方指出来,同时简介和推广moment.js这个js库,希望大家看完文章后以后在对Date类处理如鱼得水. 1 时间的唯一性与多样性 某一时刻在全世界任何地区应该是唯一的,时区的不同是为了让地球不同时区的人的中午十二点都是太阳正上当头,形成交流上没有那么多障碍.而这一标准就是大家熟知的格林威治标准时间(Gre