Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

JavaScript数据类型、this、按值传递 #6

Open
mamba-1024 opened this issue Sep 4, 2018 · 2 comments
Open

JavaScript数据类型、this、按值传递 #6

mamba-1024 opened this issue Sep 4, 2018 · 2 comments

Comments

@mamba-1024
Copy link
Owner

数据类型

  • 基本数据类型包含: undefined,null,Boolean,Number、String

    它们的值保存在栈空间,我们通过按值来访问的.
  • 引用类型: 对象Object、数组Array、函数function 等,

    对应的值,则必须在堆内存中为这个值分配空间。由于引用类型值得大小不固定(对象有很多属性和方法),因此不能把它们保存在栈内存中。但是内存地址大小是固定的,因此可以将内存地址保存在栈内存中。

    简而言之:栈内存中存放的是基本数据类型值,堆内存中存放引用类型值,引用类型值在内存中的地址存放在栈中,也就是我们常说的对象引用(指针)。
var a = 5;
var b = a;
console.log(a "---" b); // 5---5
b = 6; // 这里重新给b赋值,a值并没有改变
console.log(a "---" b);// 5---6

var obj = { name: "lisi" };
var obj2 = obj; // 这里是引用赋值,obj和obj2指向同一个对象
console.log(obj.name   "---"   obj2.name); // lisi---lisi
obj2.name = "wangwu";
console.log(obj.name   "---"   obj2.name);//wangwu---wangwu

从上面例子可以看出:在变量复制方面,基本类型和引用类型也有所不同,基本类型复制的是值本身,而引用类型复制的是内存地址。

@mamba-1024 mamba-1024 changed the title JavaScript基础—数据类型 JavaScript基础 Sep 4, 2018
@mamba-1024
Copy link
Owner Author

this 的工作原理(5种情况)

  1. 全局作用域内 -- 当在全部作用域内使用 this 时,它将会指向全局对象,即 window 对象
  2. 函数调用 -- 当在全局作用域内调用函数时,this 也会指向全局对象。
  3. 方法调用 -- this 指向调用该方法的对象。
  4. 调用构造函数 -- 在构造函数内部,this 指向新创建的对象。
  5. 显式的设置this指向 -- 当使用 call 或者 apply 方法时,函数内的 this 将会被显式设置为函数调用的第一个参数。

    下面是我自己借鉴网上的一些总结,感觉写的不错

匿名函数

在JavaScript里任何匿名函数都是属于window对象。在定义匿名函数时候它会返回自己的内存地址,如果此时有个变量接收了这个内存地址,那么匿名函数就能在程序里被使用了(可以通过在这个变量后面加一对圆括号来调用这个匿名函数),因为匿名函数也是在全局执行环境构造时候定义和赋值,所以匿名函数的this指向也是window对象。
(function(){
    console.log(this == window); // true
})();

@mamba-1024
Copy link
Owner Author

mamba-1024 commented Sep 4, 2018

参数传递

按值传递

function test(num){ // 按值传递
    num =5;
    console.log(num);
    return num;
}
var num = 5;
var result = test(num);
console.log(result); // 10 如果是按引用传递,那么函数里的num会成为类似全局变量,把外面的num覆盖掉
console.log(num); // 5 也就是说,最后应该输出20(这里输出10)

注:js中不存在引用传递,如果存在引用传递的话,那么函数内的变量将是全局变量,在外部也可以访问,但这明显是不可能的

function setName(obj){ // obj = person
    obj.name = "lisi";
    obj = new Object();
    obj.name = "wangwu";
}
var person = new Object();
setName(person);
console.log(person.name); // => lisi
console.log(obj.name); // Uncaught ReferenceError: obj is not defined

在将person传递给obj后,其name属性就被设置成了”lisi”。又将obj重新定义了一个对象,另一行代码为该对象定义了一个带有不同值的name属性。
如果person是按引用传递的,那么person就会自动被修改为指向其name属性值为”wangwu”的新对象,但事实上并没有,其name属性依然是”lisi”。

这就说明:即使在函数内部修改了参数的值,但原始的引用仍然保持不变。实际上,当在函数内重写obj时,这个变量引用的就是一个局部对象 了。而这个局部对象会在函数执行完毕后立即被销毁。

因此:访问变量按值按引用 两种方式,而参数只能 按值传递

@mamba-1024 mamba-1024 changed the title JavaScript基础 JavaScript数据类型、this、按值传递 Sep 7, 2018
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant