JavaScript基本数据类型和引用数据类型

基本数据类型和引用数据类型

ECMAScript变量可能包含两种不同数据类型的值:

基本类型值和引用类型值。基本类型值指的是简单的数据段,而引用类型值指那些可能由多个值构成的对象。

其中,引用类型的值是保存在内存中的对象。与其他语言不同, JavaScript不允许直接访问内存中的位置,也就是说不能直接操作对象的内存空间。在操作对象时,实际上是在操作对象的引用而不是实际的对象。为此,引用类型的值是按引用访问的。

动态属性

只有给引用数据类型动态的添加属性,将来可以使用。如果基本类型在将来不能使用。

// 引用数据类型
var person  = new object();
person.name ="Nicholas";
alert(person.name );// Nicholas

// 基本数据类型
var name = "Nicholas";
name.age = 27;
alert(name.age);//undefined

复制变量值

当从一个变量向另一个变量复制引用类型的值时,同样也会将存储在变量对象中的值复制一份放到为新变量分配的空间中。不同的是,这个值的副本实际上是一个指针,而这个指针指向存储在堆中的对象。复制操作结束后,两个变量实际上将引用同一个对象。因此,改变其中一个变量,就会影响另个变量,如下面的例子所示:

var objl  = new object();
    var obj2 = obj1;
    objl.name = "Nicholas";
    alert(obj2.name); //"Nicholas

![插入图片]

参数传递

ECMAScript中所有函数的参数都是按值传递的。也就是说,把函数外部的值复制给函数内部的参数,就和把值从一个变量复制到另一个变量一样。

function addTen(num){
num+=10;
return num;}
var count = 20;
var result = addTen(count);
alert(count);//20、没有变化
alert(result); //30}
function setName(obj){
obj.name ="Nicholas";
var person = new object();}

setName(person);
alert(person.name);//Nicholas

有很多开发人员错误地认为:在局部作用域中修改的对象会在全局作用域中反映出来,就说明参数是按引用传递的。为了证明对象是按值传递的,我们再看一看下面这个经过修改的例子:

function setName(obj){
obj.name ="Nicholas"
obj = new object()
obd.name ="Greg";
}
var person new object();
setName(person);
alert(person.name);//Nicholas

检测类型

typeof检测是什么类型,instanceof检测是否属于某类型。

执行环境及作用域

作用域

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
		<script type="text/javascript">
			
			/*
			 * 作用域
			 * 	- 作用域指一个变量的作用的范围
			 * 	- 在JS中一共有两种作用域:
			 * 		1.全局作用域
			 * 			- 直接编写在script标签中的JS代码,都在全局作用域
			 * 			- 全局作用域在页面打开时创建,在页面关闭时销毁
			 * 			- 在全局作用域中有一个全局对象window,
			 * 				它代表的是一个浏览器的窗口,它由浏览器创建我们可以直接使用
			 * 			- 在全局作用域中:
			 * 				创建的变量都会作为window对象的属性保存
			 * 				创建的函数都会作为window对象的方法保存
			 * 			- 全局作用域中的变量都是全局变量,
			 * 				在页面的任意的部分都可以访问的到
			 * 
			 * 		2.函数作用域
			 * 
			 */
			
			var a = 10;
			var b = 20;
			// var c = "hello";
			
			// console.log(window.c);
			
			function fun(){
				console.log("我是fun函数");
			}
			window.fun();
			// window.alert("hello");
		</script>
	</head>
	<body>
	</body>
</html>

声明提前

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
		<script type="text/javascript">
			/*
			 * 变量的声明提前
			 * 	- 使用var关键字声明的变量,会在所有的代码执行之前被声明(但是不会赋值),
			 * 		但是如果声明变量时不适用var关键字,则变量不会被声明提前
			 * 
			 * 函数的声明提前
			 * 	- 使用函数声明形式创建的函数 function 函数(){}
			 * 		它会在所有的代码执行之前就被创建,所以我们可以在函数声明前来调用函数
			 * 	   使用函数表达式创建的函数,不会被声明提前,所以不能在声明前调用	
			 */
			/*console.log("a = "+a);
			
			var a = 123;*/
			
			//fun();
			//函数声明,会被提前创建
			function fun(){
				console.log("我是一个fun函数");
			}
			
			//函数表达式,不会被提前创建
			var fun2 = function(){
				console.log("我是fun2函数");
			};
			fun2();
		</script>
	</head>
	<body>
	</body>
</html>

沒有块级的作用域

对于有块级作用域的语言(java、C、C++)来说,for语句初始化变量的表达式所定义的变量,只会存在于循环的环境之中。而对于 JavaScript来说,由for语句创建的变量i即使在for循环执行结束后,也依旧会存在
于循环外部的执行环境中。

 for(var i = 0 ; i < 5; i++){
            console.log(i);
        }
        alert(i); // 5

垃圾回收

javascript具有自动垃圾收集机制,也就是说,执行环境会负责管理代码执行过程中使用的内存。

垃圾收集机制的原理:找出那些不再继续使用的变量,然后释放其占用的空间。为此,垃圾收集器会按照固定的时间间隔,周期性地执行这一操作。

垃圾收集器必须跟踪哪个变量有用哪个变量没用,对于不再有用的变量打上标记,以备将来收回其占用的内存。用于标识无用变量的策略可能会因实现而异,但具体到浏览器中的实现,则通常有两个策略。

主要有两种垃圾处理方式,分别是标记清除和引用处理。其中标记清除是JavaScript中最常用的垃圾收集方式。

相关推荐
©️2020 CSDN 皮肤主题: 游动-白 设计师:白松林 返回首页