[关闭]
@king- 2015-04-12T12:19:09.000000Z 字数 2432 阅读 784

javascript 的几种数据clone方式

web前端开发


Javascript引用其他变量值的时候,如果是基本数据类型则创建新存储空间,并将值存储到新的空间中;如果是引用数据类型则不创建新存储空间,只是将变量地址指向已存在的存储空间,可以多个变量指向同一个空间地址(引用传递)

一、数据类型

基本数据类型:Undefined、Null、Boolean、Number、String
复杂数据类型:Object
引用数据类型:Array Function

Undefined

Undefined类型只有一个值,即特殊的undefined。声明变量但未对其加以初始化时,这个变量的值就是undefined.

Null

Null类型只有一个值,即特殊的null。从逻辑角度来看,null值表示一个空对象指针,而这也正是使用typeof操作符检测null时会返回"object"的原因.

Boolean

Boolean类型只有两个字面值:true和false。在非全等【===】条件下,[0 等于false,非0等于true]/[""空字符串等于false,非空等于true];判断语句中undefined/null等价于boolean的false;

Number

Number类型包括了整数和浮点数值,同时包含了一个特殊的值NaN(非数值 Not a Number),
NaN特点:
1. 任何涉及NaN的操作(例如NaN/10)都会返回NaN
2. NaN与任何值都不相等,包括NaN本身。

可以通过Javascript中的isNaN(val)判断val是否为Number,如果是则返回false,不是则返回true

String

String类型表示由零或多个16位Unicode字符组成的字符序列,字符串可以由单引号(')或双引号(")表示。

Object

对象其实就是一组数据和功能的集合。对象可以通过执行new操作符后跟要创建的对象类型的名称来创建。而创建Object类型的实例并为其添加属性和(或)方法,就可以创建自定义对象.

Object的每个实例都具有下列属性和方法:
  ● constructor——保存着用于创建当前对象的函数
  ● hasOwnProperty(propertyName)——用于检查给定的属性在当前对象实例中(而不是在实例的原型中)是否存在。其中,作为参数的属性名(propertyName)必须以字符串形式指定(例如:o.hasOwnProperty("name"))
  ● isPrototypeOf(object)——用于检查传入的对象是否是另一个对象的原型
  ● propertyIsEnumerable(propertyName)——用于检查给定的属性是否能够使用for-in语句来枚举
  ● toString()——返回对象的字符串表示
  ● valueOf()——返回对象的字符串、数值或布尔值表示。通常与toString()方法的返回值相同。

Array

单个的变量中存储多个值(可以包含以上的所有数据类型的值).

二、typeof 与 instanceof 判断数据类型

typeof:返回一个字符串值,指出该数据的数据类型
instanceof:返回一个 Boolean 值,指出对象是否是特定类的一个实例(也就是基本数据类型不涉及到instanceof的操作)

  1. //1. typeof 的使用
  2. var num = 123;
  3. typeof num;//return number
  4. //2. instanceof 的使用
  5. var obj = {} //也可以 var obj = new Object();
  6. obj instanceof Object //return true
  7. //3. 证明 instanceof 是指出对象是否是特定类的实例
  8. var fun = function(){};
  9. var f = new fun();
  10. f instanceof fun // return true
数据类型 typeof instanceof(Object) instanceof(Function) instanceof(Array)
Undefined undefined - - -
Null object - - -
Boolean boolean - - -
Number number - - -
String string - - -
Object object true false false
Function function true true false
Array object true false true

三、clone的几种方法

  1. var a = 123;
  2. var b = a;
  3. console.log(b);// "123"
  4. a = 456;
  5. console.log(b);// "456"

1 . Array数据clone操作

  1. var arr = [1,2,3,4];
  2. var list = arr.slice(0);//使用数组截取方法可以创建新数组
  3. console.log(list);// "[1,2,3,4]"
  4. arr = [0];
  5. console.log(list);// "[1,2,3,4]"

2 . Object数据clone操作

  1. var obj = {a:"123"};
  2. var b = {};
  3. for(var i in obj){
  4. b[i] = obj[i];
  5. }
  6. console.log(b); // Object{a:"123"}
  7. obj.a = "111";
  8. console.log(b); // Object{a:"123"}

完整写法

  1. function clone(obj){
  2. var o;
  3. if( typeof obj == "object"){
  4. if(obj == null){
  5. o = obj;
  6. }else{
  7. if(obj instanceof Array){
  8. o = [];
  9. for(var i = 0; i < obj.length; i++){
  10. o.push(clone(obj[i]));
  11. }
  12. }else{
  13. o = {};
  14. for(var j in obj){
  15. o[j] = clone(obj[j]);
  16. }
  17. }
  18. }
  19. }else{
  20. o = obj;
  21. }
  22. return o;
  23. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注