标签:
在JavaScript中的每一个值都属于一种数据类型,JavaScript的数据类型分6种。这6种数据类型又分成两类: 原始类型(primitive type) 和 对象类型(object type) 原始类型包括3种数据类型:
数值(Number)
布尔(Boolean)
字符串(String)
对象类型包括3种数据类型:
对象(Object)
数组(Array)
函数(Function)
除了以上的6种数据类型,JavaScript还额外定义了两个特殊的原始值: null(空) 和 undefined(未定义) ,它们不是数值、字符串和布尔值,它们通常代表各自特殊类型的唯一成员。 普通的JavaScript对象是“命名值”的无序集合。但是数组和函数也是特殊的的对象: 数组是一种带编号的值的有序集合对象 函数是具有与它相关联的可执行代码的对象 使用 typeof() 方法判断一个值属于什么类型:
1 typeof 123 //"number" 2 typeof "123" //"string" 3 typeof true //"boolean"
除了三种基本类型,使用typeof()方法测试,函数将会返回”Function”,undefined将会返回 undefined :
1 var F = function(){} 2 typeof F // "function" 3 typeof undefined // "undefined"
通过这一特性,我们可以在程序中检查变量是否有被定义:
if(typeof o == "undefined"){ //ReferenceError: o is not defined }
除了以上的5中返回类型之外,其他所有的数据类型都会返回 object :
1 typeof null; //"object" 2 typeof {}; //"object" 3 typeof []; //"object"
为了能够显示的区分对象和数组,我们需要用到另外一个运算符 instanceof :
1 var o = {} 2 o instanceof Object; //true 3 o instanceof Array; //false 4 var a = [] 5 a instanceof Object; //false 6 a instanceof Array; //true
null 和 undefined 同样是描述“空值”,但是可以将undefined理解成更加深层次的“空值”。null通常表示变量已经被定义,但是没有赋予初始值,实际上很多情况下确实是这样定义变量的:
var str = null; //表示先定义一个空的变量str,供后面的程序使用
Javascript中的包装对象 在Javascript中,对象是一种复合值,是属性和已经命名的值得集合。通过”.”符号来引用属性值和方法,但是我们看到字符串也有同样的属性和方法:
var s = "hello world"; var word = s.substring(s.indexOf(" ")+1,s.length); //使用字符串的属性
实际上只要引用了字符串s的属性,JavaScript就会将字符串通过调用 new String(s) 的方式转换成对象,这个对象继承了字符串的方法,并被用来处理属性和引用。一旦属性引用结束,这个新创建的对象就会被销毁。 同字符串一样,数组和布尔值都有各自的方法:通过 Number() 和 Boolean() 构造函数来创建一个临时对象。null和undefined没有临时包装对象,访问他们的属性会返回一个类型错误。
var s = "test"; s.len = 4; var t = len;
当运行上面代码的时候t的值会返回undefined,因为第二行定义的变量len会在定义之后随即销毁。这段代码说明在读取字符串、数字和布尔值的属性时,表现得会和一般对象一样。但是尝试为其赋值的时候则会被忽略。 存取字符串、数字或布尔值的属性时创建的临时对象称作包装对象,和普通对象最明显的区别是包装对象的属性都是只读的。 同样也可以通过构造函数显式地创建包装对象:
var s = "test",n = 1,b=true; //一个字符串、数字和布尔值 var S = new String(s); //一个字符串对象 var N = new Number(n); //一个数值对象 var B = new Boolean(b); //一个布尔对象
使用”==”来检测s,n,b和S,N,B的时候将会返回true,通过 typeof() 运算符可以看到原始值和其包装对象的不同。 在JavaScript中原始值和对象有着根本的区别,原始值是不可更改的。对字符串而言,使用字符串的方法看似改变了其值,实际上返回的是一个新的字符串。例如:
var s = "hello"; //定义一个由小写字母组成的字符串 s.toUpperCase(); //返回“HELLO”,但并没有改变s的值 s; //"hello",原始值并未改变
原始值的比较只有他们的值相等的时候才相等,例如两个单独的字符串比较,只有当他们的长度相等且每个索引的字符相等的时候才相等。而对于对象而言,即使两个对象包含相同的属性和相同的值,他们也是不相等的。各个索引元素完全相等的数组也不相等。
var o = {x:1}, p = {x:1}; o === p; //false var a = [],b=[]; a === b; //false
对象的比较都是引用的比较,只有当他们引用同一个对象的时候他们才相等:
var a = []; var b = a; b[0] = 1; a[0]; //1 a === b; //true
想要得到一个对象或数组的副本,必须显式地复制每一条属性或元素:
var a = ["a","b","c"]; var b = []; for(var i=0;i<a.length;i++){ b[i] = a[i] }
同样的,如果想比较两个单独的对象或数组,则必须显式地比较他们的每一条属性或元素:
function equalArrays(a,b){ if(a.length != b.length) return false; //长度不等的数组不相等 for(var i=0;i < a.length;i++){ if(a[i] != b[i]) return false; //任意元素不相等则不相等 } return true; }
标签:
原文地址:http://www.cnblogs.com/suliang1100/p/4459845.html