堆栈与内置对象(JSON、Math、Date)与垃圾回收机制与弹窗方法
堆和栈的概念
数据结构的两种,专门用来解决数据的存储和读取
内存:栈内存和堆内存(其它语言),js当中只有堆内存(堆内存又分为栈结构和堆结构,我们相当于用的栈结构和堆结构)
? 栈内存比较小,但是快
? 堆内存比较大,但是慢
拓展: 队列结构   先进先出  管状结构
? 栈:栈的数据结构 FILO先进后出(有序)
? 堆:链表的数据结构,无序的可以随意添加和删除
垃圾回收机制
堆空间的释放是靠垃圾回收机制进行的
当程序函数或者整个程序执行完成后,栈里面所有的东西都被释放销毁,堆当中的数据可能还在,只是没有任何的变量指向(引用),那么堆当中的数据就会变成垃圾对象。回收机制会在适当的时候将垃圾对象清理回收;
如果我们在程序当中需要去删除对象,那么就将这个对象的变量赋值为null,代表这个对象引用被改变,这个对象也就成了垃圾对象,其实删除对象就是让堆当中的对象数据成为垃圾对象;
弹窗方法
| 函数 | 作用 | 参数 | 返回值 | 
|---|---|---|---|
| window.prompt() | 用于获取用户输入的字符串 | message(可选),显示给用户的文本字符串default(可选)在文本输入字段中显示的默认值 | 点确定返回string 点取消返回null | 
| window.alert() | 警示信息 | message在警报对话框中显示的字符串 | string | 
内置对象
内置对象JSON
1.什么是json,json作用
json是一种数据格式;现在我们大多数都是通过json数据格式进行前后端数据交互的,json本质上是一个字符串,简称json串
前端往后台传数据的时候,要传json格式的数据json串
在前端json串的格式原形就是对象或者对象的数组;所以我们要先把数据存储为对象或者对象的数组,然后转化为json串进行传递
2. JSON对象的方法
| 方法 | 作用 | 返回值 | 
|---|---|---|
| JSON.parse(text,[reviver]) | 解析JSON字符串 | Object类型 | 
| JSON.stringify(value,[replacer], [space]) | 将一个 JavaScript 对象或值转换为 JSON 字符串 | |
JSON.stringify参数
- value
将要序列化成 一个 JSON 字符串的值。
- replacer可选
如果该参数是一个函数,则在序列化过程中,被序列化的值的每个属性都会经过该函数的转换和处理;如果该参数是一个数组,则只有包含在这个数组中的属性名才会被序列化到最终的 JSON 字符串中;如果该参数为 null 或者未提供,则对象所有的属性都会被序列化。
- space可选
指定缩进用的空白字符串,用于美化输出(pretty-print);如果参数是个数字,它代表有多少的空格;上限为10。该值若小于1,则意味着没有空格;如果该参数为字符串(当字符串长度超过10个字母,取其前10个字母),该字符串将被作为空格;如果该参数没有提供(或者为 null),将没有空格。
JSON.parse参数
- text
要被解析成 JavaScript 值的字符串,关于JSON的语法格式,请参考:JSON。
- reviver可选
转换器, 如果传入该参数(函数),可以用来修改解析生成的原始值,调用时机在 parse 函数返回之前。
内置对象Math
| 方法 | 描述 | 
|---|---|
| abs(x) | 返回数的绝对值 | 
| ceil(x) | 对数进行上舍入 | 
| floor(x) | 对数进行下舍入 | 
| max(x,y) | 返回x和y中的最高值 | 
| min(x,y) | 返回x和y中的最低值 | 
| pow(x,y) | 返回x的y次幂 | 
| random() | 返回0-1之间的随机数(不包含1) | 
| round(x) | 把数四舍五入为最接近的整数 | 
| sqrt(x) | 返回数的平方根 | 
内置对象Date
var date=new Date();
? eg:Date没参数是获取当前时间,给Date传时间戳是获取时间戳的时间
| 方法 | 作用 | 
|---|---|
| date.getFullYear() | 年 | 
| date.getMonth() | 月 | 
| date.getDate() | 日 | 
| date.getHours() | 时 | 
| date.getMinutes() | 分 | 
| date.getSeconds() | 秒 | 
| date.getDay() | 星期几 | 
| date.toLocaleTimeString() | 当前时间的本地格式化字符串 | 
| date.toLocaleDateString() | 当前日期的本地格式化字符串 | 
| date.getTime() | 1970 年 1 月 1 日到现在之间的毫秒数(又叫时间戳) | 
面试题:
第一题:
var num1 = 10;
var num2 = num1;
num1 = 20;
console.log(num1);
console.log(num2);
第二题
var num = 50;
function f1(num) {
    num = 60;
    console.log(num);
}
f1(num);
console.log(num);
第三题
var num1 = 55;
var num2 = 66;
function f1(num, num1) {
    num = 100;
    num1 = 100;
    num2 = 100;
    console.log(num);
    console.log(num1);
    console.log(num2);
}
f1(num1, num2);
console.log(num1);
console.log(num2);
console.log(num);
第四题
函数传参如果传的是基本数据类型和传引用(对象)有什么区别
var a = 10;
var b = 20;
function add(a, b) {
    a = 30;
    return a + b;
}
add(a, b);
console.log(a);
function f1(arr) {
    for (var i = 0; i < arr.length; i++) {
        arr[i] += 2
    }
    console.log(arr);
}
var arr;
arr = [1, 2];
f1(arr);
console.log(arr);
第五题
两个对象是同一个对象,不同的操作有什么不同
var a = [1, 2];
var b = a;
a[0] = 20;
console.log(b);
var a = []; // new Array()
var b = []; // new Array()
console.log(a == b);
第六题
function Person(name, age, height) {
    this.name = name;
    this.age = age;
    this.height = height;
}
function f1(pp) {
    pp.name = "ls";
    pp = new Person("aa", 18, 160);
}
var p = new Person("zs", 18, 180);
console.log(p.name);
f1(p);
console.log(p.name);