Javascript:指针、帽子和女朋友

2024-06-03 12:08

本文主要是介绍Javascript:指针、帽子和女朋友,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Javascript:指针、帽子和女朋友

首先,事情开始于一道面试题

<script>

function A(){

this.name="";

this.age=18;

}

var a1=new A();

a1.name="尼古拉斯•屌";

var a2=a1;

a2.name="blue";

console.log(a1.name); //变成blue了

var str1="尼古拉斯•屌";

var str2=str1;

str2="blue";

console.log(str1); //没变,还是尼古拉斯•屌

</script>

简单来说

a2=a1;

a2.name=xxx; //a1.name会变

str2=str1;

str2=xxx; //str1不会变


欢迎觉得废话太多的同学直接翻到最后看“技术流解释”哈,那么我们开始:

套用一句比较俗的话:“道理我都懂,可是为什么字符串就不会变呢”,JavaScript作为高级语言并没有指针的概念,但却又总被这事儿困扰,今天我就想试试让大家理解这个概念,如果要弄明白这个事情,请先来弄明白一个特别简单的事情:

假设你有女朋友叫梦琪,喜欢带黄色帽子,你帮她买了顶红色帽子,请问:梦琪带什么颜色的帽?

答:红色

假设你有女朋友叫梦琪,喜欢带黄色帽子,你直接换了个喜欢带红色帽子的女朋友,请问:梦琪带什么颜色的帽子?

答:还是黄色,没变

如果我们理解了上面这个花心萝卜和戴帽子的女朋友的问题,那么问题就变得非常简单,用代码再表示一遍:

//情况1:换帽子

你.女朋友=梦琪;

你.女朋友.帽子=红色;

console.log(梦琪.帽子); //红色

//情况2:换女朋友

你.女朋友=梦琪;

你.女朋友=安易;

console.log(梦琪.帽子); //黄色,没变

简单来说,你换女朋友了,关人家帽子啥事,对吧


为了彻底弄明白问题的步骤1/2:

让我们把这个本就混乱的关系搞得更乱一些吧[捂脸]

假设张三和李四,都找了同一个女朋友,张三给她买了一顶帽子,请问:李四的女朋友换帽子了没?

答:换了

假设张三和李四,都找了同一个女朋友,张三扛不住了,又新找了个女朋友,请问:这跟李四女朋友的帽子有关系吗?

答:有毛关系啊

上面这个混乱的关系,用程序表述出来就是:

//情况1.换帽子

张三女朋友=李四女朋友; //传说中的引用:第一次见到能把出轨说的这么清新脱俗的

张三女朋友.帽子=绿色的帽子;

console.log(李四女朋友.帽子); //变了,绿的

//情况2.跟帽子有毛关系

张三女朋友=李四女朋友;

张三女朋友=新的女朋友;

console.log(李四女朋友.帽子); //不知道什么颜色,反正没变


为了彻底弄明白问题的步骤2/2:

直接上代码了,解释见注释哈

//情况1:帽子

var 张三女朋友=new 女朋友(); //太方便了有没有

var 李四女朋友=张三女朋友; //又引用了

张三女朋友.帽子=红的;

console.log(李四女朋友.帽子); //红的,变了

//情况2:跟帽子有毛关系

var 张三女朋友=new 女朋友();

var 李四女朋友=张三女朋友;

张三女朋友=另一个;

console.log(李四女朋友.帽子); //没变,跟帽子有毛关系


所以,现在请跟随我再来重新看一遍上面的问题

//情况1

var a1=new A();

var a2=a1;

//注意:在这个时候,a1和a2就是同一个东西,引用嘛,你懂的

a2.name="blue"; //你给女朋友,买了顶新的帽子

console.log(a1.name); //她的帽子是Blue色的

//情况2

var str1="aaa";

var str2=str1;

//注意:这个时候,str1和str2也是同一个东西,也是引用

str2="blue"; //你直接换了个女朋友

console.log(str1); //你原先女朋友没啥变化

人上了年纪就会很啰嗦,直接上图多好:

情况1:a2.name="blue"

Javascript:指针、帽子和女朋友

情况2:str2="blue"

Javascript:指针、帽子和女朋友


==========================纯技术流分隔线==========================

1.指针:代表一个变量或属性指向谁

2.赋值:代表改变变量或属性的指向

合起来用:

a1=a2;

a2.name='blue';

//改变a2.name指向了'blue';但a1和a2依然指向同一个对象,所以:a1.name=>'blue'

str1=str2;

str2='blue';

//改变str2指向了'blue';这时str1和str2不再指向同一对象,所以:str1不变

========================end of 纯技术流分隔线==========================


结论:

1.都说人上了年纪废话就是多,看来是真的

2.另外,我一直好奇有多少人会看到文章的最后,所以想做个简单的实验。

智能社撰稿,更多知识请关注微信号zhi_neng_she

这篇关于Javascript:指针、帽子和女朋友的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1026942

相关文章

SpringBoot使用Apache Tika检测敏感信息

《SpringBoot使用ApacheTika检测敏感信息》ApacheTika是一个功能强大的内容分析工具,它能够从多种文件格式中提取文本、元数据以及其他结构化信息,下面我们来看看如何使用Ap... 目录Tika 主要特性1. 多格式支持2. 自动文件类型检测3. 文本和元数据提取4. 支持 OCR(光学

Java内存泄漏问题的排查、优化与最佳实践

《Java内存泄漏问题的排查、优化与最佳实践》在Java开发中,内存泄漏是一个常见且令人头疼的问题,内存泄漏指的是程序在运行过程中,已经不再使用的对象没有被及时释放,从而导致内存占用不断增加,最终... 目录引言1. 什么是内存泄漏?常见的内存泄漏情况2. 如何排查 Java 中的内存泄漏?2.1 使用 J

JAVA系统中Spring Boot应用程序的配置文件application.yml使用详解

《JAVA系统中SpringBoot应用程序的配置文件application.yml使用详解》:本文主要介绍JAVA系统中SpringBoot应用程序的配置文件application.yml的... 目录文件路径文件内容解释1. Server 配置2. Spring 配置3. Logging 配置4. Ma

Java 字符数组转字符串的常用方法

《Java字符数组转字符串的常用方法》文章总结了在Java中将字符数组转换为字符串的几种常用方法,包括使用String构造函数、String.valueOf()方法、StringBuilder以及A... 目录1. 使用String构造函数1.1 基本转换方法1.2 注意事项2. 使用String.valu

java脚本使用不同版本jdk的说明介绍

《java脚本使用不同版本jdk的说明介绍》本文介绍了在Java中执行JavaScript脚本的几种方式,包括使用ScriptEngine、Nashorn和GraalVM,ScriptEngine适用... 目录Java脚本使用不同版本jdk的说明1.使用ScriptEngine执行javascript2.

Spring MVC如何设置响应

《SpringMVC如何设置响应》本文介绍了如何在Spring框架中设置响应,并通过不同的注解返回静态页面、HTML片段和JSON数据,此外,还讲解了如何设置响应的状态码和Header... 目录1. 返回静态页面1.1 Spring 默认扫描路径1.2 @RestController2. 返回 html2

Spring常见错误之Web嵌套对象校验失效解决办法

《Spring常见错误之Web嵌套对象校验失效解决办法》:本文主要介绍Spring常见错误之Web嵌套对象校验失效解决的相关资料,通过在Phone对象上添加@Valid注解,问题得以解决,需要的朋... 目录问题复现案例解析问题修正总结  问题复现当开发一个学籍管理系统时,我们会提供了一个 API 接口去

Java操作ElasticSearch的实例详解

《Java操作ElasticSearch的实例详解》Elasticsearch是一个分布式的搜索和分析引擎,广泛用于全文搜索、日志分析等场景,本文将介绍如何在Java应用中使用Elastics... 目录简介环境准备1. 安装 Elasticsearch2. 添加依赖连接 Elasticsearch1. 创

Spring核心思想之浅谈IoC容器与依赖倒置(DI)

《Spring核心思想之浅谈IoC容器与依赖倒置(DI)》文章介绍了Spring的IoC和DI机制,以及MyBatis的动态代理,通过注解和反射,Spring能够自动管理对象的创建和依赖注入,而MyB... 目录一、控制反转 IoC二、依赖倒置 DI1. 详细概念2. Spring 中 DI 的实现原理三、

SpringBoot 整合 Grizzly的过程

《SpringBoot整合Grizzly的过程》Grizzly是一个高性能的、异步的、非阻塞的HTTP服务器框架,它可以与SpringBoot一起提供比传统的Tomcat或Jet... 目录为什么选择 Grizzly?Spring Boot + Grizzly 整合的优势添加依赖自定义 Grizzly 作为