编程-萌新知识

尹默
• 阅读 717

简况

有些知识时间久了就忘了,但是对编程又很重要,还是记录下来的好,总结很重要

值变量与对象变量

//对象变量
let obja = {};
let objb = null;
objb = obja;
obja.a = "a";
console.log(obja);
console.log(objb);
//值变量
let a = "a";
let b = a;
a += "1";
console.log(a);
console.log(b);

console:

{ a: 'a' }
{ a: 'a' }
a1
a

解析:
obja、objb为对象变量,在内存中有obja、objb两个对象值的存储空间,两个内存地址,同时有obja,objb两个对象指针;
objb=obja;相当于obja、objb的指针同时指向了obja的内存地址;所以不管是obja、objb其中任何一个变化,另一个也会相应的变化
a、b为值变量;a,b的指针都指向自己本身,所以a,b变化不会互相受影响

nodejs两个模块互相引用的问题

classA:

const classB = require("./classB");
const classC = require("./classC");

console.log(classC);
console.log(classB);

//{}
//{ [Function: classC] ccc: [] }
//{ [Function: classB] connList: [] }

//出现了互相引用
class classA {
  static addA() {
    this["connList"].push("A");
  }
}

classA["connList"] = [];
module.exports = classA;

classB:

const classA = require("./classA");
console.log(classA);
class classB {
  static addB() {
    // classA["connList"].push("A");
    console.log("执行一次");
    classA.addA();
  }
}
classB["connList"] = [];

module.exports = classB;

class C:

class classC {}
classC["ccc"] = [];
module.exports = classC;

此时A引用了B、C ,B引用了A,C都没用引用A B
当执行node classA时,就有了以下结果;

//{}
//{ [Function: classC] ccc: [] }
//{ [Function: classB] connList: [] }

nodejs require只引用一次

testRequire.js类:

console.log("执行一次");

testRequireExec:

require("./testRequire");
require("./testRequire");
require("./testRequire");

控制台结果:

softwaredeMacBook-Pro:test software$ node testRequireExec.js 
执行一次

nodejs在加载module的时候只会加载一次,然后把当前module缓存起来

nodejs moudle的值在外部的影响

vars:

let a = 0;
let obj = {
  propa: 1,
  fn: function(params) {},
  add: function(params) {
    this.propa++;
  }
};
obj["connList"] = [];
exports.obj = obj;
exports.a = a;

envA:

let vars = require("./vars");

let b = vars.a;
b++;
vars.a = vars.a + 1;
let Aobj = vars.obj;
vars.obj["connList"].push("A");
Aobj["connList"].push("A-extend");

envB:

let vars = require("./vars");
vars.a = vars.a + 1;
vars.obj["connList"].push("B");

varsExec.js

require("./envA");
require("./envB");
require("./envA");
require("./envA");

let vars = require("./vars");
console.log("a:" + vars.a);
console.log("obj:");
console.log(vars.obj);

控制台结果:

a:2
obj:
{ propa: 1,
  fn: [Function: fn],
  add: [Function: add],
  connList: [ 'A', 'A-extend', 'B' ] }

综合了上面模块moudle require,值变量 对象变量知识 的一个demo

点赞
收藏
评论区
推荐文章
待兔 待兔
1年前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Karen110 Karen110
4年前
一篇文章带你了解JavaScript作用域
在JavaScript中,对象和函数也是变量。在JavaScript中,作用域是你可以访问的变量、对象和函数的集合。JavaScript有函数作用域:这个作用域在函数内变化。一、本地JavaScript变量一个变量声明在JavaScript函数内部,成为函数的局部变量。局部变量有局部作用域:它们只能在函数中访问。JS://codeherecann
Python进阶者 Python进阶者
4年前
一篇文章告诉你JavaScript 如何实现继承
背景简介JavaScript在编程语言界是个特殊种类,它和其他编程语言很不一样,JavaScript可以在运行的时候动态地改变某个变量的类型。比如你永远也没法想到像isTimeout这样一个变量可以存在多少种类型,除了布尔值true和false,它还可能是undefined、1和0、一个时间戳,甚至一个对象。如果代码跑异常,打开浏览器,开始断点调试,发现
Wesley13 Wesley13
4年前
java常用类(2)
三、时间处理相关类Date类:计算机世界把1970年1月1号定为基准时间,每个度量单位是毫秒(1秒的千分之一),用long类型的变量表示时间。Date分配Date对象并初始化对象,以表示自从标准基准时间(称为“历元”(epoch),即1970年1月1日08:00:00GMT)以来的指定毫秒数。示例:packagecn.tanjian
Easter79 Easter79
4年前
swift高阶函数和函数式编程
Swift函数式编程,函数式编程的思想就是一切皆函数,可以是被当作变量,参数,返回值。高阶函数运用对swift编程很重要。基础一般常用的几个高阶函数如下letnumArr5,4,6,1,7//遍历所有并操作print(numArr.map{$01})//输出:6,5,7,2,8
待兔 待兔
5年前
[Dart]Dart语言之旅<二>:变量
变量以下是创建变量并为其分配值的示例:varname'Bob';变量是引用。名为name的变量包含对值为“Bob”的String类型的对象的引用。默认值未初始化的变量的初始值为null。即使是数字类型的变量,初始值也为null,因为数字也是对象。intlineCount;assert(lineCountnull)
御弟哥哥 御弟哥哥
5年前
彻底理解js的执行上下文,以及变量对象
在js中,执行上下文(ExecutionContext)是非常重要的一种对象,它保存着函数执行所需的重要信息,其中有三个属性:变量对象(variableobject),作用域链(scopechain),this指针(thisvalue),它们影响着变量的解析,变量作用域和函数this的指向。上下文栈(ExecutionContextS
Wesley13 Wesley13
4年前
Java深拷贝和浅拷贝
1.浅复制与深复制概念⑴浅拷贝(浅克隆)   复制出来的对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象。⑵深拷贝(深克隆)   复制出来的所有变量都含有与原来的对象相同的值,那些引用其他对象的变量将指向复制出来的新对象,而不再是原有的那些被引用的对象。换言之,深复制
Stella981 Stella981
4年前
JavaScript易错知识点整理
前言本文是我学习JavaScript过程中收集与整理的一些易错知识点,将分别从变量作用域,类型比较,this指向,函数参数,闭包问题及对象拷贝与赋值这6个方面进行由浅入深的介绍和讲解,其中也涉及了一些ES6的知识点。JavaScript知识点1.变量作用域vara1;functio
Stella981 Stella981
4年前
Groovy中方法的调用实现方式浅析(CallSite)
 在Groovy中可以很方便的交换两个变量的值,如:def (a, b)  1, 2;(a, b)  b, a; 这样,a,b变量的值就交换了,那么Groovy是怎样实现的呢? 来看看生成的字节码文件,关键的代码如下:  // Method descriptor 39 ()
Wesley13 Wesley13
4年前
Java面试中的值传递与引用传递
一、前言Java是值传递的,对基本型变量而言的,传递的是该变量的一个副本,改变副本不影响原变量。对于对象型变量而言的,传递的是该对象地址的一个副本,,并不是原对象本身,这里也有人说是引用传递。由于副本的地址和原对象地址一致,因此对副本的值进行操作时,会同步改变原对象值。_但是一旦副本的地址被改变,副本的值的操作则不会影响原对象地址。(