Skip to content
On this page

基本类型和引用类型

1. 基本类型值有:undefined,NUll,Boolean,Number 和 String
这些类型分别在内存中占有固定的大小空间,例如:数值型在内存中占有八个字节,布尔值只占有一个字节...... 他们的值保存在栈空间,我们通过按值来访问的。

2.引用类型:对象、数组、函数
引用类型内存中占有的空间不固定,但是内存地址大小是固定的,因此存储的实际上是数据的内存地址。

3.在变量复制时候,基本类型复制的是值本身,而引用类型复制的是地址
4.函数的参数都是按值传递的

//函数的参数都是按值传递的
var num = 100;
function box(num){
    num+=100;
    return num;
}
var result = box(num);
alert(result);
alert(num);//这里输出100而不是200

函数创建方式

  • 普通声明方式
function fun (m,n) {
    alert(m + n)
}
fun(3,2)
  • 使用变量声明
var fun = function(m, n) {
    alert(m + n)
}
fun(3, 2)
  • 使用构造函数 (了解)
var fun = new Function('m', 'n', 'alert(m+n)')
fun(3, 2)

函数的内部属性

  • arguments
// arguments.length检测函数的参数个数
function sum() {
    //alert(arguments.length);
    var result=0;
    for(var i=0;i<arguments.length;i++){
        result+=arguments[i]
    }
    return result
}
alert(sum(12,3,5,10,5,3))
  • this
//在函数外部使用this,this就指的是window对象
//alert(this)

//全局变量可以看做window对象的属性
var x=1;
alert(window.x)
alert(this.x)

//函数内部调用
function test(){
    var x=0;
    alert(x) //这里的x为0
    alert(this.x); //这里的x为1
    alert(this)
}
//test()
//用new来调用,那么绑定的将是新创建的对象
function test2(){
  this.x = 100;
}
var obj = new test2();
//alert(x); //这里的x为1
//alert(obj.x);//这里的x为100

//作为某个对象的方法调用
function test3(){
  alert(this.x);
}
var objo={};
objo.x = 1000;
objo.m = test3;
//alert(x);
//objo.m(); //1000

//事件监听函数中的this
var div1 = document.getElementById('div1');
div1.onclick = function(){
    alert( this.innerHTML); //this指向的是div元素
};

函数的属性和方法

//length:当前函数希望接受的命名参数的个数
function test(num1,num2,num3) {
        alert(test.length);
    alert(arguments.length) //注意arguments是实际传人的参数
}
//test(10,20,10,35)


function sum(num1, num2) {
    return num1 + num2;
}
function applySum1(num1, num2) {
    return sum.apply(this, [num1, num2]);
}
function applySum2(num1, num2) {
    return sum.apply(this, arguments);//传入arguments对象
}
// alert(sum(10,20))
// alert(applySum1(10,20))
// alert(applySum2(10,20))

//对于apply、call二者而言,作用完全一样,只是接受参数的方式不太一样。 
function callSum(num1, num2) {
    return sum.call(this, num1, num2); //传入的是具体的参数
}
//alert(callSum(30, 20));

//扩充函数作用域
var color = "red";
var o = {color: "blue"};
function sayColor() {
    alert(this.color);
}
// sayColor();
// sayColor.call(this);
// sayColor.call(window);
sayColor.call(o)

执行环境及作用域

  • 执行环境定义了变量或函数有权访问其他数据。
  • 全局执行环境是最外围的执行环境,在 web 浏览器中,全局执行环境是 window 对象,因此,所有的全局变量的函数都是作为 window 的属性和方法创建的。
var name = "张三";      //定义全局变量
alert(name)
alert(window.name);    //全局变量,最外围,属于window属性

function setName(){
    return "李四";
}
alert(setName());
alert(window.setName()); //全局函数,最外围,属于window方法
  • 变量没有在函数内声明或者声明的时候没有带 var 就是全局变量,拥有全局作用域,window 对象的所有属性拥有全局作用域;在代码任何地方都可以访问,函数内部声明并且以 var 修饰的变量就是局部变量,只能在函数体内使用,函数的参数虽然没有使用 var 但仍然是局部变量。
var name = "张三";      //定义全局变量
function setName(){
    //var name= "李四";    //定义局部变量
    name="李四";    //去掉var变成了全局变量
    //alert(name);
}
setName()
alert(name);

function setName(){
    var name="张三"
    function setYear(){ //setYear()方法的作用域在setName()内
    var age=21;
    var str=name+age+'岁了'
    return str;
    }
    //alert(setYear())
    //alert(age)
    return setYear()
}
setName()
// alert(setYear())
alert(setName());
  • 内部环境可以访问所有的外部环境,但是外部环境不能访问内部环境中的任何变量和函数。
  • 在变量的查询中,访问局部变量要比全局变量快。

内存管理

JS 中内存的分配和回收都是自动完成的,内存在不使用的时候会被垃圾回收器自动回收。

  • 内存的生命周期,JS 环境中分配的内存一般有如下生命周期:
      1.内存分配:当我们申明变量、函数、对象的时候,系统会自动为他们分配内存
      2.内存使用:即读写内存,也就是使用变量、函数等
      3.内存回收:使用完毕,由垃圾回收自动回收不再使用的内存
  • 垃圾回收算法:对垃圾回收算法来说,核心思想就是如何判断内存已经不再使用了。
  • JavaScript 的内存管理注意事项:
      1.避免不必要的定义全局变量(当一个变量被定义在全局作用域中,默认情况下 JavaScript 引擎就不会将其回收销毁。如此该变量就会一直存在于老生代堆内存中,直到页面被关闭。)
      2.及时解除不再使用的变量引用,即将其赋值为 null;(在内存回收周期中,收回内存不是立即收回,浏览器每隔一段时间检查一次)
      3.合理的使用函数,函数中的局部变量函数执行结束后就会自动释放内存。

全局函数

全局函数和属性可用于所有内建的 JavaScript 对象。全局函数又叫顶层函数或系统函数。

  • parseInt() 函数可解析一个字符串,并返回一个整数。
  • parseFloat() 函数可解析一个字符串,并返回一个浮点数。
  • isNaN() 函数用于检查其参数是否是非数字值。
  • String() 函数把对象的值转换为字符串。
  • Number() 把对象的值转换为数字。
  • eval() 函数可计算某个字符串,并执行其中的的 JavaScript 代码。(该方法只接受字符串作为参数,要计算的字符串中必须含有要计算的 JavaScript 表达式或要执行的语句。)
  • escape() 对字符串进行编码。
      返回值:已编码的 string 的副本。其中某些字符被替换成了十六进制的转义序列。
      该方法不会对 ASCII 字母和数字进行编码,也不会对下面这些 ASCII 标点符号进行编码: * @ - _ + . / 。其他所有的字符都会被转义序列替换。
  • unescape() 对由 escape() 编码的字符串进行解码。
  • encodeURI() 把字符串编码为 URI。
  • decodeURI() 解码某个编码的 URI。
  • decodeURIComponent() 解码一个编码的 URI 组件。
  • encodeURIComponent() 把字符串编码为 URI 组件。
  • 三种编码方式的区别:
      1.escape 不编码字符有 69 个:,+,-,.,/,@,_,0-9,a-z,A-Z(主要是为了防止特殊字符造成计算错误时候应用)
      2.encodeURI 不编码字符有 82 个:!,#,$,&,',(,),
    ,+,,,-,.,/,:,;,=,?,@,,~,0-9,a-z,A-Z(防止特殊字符串造成 URI 的传递错误,一般用于页面跳转的时候)
      3.encodeURIComponent 不编码字符有 71 个:!, ',(,),*,-,.,
    ,~,0-9,a-z,A-Z(防止 URI 参数中特殊字符串造成参数读取错误,一般用来传递参数。)
  • isFinite() 检查某个值是否为无穷大的数。
    如果 number 是有限数字(或可转换为有限数字),那么返回 true。否则,如果 number 是 NaN(非数字),或者是正、负无穷大的数,则返回 false。
      Infinity 无穷大(系统定义常量)
      -Infinity 无穷小(系统定义常量)

上次更新于: