首页 > 其他分享 >js 原始值

js 原始值

时间:2024-01-10 22:32:31浏览次数:32  
标签:obj name 对象 函数 js person 原始 变量

原始值和引用值在通过变量复制时也有所不同。在通过变量把一个原始值赋值 到另一个变量时,原始值会被复制到新变量的位置。请看下面的例子:

let num1 = 5;
    let num2 = num1;

这里,num1 包含数值 5。当把 num2 初始化为 num1 时,num2 也会得到数值 5。这个值跟存储在 num1 中的 5 是完全独立的,因为它是那个值的副本。

这两个变量可以独立使用,互不干扰。

在把引用值从一个变量赋给另一个变量时,存储在变量中的值也会被复制到新变量所在的位置。区 别在于,这里复制的值实际上是一个指针,它指向存储在堆内存中的对象。操作完成后,两个变量实际 上指向同一个对象,因此一个对象上面的变化会在另一个对象上反映出来,如下面的例子所示:

let obj1 = new Object();
let obj2 = obj1;
obj1.name = "Nicholas";
console.log(obj2.name); // "Nicholas"

在这个例子中,变量 obj1 保存了一个新对象的实例。然后,这个值被复制到 obj2,此时两个变 3 量都指向了同一个对象。在给 obj1 创建属性 name 并赋值后,通过 obj2 也可以访问这个属性,因为它们都指向同一个对象。


1. 传递参数:

ECMAScript 中所有函数的参数都是按值传递的。这意味着函数外的值会被复制到函数内部的参数 中,就像从一个变量复制到另一个变量一样。如果是原始值,那么就跟原始值变量的复制一样,如果是 引用值,那么就跟引用值变量的复制一样。对很多开发者来说,这一块可能会不好理解,毕竟变量有按 值和按引用访问,而传参则只有按值传递。

在按值传递参数时,值会被复制到一个局部变量(即一个命名参数,或者用 ECMAScript 的话说, 就是 arguments 对象中的一个槽位)。在按引用传递参数时,值在内存中的位置会被保存在一个局部变 量,这意味着对本地变量的修改会反映到函数外部。

function addTen(num) {
      num += 10;
      return num;
    }
    let count = 20;

函数 addTen()有一个参数 num,它其实是一个局部变量。在调用时,变量 count 作为参数 传入。count 的值是 20,这个值被复制到参数 num 以便在 addTen()内部使用。在函数内部,参数 num 的值被加上了 10,但这不会影响函数外部的原始变量 count。参数 num 和变量 count 互不干扰,它们 只不过碰巧保存了一样的值。

如果 num 是按引用传递的,那么 count 的值也会被修改为 30。这个事实 在使用数值这样的原始值时是非常明显的。

function setName(obj) {
      obj.name = "Nicholas";
}
    let person = new Object();
    setName(person);
    console.log(person.name);  // "Nicholas"

创建了一个对象并把它保存在变量 person 中。然后,这个对象被传给 setName() 方法,并被复制到参数 obj 中。在函数内部,obj 和 person 都指向同一个对象。结果就是,即使对象 是按值传进函数的,obj 也会通过引用访问对象。

当函数内部给 obj 设置了 name 属性时,函数外部的 对象也会反映这个变化,因为 obj 指向的对象保存在全局作用域的堆内存上。很多开发者错误地认为, 当在局部作用域中修改对象而变化反映到全局时,就意味着参数是按引用传递的。为证明对象是按值传 递的。

function setName(obj) { obj.name = "Nicholas"; obj = new Object(); obj.name = "Greg";
}
    let person = new Object();
    setName(person);
    console.log(person.name);  // "Nicholas"

前后唯一的变化就是 setName()中多了两行代码,将 obj 重新定义为一个有着不同 name 的新对象。当 person 传入 setName()时,其 name 属性被设置为"Nicholas"。然后变量 obj 被设置 为一个新对象且 name 属性被设置为"Greg"。如果 person 是按引用传递的,那么 person 应该自动将 指针改为指向 name 为"Greg"的对象。

可是,当我们再次访问 person.name 时,它的值是"Nicholas", 这表明函数中参数的值改变之后,原始的引用仍然没变。当 obj 在函数内部被重写时,它变成了一个指 向本地对象的指针。而那个本地对象在函数执行结束时就被销毁了。

标签:obj,name,对象,函数,js,person,原始,变量
From: https://blog.51cto.com/u_16237074/9186725

相关文章

  • js 函数
    函数对任何语言来说都是核心组件,因为它们可以封装语句,然后在任何地方、任何时间执行。ECMAScript中的函数使用function关键字声明,后跟一组参数,然后是函数体。以下是函数的基本语法:functionfunctionName(arg0,arg1,...,argN){statements}下面是一个例子:functionsayHi(......
  • js switch语句
    with语句的用途是将代码作用域设置为特定的对象,其语法是:with(expression)statement;使用with语句的主要场景是针对一个对象反复操作,这时候将代码作用域设置为该对象能提供便利,如下面的例子所示:letqs=location.search.substring(1);lethostName=location.hostnam......
  • js for
    for-in语句是一种严格的迭代语句,用于枚举对象中的非符号键属性,语法如下:for(propertyinexpression)statement下面是一个例子:for(constpropNameinwindow){document.write(propName);}这个例子使用for-in循环显示了BOM对象window的所有属性。每次执行循环,都会给......
  • RxJS
     什么是RxJSRxJS是一个用于响应式流的库,它基于Observables(可观察对象)和Operators(操作符)的概念。它提供了一种响应式编程的方式,使得异步数据流和事件更容易管理和组合。 什么是流流可以被视为一个持续的事件序列。它可以是由用户交互、网络请求、定时器等事件触发的数据序列。这?......
  • [protobuf] ProtoBufEditor 解析bin文件和json文件
    ProtoBufEditor解析bin文件和json文件ProtoBufEditor是一个用于编辑ProtocolBuffers(ProtoBuf)文件的工具。支持导入的文件类型SingleMessageDelimitedMessagesSelfDescribingMessageSelfDescribingDelimitedText(SingleMessage)Json(SingleMessage)解析bin......
  • delphi JSON序列化(五)
    关于TJSONConverters的使用unitUnit1;interfaceusesWinapi.Windows,Winapi.Messages,System.SysUtils,System.Variants,System.Classes,Vcl.Graphics,Vcl.Controls,Vcl.Forms,Vcl.Dialogs,Vcl.StdCtrls,Vcl.Buttons,Rest.JSON.Types,Rest.JsonReflect;t......
  • delphi JSON序列化(四)
    涉及的重要类REST.Json,REST.JsonReflect,REST.Json.Interceptors,REST.Json.Types单元中。一、TJson类最简单的一个类,提供了JSON->OBJECT和OBJECT->JSON几个方法,方法有TJsonOptions参数,如:   classfunctionObjectToJsonObject(AObject:TObject;AOptions:TJsonOpti......
  • js判断坐标点是否在一个多边形坐标数组范围内
    主要用到了射线法(RayCastingAlgorithm)来判断一个点是否在多边形的范围内。下面是一个简单的JavaScript函数来实现这个功能:functionpointInPolygon(point,polygon){varx=point[0];vary=point[1];varinside=false;for(vari=0,j=polygon.length-1;......
  • JOSN字符串字段遍历(json-path)
    官网https://github.com/json-path/JsonPath依赖<dependency><groupId>com.jayway.jsonpath</groupId><artifactId>json-path</artifactId><version>2.5.0</version></dependency>......
  • Node.js 多线程编程:优化性能的关键步骤
    在 Node.js多线程允许Node.js应用并行处理任务,以此来提高性能和响应速度。Node.js内置了如 worker_threads 这样的模块来支持多线程。通过分配任务给不同的线程,能够更好地利用多核处理器,缓解单线程应用可能出现的瓶颈。Node.js中多线程的适用场景在 Node.js 中,以下几种情......