JavaScript学习笔记7—内置对象

目录

1.内置对象

2.Math 对象

2.1封装数学对象

2.2绝对值方法Math.abs()

2.3向下取整取整方法Math.floor() 

2.4向上取整Math.ceil()

2.5就近取整(四舍五入)Math.round()

2.6Math对象随机数方法 random()

3.日期对象Date

3.1 Date()方法的使用 

3.2 格式化年月日 

3.3 格式化时分秒

3.4 Date总的毫秒数

3.5 案例-倒计时效果

4.数组对象

4.1 数组对象的创建

4.2 检测是否为数组

4.3 添加删除数组元素

(1)push() 数组的末尾添加一个或者多个数组元素

(2)unshift 数组的开头添加一个或者多个数组元素

(3)pop() 删除数组的最后一个元素  

(4)shift() 删除数组的第一个元素 

4.4 数组排序

4.5 数组索引

4.6 数组转换为字符串

5.字符串对象

5.1 基本包装类型

5.2 字符串的不可变

5.3 根据字符返回位置

5.4 根据位置返回字符

5.5 字符串操作方法

6.简单类型与复杂类型


1.内置对象

(1)JavaScript 中的对象分为3种:自定义对象 、内置对象、 浏览器对象。

(2)前面两种对象是JS基础内容,属于 ECMAScript; 第三个浏览器对象属于JS 独有的。

(3)内置对象就是指 JS 语言自带的一些对象,这些对象供开发者使用,并提供了一些常用的或是最基本而必要的功能(属性和方法)。

(4)JavaScript 提供了多个内置对象:Math、 Date 、Array、String等。

(5)查文档:学习一个内置对象的使用,只要学会其常用成员的使用即可,我们可以通过查文档学习,可以通过MDN/W3C来查询。

2.Math 对象

Math.PI // 圆周率
Math.floor() // 向下取整
Math.ceil() // 向上取整
Math.round() // 四舍五入版 就近取整 注意 -3.5 结果是 -3
Math.abs() // 绝对值
Math.max()/Math.min() // 求最大和最小值

<script>
	// Math数学对象 不是一个构造函数 ,所以我们不需要new 来调用 而是直接使用里面的属性和方法即可
	console.log(Math.PI); // 一个属性 圆周率
	console.log(Math.max(1, 99, 3)); // 99
	console.log(Math.max(-1, -10)); // -1
	console.log(Math.max(1, 99, 'pink老师')); // NaN
	console.log(Math.max()); // -Infinity
</script>

2.1封装数学对象

案例:利用对象封装自己的数学对象  里面有 PI 最大值和最小值

<script>
	// 利用对象封装自己的数学对象  里面有 PI 最大值和最小值
	var myMath = {
		PI: 3.141592653,
		max: function() {
			var max = arguments[0];
			for (var i = 1; i < arguments.length; i++) {
				if (arguments[i] > max) {
					max = arguments[i];
				}
			}
			return max;
		},
		min: function() {
			var min = arguments[0];
			for (var i = 1; i < arguments.length; i++) {
				if (arguments[i] < min) {
					min = arguments[i];
				}
			}
			return min;
		}
	}
	console.log(myMath.PI);
	console.log(myMath.max(1, 5, 9));
	console.log(myMath.min(1, 5, 9));
</script>

2.2绝对值方法Math.abs()

// 1.绝对值方法
console.log(Math.abs(1)); // 1
console.log(Math.abs(-1)); // 1
console.log(Math.abs('-1')); // 隐式转换 会把字符串型 -1 转换为数字型
console.log(Math.abs('pink')); // NaN 

2.3向下取整取整方法Math.floor() 

// (1) Math.floor()   地板 向下取整  往最小了取值
console.log(Math.floor(1.1)); // 1
console.log(Math.floor(1.9)); // 1

2.4向上取整Math.ceil()

// (2) Math.ceil()   ceil 天花板 向上取整  往最大了取值
console.log(Math.ceil(1.1)); // 2
console.log(Math.ceil(1.9)); // 2

2.5就近取整(四舍五入)Math.round()

// (3) Math.round()   四舍五入  其他数字都是四舍五入,但是 .5 特殊 它往大了取  
console.log(Math.round(1.1)); // 1
console.log(Math.round(1.5)); // 2
console.log(Math.round(1.9)); // 2
console.log(Math.round(-1.1)); // -1
console.log(Math.round(-1.5)); // 这个结果是 -1

2.6Math对象随机数方法 random()

random() 方法可以随机返回一个小数,其取值范围是 [0,1),得到一个两数之间的随机整数。

例子:求1-10之间随机整数

// 我们想要得到两个数之间的随机整数 并且 包含这2个整数
// Math.floor(Math.random() * (max - min + 1)) + min;
function getRandom(min, max) {
	return Math.floor(Math.random() * (max - min + 1)) + min;
}
console.log(getRandom(1, 10));

例子:随机点名

// 随机点名  
var arr = ['张三', '张三丰', '张三疯子', '李四', '李思思', 'pink老师'];
console.log(arr[getRandom(0, arr.length - 1)]);

例子:随机生成一个1-10之间的数字,用户猜数字,根据提示直到猜到正确为止。

<!DOCTYPE html>
<html lang="en">
<head>
    <title></title>
    <script>
        // 猜数字游戏
        // 1.随机生成一个1~10 的整数  我们需要用到 Math.random() 方法。
        // 2.需要一直猜到正确为止,所以需要一直循环。
        // 3.while 循环更简单
        // 4.核心算法:使用 if  else if 多分支语句来判断大于、小于、等于。
        function getRandom(min, max) {
            return Math.floor(Math.random() * (max - min + 1)) + min;
        }
        var random = getRandom(1, 10);
        while (true) { // 死循环
            var num = prompt('你猜在1~10之间系统生成的是哪一个数');
            if (num > random) {
                alert('你猜大了');
            } else if (num < random) {
                alert('你猜小了');
            } else {
                alert('你好帅哦,猜对了');
                break; // 退出整个循环结束程序
            }

        }
    </script>
</head>
<body>
</body>
</html>

3.日期对象Date

  • Date 对象和 Math 对象不一样,他是一个构造函数,所以我们需要实例化后才能使用。必须使用new 来调用创建我们的日期对象。
  • Date 实例用来处理日期和时间。
  • 如果Date()不写参数,就返回当前时间。
  • 如果Date()里面写参数,就返回括号里面输入的时间。

3.1 Date()方法的使用 

(1)使用Date,如果没有参数,返回当前系统的当前时间

var date = new Date();
console.log(date);

(2)参数常用的写法:

  • 数字型:2022, 7, 05
  • 字符串型:'2022-7-05 8:8:8'
var date1 = new Date(2022, 7, 5);
console.log(date1); // 返回的是8月 不是7月 
var date2 = new Date('2022-7-5 8:8:8');
console.log(date2);
// 结果:
// Date Tue Jul 05 2022 18:02:49 GMT+0800 (中国标准时间)
// Date Fri Aug 05 2022 00:00:00 GMT+0800 (中国标准时间)
// Date Tue Jul 05 2022 08:08:08 GMT+0800 (中国标准时间)

3.2 格式化年月日 

// 格式化日期 年月日
var date = new Date();
console.log(date.getFullYear()); // 返回当前日期的年  2022
console.log(date.getMonth() + 1); // 月份 返回的月份小1个月   记得月份+1
console.log(date.getDate()); // 返回的是 几号
console.log(date.getDay()); // 3  周一返回的是 1 周六返回的是 6 但是 周日返回的是 0
// 结果:
// 2022
// 7
// 5
// 2
// 写一个 2022年 7月 5日 星期二
var year = date.getFullYear();
var month = date.getMonth() + 1;
var dates = date.getDate();
var arr = ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'];
var day = date.getDay();
console.log('今天是:' + year + '年' + month + '月' + dates + '日 ' + arr[day]);
// 结果:
// 今天是:2022年7月5日 星期二

3.3 格式化时分秒

// 格式化日期 时分秒
var date = new Date();
console.log(date.getHours()); // 时
console.log(date.getMinutes()); // 分
console.log(date.getSeconds()); // 秒
// 要求封装一个函数返回当前的时分秒 格式 08:08:08
function getTimer() {
	var time = new Date();
	var h = time.getHours();
	h = h < 10 ? '0' + h : h;
	var m = time.getMinutes();
	m = m < 10 ? '0' + m : m;
	var s = time.getSeconds();
	s = s < 10 ? '0' + s : s;
	return h + ':' + m + ':' + s;
}
console.log(getTimer());
// 结果:
// 21
// 28 
// 46 
// 21:28:46

3.4 Date总的毫秒数

总毫秒数是从1970年0时0分0秒开始到现在的总计秒数。 

// 获得Date总的毫秒数(时间戳),不是当前时间的毫秒数,而是距离1970年1月1号过了多少毫秒数
// 1970年做为计算机元年,用于计时的开始

// 1. 方法1:valueOf()  方法2:getTime()
var date = new Date();
console.log(date.valueOf()); // 现在时间距离1970.1.1总的毫秒数
console.log(date.getTime());
// 2. 方法3:简单的写法 (最常用的写法)
var date1 = +new Date(); // +new Date()  返回的就是总的毫秒数
console.log(date1);
// 3. 方法4::H5新增的,获得总的毫秒数
console.log(Date.now());
// 结果:
// 1657028816517
// 1657028816517
// 1657028816518
// 1657028816518
// 结果有差异是因为四种方法运行前后存在时间差

3.5 案例-倒计时效果

核心算法:输入的时间减去现在的时间就是剩余的时间,即倒计时 ,但是不能拿着时分秒相减,比如 05 分减去25分,结果会是负数的。

用时间戳来做。用户输入时间总的毫秒数减去现在时间的总的毫秒数,得到的就是剩余时间的毫秒数。

把剩余时间总的毫秒数转换为天、时、分、秒 (时间戳转换为时分秒)。转换公式如下: 

  • d = parseInt(总秒数 / 60 / 60 / 24);    //  计算天数
  • h = parseInt(总秒数 / 60 / 60 % 24)   //   计算小时
  • m = parseInt(总秒数 / 60 % 60 );     //   计算分数
  • s = parseInt(总秒数 % 60);            //   计算当前秒数
<script>
	function countDown(time) {
		var nowTime = +new Date(); // 返回的是当前时间总的毫秒数
		var inputTime = +new Date(time); // 返回的是用户输入时间总的毫秒数
		var times = (inputTime - nowTime) / 1000; // times是剩余时间总的秒数 
		var d = parseInt(times / 60 / 60 / 24); // 计算天数
		d = d < 10 ? '0' + d : d;
		var h = parseInt(times / 60 / 60 % 24); //计算小时
		h = h < 10 ? '0' + h : h;
		var m = parseInt(times / 60 % 60); // 计算分钟
		m = m < 10 ? '0' + m : m;
		var s = parseInt(times % 60); // 计算当前的秒
		s = s < 10 ? '0' + s : s;
		return d + '天' + h + '时' + m + '分' + s + '秒';
	}
	console.log(countDown('2022-7-6 00:00:00'));
	var date = new Date();
	console.log(date);
	// 结果:
	// 00天01时59分54秒
	// Date Tue Jul 05 2022 22:00:05 GMT+0800 (中国标准时间)
</script>

4.数组对象

4.1 数组对象的创建

创建数组对象的两种方式:

  • 字面量方式
  • new Array()
// 创建数组的两种方式
// 1. 利用数组字面量
var arr = [1, 2, 3];
console.log(arr[0]);

// 2. 利用new Array()
// var arr1 = new Array();  // 创建了一个空的数组
// var arr1 = new Array(2);  // 这个2 表示 数组的长度为 2  里面有2个空的数组元素 
var arr1 = new Array(2, 3); // 等价于 [2,3]  这样写表示 里面有2个数组元素 是 2和3
console.log(arr1);

4.2 检测是否为数组

// 方法(1) instanceof  运算符 它可以用来检测是否为数组
var arr = [];
var obj = {};
console.log(arr instanceof Array);//true
console.log(obj instanceof Array);//false

// 方法(2) Array.isArray(参数);  H5新增的方法  ie9以上版本支持
console.log(Array.isArray(arr));//true
console.log(Array.isArray(obj));//false
// 翻转数组
function reverse(arr) {
	// if (arr instanceof Array) {//方法1
	if (Array.isArray(arr)) {//方法2
		var newArr = [];
		for (var i = arr.length - 1; i >= 0; i--) {
			newArr[newArr.length] = arr[i];

		}
		return newArr;
	} else {
		return 'error 这个参数要求必须是数组格式 [1,2,3]'
	}
}
console.log(reverse([1, 2, 3]));//Array(3) [ 3, 2, 1 ]
console.log(reverse(1, 2, 3));//error 这个参数要求必须是数组格式 [1,2,3]

4.3 添加删除数组元素

(1)push() 数组的末尾添加一个或者多个数组元素

  • push 是可以给数组追加新的元素
  • push() 参数直接写 数组元素就可以了
  • push完毕之后,返回的结果是 新数组的长度 
  • 原数组也会发生变化
// 1. push() 在我们数组的末尾添加一个或者多个数组元素 
var arr = [1, 2, 3];
console.log(arr.push(4, 'pink'));
console.log(arr);
// 结果:
// 5 
// Array(5) [ 1, 2, 3, 4, "pink" ]

(2)unshift 数组的开头添加一个或者多个数组元素

  • unshift是可以给数组前面追加新的元素
  • unshift() 参数直接写 数组元素就可以了
  • unshift完毕之后,返回的结果是 新数组的长度 
  • 原数组也会发生变化 
// 2. unshift 在我们数组的开头 添加一个或者多个数组元素
var arr = [1, 2, 3];
console.log(arr.unshift('red', 'purple'));
console.log(arr);
// 结果:
// 5
// Array(5) [ "red", "purple", 1, 2, 3 ]

(3)pop() 删除数组的最后一个元素  

  • pop是可以删除数组的最后一个元素 记住一次只能删除一个元素
  • pop() 没有参数
  • pop完毕之后,返回的结果是 删除的那个元素 
  • 原数组也会发生变化 
// 3. pop() 它可以删除数组的最后一个元素 
var arr = [1, 2, 3];
console.log(arr.pop());
console.log(arr);
// 结果:
// 3 
// Array [ 1, 2 ]

(4)shift() 删除数组的第一个元素 

  • shift是可以删除数组的第一个元素 记住一次只能删除一个元素
  • shift() 没有参数
  • shift完毕之后,返回的结果是 删除的那个元素 
  • 原数组也会发生变化
//4. shift() 它可以删除数组的第一个元素 
var arr = [1, 2, 3];
console.log(arr.shift());
console.log(arr);
// 结果:
// 1 
// Array [ 2, 3 ]

案例:筛选数组

有一个包含工资的数组[1500, 1200, 2000, 2100, 1800],要求把数组中工资超过2000的删除,剩余的放到新数组里面。

<script>
	// 有一个包含工资的数组[1500, 1200, 2000, 2100, 1800],要求把数组中工资超过2000的删除,剩余的放到新数组里面
	var arr = [1500, 1200, 2000, 2100, 1800];
	var newArr = [];
	for (var i = 0; i < arr.length; i++) {
		if (arr[i] < 2000) {
			// newArr[newArr.length] = arr[i];//方法1
			newArr.push(arr[i]);//方法2
		}
	}
	console.log(newArr);
</script>

4.4 数组排序

1.reverse()翻转数组

2.sort()对数组进行排序

<script>
	// 数组排序
	// 1. 翻转数组
	var arr = ['pink', 'red', 'blue'];
	arr.reverse();
	console.log(arr);

	// 2. 数组排序(冒泡排序)
	var arr1 = [13, 4, 77, 1, 7];
	arr1.sort(function(a, b) {
		//  return a - b; //升序的顺序排列
		return b - a; // 降序的顺序排列
	});
	console.log(arr1);
</script>

4.5数组索引

indexOf(数组元素) 正向查找,不存在返回-1

lastIndexOf(数组元素) 反向查找,不存在返回-1

注:如果有重复元素,返回第一个满足条件的索引号

<script>
	// 返回数组元素索引号方法  indexOf(数组元素)  作用就是返回该数组元素的索引号 从前面开始查找
	// 如果同时有两个相同的元素,它只返回第一个满足条件的索引号 
	// 它如果在该数组里面找不到元素,则返回的是 -1  
	var arr = ['red', 'green', 'blue' , 'yellow', 'blue'];
	console.log(arr.indexOf('blue'));//2
	// 返回数组元素索引号方法  lastIndexOf(数组元素)  作用就是返回该数组元素的索引号 从后面开始查找
	console.log(arr.lastIndexOf('blue'));//4
</script>

案例:有一个数组[‘c’, ‘a’, ‘z’, ‘a’, ‘x’, ‘a’, ‘x’, ‘c’, ‘b’],要求去除数组中重复的元素。

分析过程:

① 目标:把旧数组里面不重复的元素选取出来放到新数组中,重复的元素只保留一个,放到新数组中去重。
② 核心算法:我们遍历旧数组,然后拿着旧数组元素去查询新数组,如果该元素在新数组里面没有出现过,我们就添加,
否则不添加。
③ 我们怎么知道该元素没有存在? 利用 新数组.indexOf(数组元素) 如果返回时 -1 就说明 新数组里面没有改元素。

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<script>
			function unique(arr){
				var newArr = [];
				for(var i = 0; i < arr.length; i++){
					if(newArr.indexOf(arr[i]) === -1){
						newArr.push(arr[i]);
					}
				}
				return newArr;
			}
			var demo = unique(['c', 'a', 'z', 'a', 'x', 'a', 'x', 'c', 'b']);
			console.log(demo);
		</script>
	</head>
	<body>
	</body>
</html>

4.6数组转换为字符串

1.toString() 将数组转化为字符串,返回字符串。

2.join(分隔符),返回字符串。

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>数组转字符串</title>
		<script>
			// 1.toString() 将数组转化为字符串
			var arr =[1,2,3];
			console.log(arr.toString());//1,2,3
			// 2.join(分隔符)
			var arr1 = ['blue', 'pink', 'green'];
			console.log(arr1.join());//blue,pink,green
			console.log(arr1.join('-'));//blue-pink-green
			console.log(arr1.join('&'));//blue&pink&green
		</script>
	</head>
	<body>
	</body>
</html>

5.字符串对象

5.1 基本包装类型

为了方便操作基本数据类型,JavaScript 还提供了三个特殊的引用类型:String、Number和 Boolean。

基本包装类型:就是把简单数据类型包装成为复杂数据类型,这样基本数据类型就有了属性和方法。 

// 下面代码有什么问题?
var str = 'andy';
console.log(str.length);

按道理基本数据类型是没有属性和方法的,而对象才有属性和方法,但上面代码却可以执行,这是因为 js 会把基本数据类型包装为复杂数据类型,其执行过程如下 :

// 1. 生成临时变量,把简单类型包装为复杂数据类型
var temp = new String('andy');
// 2. 赋值给我们声明的字符变量
str = temp;
// 3. 销毁临时变量
temp = null;

5.2 字符串的不可变

指的是里面的值不可变,虽然看上去可以改变内容,但其实是地址变了,内存中新开辟了一个内存空间。

var str = 'abc';
str = 'hello';
// 当重新给 str 赋值的时候,常量'abc'不会被修改,依然在内存中
// 重新给字符串赋值,会重新在内存中开辟空间,这个特点就是字符串的不可变
// 由于字符串的不可变,在大量拼接字符串的时候会有效率问题
var str = '';
for (var i = 0; i < 100000; i++) {
str += i;
}
console.log(str); // 这个结果需要花费大量时间来显示,因为需要不断的开辟新的空间

5.3 根据字符返回位置

  • indexOf('要查找的字符',开始的位置) 找不到返回-1。
  • lastIndexOf() 从后往前找。
<script>
	//indexOf('要查找的字符',开始的位置)
	var str = 'abcdefgabcdefg';
	console.log(str.indexOf('d'));//3
	console.log(str.indexOf('d',4));//10 从索引号4的位置开始向后查找d,没有的话返回-1
</script>

案例:查找字符串"abcoefoxyozzopp"中所有o出现的位置以及次数

<script>
	//查找字符串"abcoefoxyozzopp"中所有o出现的位置以及次数
	var str = "abcoefoxyozzopp";
	var index = str.indexOf('o');
	var num = 0;
	//console.log(index);
	while(index !== -1){
		console.log(index);
		num++;
		index = str.indexOf('o',index + 1);
	}
	console.log('o出现的次数是:' + num);
	// 3 
	// 6 
	// 9 
	// 12
</script>

5.4根据位置返回字符

  • charAt(index)根据位置返回字符
  • charCodeAt(index)返回相应索引号的字符ASCII码值
  • str[index]获取指定位置处的字符
<script>
	//根据位置返回字符
	//1.charAt(index)根据位置返回字符
	var str = 'good';
	console.log(str.charAt(3));//d
	//遍历字符串
	for(var i = 0; i < str.length; i++){
		console.log(str.charAt(i));
	}
	// 2.str.charCodeAt(index)返回相应索引号的字符ASCII码值 目的:判断用户按下哪个键
	console.log(str.charCodeAt(0));//97
	// 3.str[index] H5新增
	console.log(str[0]);//a
</script>

案例:判断一个字符串 'abcoefoxyozzopp' 中出现次数最多的字符,并统计其次数。

① 核心算法:利用 charAt() 遍历这个字符串
② 把每个字符都存储给对象, 如果对象没有该属性,就为1,如果存在了就 +1
③ 遍历对象,得到最大值和该字符

首先需要了解一个知识点: 

// 有一个对象 来判断是否有该属性 对象['属性名']
var o = {
	age: 18
}
if (o['sex']) {
	console.log('里面有该属性');

} else {
	console.log('没有该属性');

}

案例代码如下: 

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<script>
			//  判断一个字符串 'abcoefoxyozzopp' 中出现次数最多的字符,并统计其次数。
			// o.a = 1
			// o.b = 1
			// o.c = 1
			// o.o = 4
			// 核心算法:利用 charAt() 遍历这个字符串
			// 把每个字符都存储给对象, 如果对象没有该属性,就为1,如果存在了就 +1
			// 遍历对象,得到最大值和该字符
			var str = 'abcoefoxyozzopp';
			var o = {};
			for (var i = 0; i < str.length; i++) {
				var chars = str.charAt(i); // chars 是 字符串的每一个字符
				if (o[chars]) { // o[chars] 得到的是属性值
					o[chars]++;
				} else {
					o[chars] = 1;
				}
			}
			console.log(o);
			// 2. 遍历对象
			var max = 0;
			var ch = '';
			for (var k in o) {
				// k 得到是 属性名
				// o[k] 得到的是属性值
				if (o[k] > max) {
					max = o[k];
					ch = k;
				}
			}
			console.log(max);
			console.log('最多的字符是' + ch);
		</script>
	</head>
	<body>
	</body>
</html>

5.5字符串操作方法

  • concat('字符串1','字符串2'....)连接字符串
  • substr('截取的起始位置', '截取几个字符')
  • replace('被替换的字符', '替换为的字符')
  • split('分隔符') 字符转换为数组
<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<script>
		    // 字符串操作方法
		    // 1. concat('字符串1','字符串2'....)
		    var str = 'blue';
		    console.log(str.concat('red'));//bluered
		
		    // 2. substr('截取的起始位置', '截取几个字符');
		    var str1 = '改革春风吹满地';
		    console.log(str1.substr(2, 2));//春风  第一个2是索引号,意为从第几个开始;第二个2是取几个字符
			
			// 3. 替换字符 replace('被替换的字符', '替换为的字符')  它只会替换第一个字符
			var str2 = 'andyandy';
			console.log(str2.replace('a', 'b'));//bndyandy
			// 有一个字符串 'abcoefoxyozzopp'  要求把里面所有的 o 替换为 *
			var str3 = 'abcoefoxyozzopp';
			while (str3.indexOf('o') !== -1) {
			    str3 = str3.replace('o', '*');
			}
			console.log(str3);//abc*ef*xy*zz*pp
			
			// 4. 字符转换为数组 split('分隔符')    前面我们学过 join 把数组转换为字符串
			var str4 = 'red, pink, blue';
			console.log(str4.split(','));//Array(3) [ "red", " pink", " blue" ]
			var str4 = 'red&pink&blue';
			console.log(str4.split('&'));//Array(3) [ "red", "pink", "blue" ]
		</script>
	</head>
	<body>
	</body>
</html>

6.简单类型与复杂类型

(1)简单类型又叫做基本数据类型或者值类型,复杂类型又叫做引用类型。

  • 值类型:简单数据类型/基本数据类型,在存储时变量中存储的是值本身,因此叫做值类型。如:string ,number,boolean,undefined,null
  • 引用类型:复杂数据类型,在存储时变量中存储的仅仅是地址(引用),因此叫做引用数据类型。通过 new 关键字创建的对象(系统对象、自定义对象),如 Object、Array、Date等

(2)堆栈空间分配区别:

  • 栈(操作系统):由操作系统自动分配释放存放函数的参数值、局部变量的值等。其操作方式类似于数据结构中的栈;简单数据类型存放到栈里面。
  • 堆(操作系统):存储复杂类型(对象),一般由程序员分配释放,若程序员不释放,由垃圾回收机制回收。复杂数据类型存放到堆里面 。
  • 注意:JavaScript中没有堆栈的概念

(3)简单类型的内存分配

值类型(简单数据类型): string ,number,boolean,undefined,null

值类型变量的数据直接存放在变量(栈空间)中

(4)复杂类型的内存分配

引用类型(复杂数据类型):通过 new 关键字创建的对象(系统对象、自定义对象),如 Object、Array、Date等。

引用类型变量(栈空间)里存放的是地址,真正的对象实例存放在堆空间中

(5)简单类型传参

函数的形参也可以看做是一个变量,当我们把一个值类型变量作为参数传给函数的形参时,其实是把变量在栈空间里的值复制了一份给形参,那么在方法内部对形参做任何修改,都不会影响到的外部变量。 

(6)复杂类型传参

函数的形参也可以看做是一个变量,当我们把引用类型变量传给形参时,其实是把变量在栈空间里保存的堆地址复制给了形参,形参和实参其实保存的是同一个堆地址,所以操作的是同一个对象。


学习视频:黑马前端,笔记整理用于复习查看

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值