概述
版权声明:本文为博主原创文章,若文章中有错误请联系博主改正,请不要恶意留言(不喜欢请绕道)。欢迎大家转载,转载时请注明原文地址:https://blog.csdn.net/qq_37674616/article/details/82085177
目录
基本类型和引用类型
1. 动态属性
2. 复制变量值
3.传递参数
4. 检测类型
基本数据类型检测
引用类型的值检测
instanceof 实现
执行环境及作用域
1. 没有块级作用域
垃圾收集
基本类型和引用类型
基本类型值指的是简单的数据段
引用类型值指那些可能由多个值构成的对象
基本类型:Undefined、Null、Number、String、Boolean
引用类型:对象、数值、函数
***: javascript不允许直接访问内存中的位置,即不能直接操作对象的内存空间,在操作对象时,实际上是在操作对象的引用而不是实际对象,因此引用类型的值是按引用访问的。
1. 动态属性
对于引用类型的值,我们可以为其添加属性和方法,也可以改变和删除其属性和方法,但对于基本类型的值则不可以这么做!
var person=new Object();
person.name="cc";
console.log(person.name); //"cc"
var name="cc";
name.age="20";
console.log(name.age); //undefined
2. 复制变量值
1.基本类型复制
如果从一个变量向另一个变量复制基本类型的值,会在变量对象中创建一个新值,然后把该值复制到位新变量分配的位置上。
var num1=5;
var num2=num1;
**:当用num1的值来初始化num2时,num2中也保存了值5.但num2中的值和num1的值是完全对立的。
2. 引用类型复制
当从一个变量向另一个变量复制引用类型的值时,将存储在变量对象中的值复制一份到为新变量分配的空间中。这个值的副本实际上是一个指针,而这个指针指向存储在堆中的一个对象,复制结束后,两个变量实际上将引用同一个对象。因此改变其中一个变量,就会影响另一个变量。
var obj1=new Object();
var obj2=obj1;
obj1.name="cc";
console.log(obj2.name); //"cc"
3.传递参数
ECMAscript中所有函数的参数都是按值传递的。有人可能很困惑,因为访问变量有的按值和引用访问两种方式,但参数只能按值传递。在向参数传递基本类型的值时,被传递的值会被复制给一个局部变量(即命名参数,或者说是arguments对象中的一个元素)。在向参数传递引用类型的值时,会把这个值在内存中的地址复制给一个局部变量,因此这个局部变量的变化会反映在函数的外部.
function add(num){
num+=10;
return num;
}
var count=10;
var result=add(count);
console.log(count) //10,没有影响
console.log(result) //20
----------------------------------------
function setName(obj){
obj.name="cc";
obj =new Object();
obj.name="newCC";
}
var person=new Object();
setName(person);
console.log(person.name) //"cc"
**: 如果上例中参数是按引用传递的,那么当 obj=new Object() 语句执行后,则person应该也指向了 new Object()的地址;结果 person.name 打印出“”cc” 证明参数传递是按值传递
4. 检测类型
基本数据类型检测
typeof 对一个值使用typeof操作可能返回下列某个字符串:
* "undefined" --如果这个值未定义
* "boolean" --如果这个值是布尔值
* "string" --如果这个值是字符串
* "number" --如果这个值是数值
* "object" --如果这个值是对象或null
* "function" --如果这个值是函数。
var s="ss" console.log(typeof s) //"String"
var o=new Object() console.log(typeof o) //"Object"
**:使用typeof 检测 null 会返回 "object";检测值是对象是返回"object"而不会返回是什么类型的对象
引用类型的值检测
var person =new Object();
console.log(person instanceof Object); // true
console.log(person instanceof Array); //false
instanceof 实现
function instanceof(left,right){
let prototype=right.prototype;
left=left.__proto__;
while(true){
if(left===null){
return false
}
if(left===prototype){
return true
}
left=left.__proto__;
}
}
执行环境及作用域
执行环境:定义了变量或函数有权访问的其他数据,决定了他们各自的行为。
作用域链:当代码在一个环境中执行时,会创建变量对象的一个作用域链,用途是保证对执行环境有权访问的所有变量和函数的有序访问。
**:内部环境可以通过作用域链访问所有外部环境,但外部环境不能访问内部环境中的任何变量和函数。例如:
var color="blue";
function changeColor(){
var anotherColor="red";
function swapColors(){
var tempColor=anotherColor;
anotherColor=color;
color=tempColor;
//这里可以访问color 和anotherColor和tempColor
}
swapColors();
//这里可以访问 color和 anotherColor,但不能访问tempColor
}
//这里只能访问color
changeColor();
1. 没有块级作用域
由花括号封闭的代码块都有自己的作用域,但在javascript中会让你感到意外:
for(var i=0;i<10;i++){
doSomething(i);
}
console.log(i); //会打印出 10
***:对于javascript来说,由for语句创建的变量i 即使在for循环执行结束后,也依旧会存在于循环体外部环境中。
垃圾收集
标记清除
垃圾收集器在运行的时候会给存储在内存中的所有变量都加上标记,然后,它会去除环境中的变量以及被环境中的变量引用的变量的标记。在此之后再被加上上标记的变量将被视为准备删除的变量。
最后
以上就是温婉羊为你收集整理的js --基本数据类型与引用类型、作用域基本类型和引用类型执行环境及作用域垃圾收集的全部内容,希望文章能够帮你解决js --基本数据类型与引用类型、作用域基本类型和引用类型执行环境及作用域垃圾收集所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复