目录
1.基础数据类型(简单数据类型)(值类型)
."值类型"直接将内存存储在栈内,由系统自动释放资源的数据类型.
与值类型相对应的有引用类型.
数据类型 | typeof 值 | 举例 | ||
String字符串 | string | “abc”,'abc',`def` | ||
Number数字 | number | 123,-12.5 | ||
Boolean布尔 | boolean | true,false | ||
undefined未定义 | undefined | undefined | ||
Symbol符号 | symbol | symbol | ||
null 空 | object | null |
alert(null===null) //true
symbol 符号,不相等
var s1 = Symbol("good");
var s2 = Symbol("good");
alert(s1== s2); //false
alert(NaN == NaN); //false
alert(undefined==undefined) //true
alert(undefined==null) //ture
两个等于值相等,三个等于 值与类型相等
alert(null == NaN); //false
alert(undefined===null) // false
alert(null == false); //false
alert(0 == false); //true
2.复杂数据类型(引用数据类型)
引用类型 由类型的实际值引用(类似于指针)表示的数据类型。如果为某个变量分配一个引用类型,则该变量将引用(或“指向”)原始值。不创建任何副本。
数据类型 | typeof | 举例 |
Array数组 | object | [] |
Object对象 | object | {} |
function函数class类 | function | function(){} |
Map图 | object | new Map([[]]) |
Set集合 | object | new Set([]) |
weakMap,weakSet | object | |
Date,Math, | object |
<script>
// 判断对象类型最准确的方法
function getType(obj){
return Object.prototype.toString.call(obj)
}
</script>
3.浅拷贝
浅拷贝是按位拷贝对象,它会创建一个新对象,这个对象有着原始对象属性值的一份精确拷贝。如果属性是基本类型,拷贝的就是基本类型的值;如果属性是内存地址(引用类型),拷贝的就是内存地址 ,因此如果其中一个对象改变了这个地址,就会影响到另一个对象。
// 01 浅拷贝 用for in
var obj1 = {};
for(var k in obj){
// 实现遍历浅拷贝
obj1[k] = obj[k];
}
4.深拷贝
创建一个新的对象和数组,将原对象的各项属性的“值”(数组的所有元素)拷贝过来,是“值”而不是“引用”。
深拷贝,值类型,与引用类型都拷贝(互相不影响)
01 对象转字符JSON.stringify,字符串转json JSON.parse()
JSON数据格式只支持:string,number,null,undefined,array,object
var obj1 = JSON.parse(JSON.stringify(obj))
02 采用递归,如果值类型就拷贝,引用类型,递归拷贝
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<h1>深拷贝</h1>
<script>
var obj = {
name:"zz",
age:18,
friend:["A","B","C"],
say:function(){alert( this.name)}
}
function deepCopy(obj){
// 如果typeof 值是object并且不是null
if(typeof obj=== 'object'&&obj!=null){
var result;
// 如果是数组
if(obj instanceof Array){
result = [];
// 遍历数组,执行拷贝
for(var i=0;i<obj.length;i++){
// 当前下标的值是执行深拷贝的结果
result[i]=deepCopy(obj[i])
}
}else{
// 如果是对象
result = {};
for(var k in obj){
// 执行遍历深拷贝对象
result[k] = deepCopy(obj[k])
}
}
// 返回的结果
return result;
}else{
// 值类型或者null或者 函数直接返回
return obj;
}
}
</script>
5.值类型
- 值类型 key与value都存储在栈
-
值类型:字符串(string)、数值(number)、布尔值(boolean)、null、undefined
var a = 100;
var b = a;
b=200;
console.log(a,b);
6.引用类型
- 引类型 栈 存储的是key 与内存地址,堆中存真正的值
-
引用类型:对象(Object)、数组(Array)、函数(Function)、类class 、日期Date 、正则Regexp
var a = 100;
var b = a;
b=200;
console.log(a,b);
// 引类型 栈 存储的是key 与内存地址
// 堆中存真正的值
var d = {age:100};
var e =d;
// 修改了堆中的数据
// d与e都引用了同一个内存地址
e.age = 200;
console.log(d,e)
7.递归
- 递归就是函数自己调用自己(必须要有结束条件)
-
举个栗子,你用你手中的钥匙打开一扇门,结果去发现前方还有一扇门,紧接着你又用钥匙打开了这扇门,然后你又看到一扇们...但是当你开到某扇门时,发现前方是一堵墙无路可走了,你选择原路返回——这就是递归
但是如果你打开一扇门后,同样发现前方也有一扇们,紧接着你又打开下一扇门...直到打开最后一扇门出去,或者一直没有碰到尽头 (死循环)——这就是循环。
var obj = {
name: "zz",
age: 18,
friend: [
"张张爱穿小裙子", "小付爱吃肉肉", "小付是丑八怪", {
"name": "艳艳",
"age": "20"
}
]
}
function log(obj) {
if (typeof obj !== "object") {
console.log(obj);
} else {
if (obj instanceof Array) {
for (var i = 0; i < obj.length; i++) {
// console.log(i,":");
log(obj[i]);
}
} else {
for (var k in obj) {
log(obj[k]);
}
}
}
}
- 斐波那契数列
// 1、1、2、3、5、8、13、21、34
function fib(n){
if(n==0||n==1){return 1}
else{
return fib(n-1)+fib(n-2);
}
}
alert(fib(46))
function fib(n){
var arr = [1,1];
for(var i=2;i<=n;i++){
arr[i]=arr[i-1]+arr[i-2];
}
console.log(arr[n])
}
function mul(num){
if(num<2){return 1}
else{
return num *mul(num-2);
}
}
alert(mul(10));
function add(num){
if(num==1){return num}
else{
return num+add(num-1);
}
}
var re = add(3);
alert(re);