JavaScript原型的工作原理(以及如何利用它来实现类的继承)

各位先看一下下面的题目,看看能否给出答案以及真正了解原因。

#include "stdio.h"
#include "string.h"
#include "malloc.h"

void swap(int a,int b){
int temp;
temp = a;
a = b;
b = temp;
}

int get_int(int a){
int i = 1 + a;
return i;
}

char* get_memory0(){
char *p = (char *)malloc(sizeof(char) * 20);
strcpy(p,"hello world");
return p;
}

char* get_memory1(){
char *p = "hello world";
return p;
}

char* get_memory2(){
char p[] = "hello world";
return p;
}

int main(){
int x=4,y=3;
swap(x,y);
int z=x-y;
printf("z = %d\n",z);//问题1

z=get_int(z);
printf("z = %d\n",z);//问题2

char* c0 = get_memory0();
printf("c0 = %s\n",c0);//问题3

const char* c1 = get_memory1();
printf("c1 = %s\n",c1);//问题4

char* const c2 = get_memory2();
printf("c2 = %s\n",c2);//问题5
}

问题1的答案:z=1,,对于这个答案,相信很多人都不会答错,都知道a和b没有发生交换。但是理解其中的原因吗?

swap(int a,int b)是一个参数传值得函数,这就意味着函数体内的a和b是参数int a和int b的实参在函数内的 一份局部拷贝,所以a和b实际可以看成是局部变量,它们的值是由int a和int b传的实参复制而来的。函数内a和b的值得改变只在函数体内部有效,当函数体内的a和b变量离开函数作用域的时候,a和b变量就被销毁了。函数的实参值并没有发生改变,或者说自始至终没有改变过,改变的只是它们在函数体内的一份局部拷贝a和b。

问题2的答案:z=2

int get_int(int a)属于返回值是传值的函数,这就意味着函数int get_int(int a)会在函数返回处产生一个临时对象,用户存放局部变量i的值的一份拷贝(变量i的右值的拷贝),临时对象是没有名称的,这份没有名称的对象的值(右值)会存储在调用者的“栈”中。所以当i作为局部变量离开作用域后,虽然被销毁了,但它的拷贝仍然存在,并在函数返回时作为“右值”赋给“左值z”。

问题3的答案:c0=“ hello world”

函数返回的是指向“堆”内存的在指针。程序中malloc()是用于分配“堆”内存的库函数,而对于“堆”内存,只要程序中没有调用free()库函数去释放该“堆”内存,那么在程序运行期间,malloc()库函数分配的“堆”内存将一直存在。char* get_memory0()会在函数返回处产生一个队返回变量p的“左值”的拷贝,也就是在“左值”的拷贝中存储了指向“堆”的地址。作为局部变量的p,在离开了函数作用域的时候,虽然被销毁了,但函数返回的“左值”的拷贝是存在的,该拷贝存储了指向“堆”的地址,而该“堆”的值是“hello
world”。

问题4的答案:c1="hello world"

在char* p = “hello world”中,左值是 局部指针变量p,存储于函数栈上,右值是字符串常量“hello world”,存储于常量存储区。

char* get_memory 1()属于返回值是传指针的函数,这就意味着函数char* get_memory 1()会在函数返回处产生一个对返回对象的“左值”的拷贝,也就是在“左值”拷贝中存储了指向字符串常量“hello world”的地址。作为局部变量的p,在离开函数作用域的时候虽然被销毁了,但 函数返回的“左值“拷贝仍然存储了指向常量存储区的字符串常量”hello world“的地址。

问题5的答案:c2=未知

返回值是传指针,会在函数返回时产生”左值“拷贝。

函数返回的”左值“拷贝指向的是局部变量数组p[12]的首地址。当局部数组p[12]离开作用域后会被自动销毁。这时,函数返回的”左值“拷贝指向的是一个被销毁的局部变量地址。

时间: 2024-10-10 23:21:56

JavaScript原型的工作原理(以及如何利用它来实现类的继承)的相关文章

JavaScript学习总结(十七)——Javascript原型链的原理

一.JavaScript原型链 ECMAScript中描述了原型链的概念,并将原型链作为实现继承的主要方法.其基本思想是利用原型让一个引用类型继承另一个引用类型的属性和方法.在JavaScript中,用 __proto__ 属性来表示一个对象的原型链.当查找一个对象的属性时,JavaScript 会向上遍历原型链,直到找到给定名称的属性为止! 比如现在有如下的代码: 扩展Object类,添加Clone和Extend方法 1 /*扩展Object类,添加Clone,JS实现克隆的方法*/ 2 Ob

我们应该如何去了解JavaScript引擎的工作原理

我们应该如何去了解JavaScript引擎的工作原理 JavaScript探秘:编写可维护的代码的重要性 JavaScript探秘:谨慎使用全局变量 JavaScript探秘:var预解析与副作用 JavaScript探秘:for循环(for Loops) JavaScript探秘:for-in循环(for-in Loops) JavaScript探秘:Prototypes强大过头了 JavaScript探秘:eval()是"魔鬼" JavaScript探秘:用parseInt()进行

JavaScript引擎的工作原理

(转) 1. 什么是JavaScript解析引擎? 简单地说,JavaScript解析引擎就是能够“读懂”JavaScript代码,并准确地给出代码运行结果的一段程序.比方说,当你写了 var a = 1 + 1; 这样一段代码,JavaScript引擎做的事情就是看懂(解析)你这段代码,并且将a的值变为2. 学过编译原理的人都知道,对于静态语言来说(如Java.C++.C),处理上述这些事情的叫编译器(Compiler),相应地对于JavaScript这样的动态语言则叫解释器(Interpre

Java内存的原型及工作原理理解

一.java虚拟机内存原型 寄存器:我们在程序中无法控制. 栈:存放基本类型的数据和对象的引用,但对象本身不存放在栈中,而是存放在堆中 堆:存放用new产生的数据 静态域:存放在对象中用static定义的静态成员 常量池:存放常量 非RAM存储:硬盘等永久存储空间. 二.常量池(constant pool) 常量池指的是在编译期被确定,并被保存在已编译的.class文件中的一些数据.除了包含代码中所定义的各种基本类型(如int.long等等)和对象型(如String及数组)的常量值(final)

如何去了解JavaScript引擎的工作原理

js:我们应该如何去了解JavaScript引擎的工作原理(转) http://www.nowamagic.net/librarys/veda/detail/1579 昨天收到一封来自深圳的一位前端童鞋的邮件,邮件内容如下(很抱歉,未经过他的允许,公开邮件内容,不过我相信其他人肯定也有同样的问题,所以,直接把问题原文抛出来): "读了你的几篇关于JS(变量对象.作用域.上下文.执行代码)的文章,我个人觉得有点抽象,难以深刻理解.我想请教下通过什么途径能够深入点的了解javascript解析引擎在

javascript this 的工作原理

JavaScript 有一套完全不同于其它语言的对 this 的处理机制. 在五种不同的情况下 ,this 指向的各不相同. 1.全局范围内 当在全部范围内使用 this,它将会指向全局对象. 2.函数调用 foo();   这里的this,也指向全局对象. 3.方法调用 var test = {}; test.foo = function(){ console.log( this === test ); // true } test.foo(); // 这里this指的是test 4.调用构造

JavaScript的工作原理:解析、抽象语法树(AST)+ 提升编译速度5个技巧

这是专门探索 JavaScript 及其所构建的组件的系列文章的第 14 篇. 如果你错过了前面的章节,可以在这里找到它们: JavaScript 是如何工作的:引擎,运行时和调用堆栈的概述! JavaScript 是如何工作的:深入V8引擎&编写优化代码的5个技巧! JavaScript 是如何工作的:内存管理+如何处理4个常见的内存泄漏 ! JavaScript 是如何工作的:事件循环和异步编程的崛起+ 5种使用 async/await 更好地编码方式! JavaScript 是如何工作的:

JavaScript的计时器的工作原理

最近都在看一些JavaScript原理层面的文章,恰巧看到了jQuery的作者的一篇关于JavaScript计时器原理的解析,于是诚惶诚恐地决定把原文翻译成中文,一来是为了和大家分享,二来是为了加深自己对于JavaScript的理解.原文链接:http://ejohn.org/blog/how-javascript-timers-work/ 原文翻译: 从基础层面来讲,理解JavaScript计时器的工作原理是很重要的.由于JavaScript是单线程的,所以很多时候计时器并不是表现得和我们的直

How Javascript works (Javascript工作原理) (一) 引擎,运行时,函数调用栈

个人总结: 这篇文章对JS底层的工作原理进行了介绍. 原文:https://blog.sessionstack.com/how-does-javascript-actually-work-part-1-b0bacc073cf 一.引擎,运行时,调用堆栈 这是 JavaScript 工作原理的第一章.本章会对语言引擎,运行时,调用栈做一个概述. 事实上,有很多开发者在每天日常开发中都会使用 JavaScript 但是却不了解其底层的知识. 概述 几乎所有人都已经听说过 V8 引擎的概念,并且很多人