js 值和引用

js对值和引用的赋值/传递在语法上没有区别,完全根据值得类型决定

简单值(即标量基本类型值),总是通过值复制的方式来赋值/传递,包括null,undefined,字符串,数字,布尔值和ES6中的symbol。

复合值——对象(包括数组和封装对象)和函数,则总是通过引用复制的方式来赋值/传递。

__________________________________

简单值

var a0=2;
var b0=a0;
b0++;
console.log(a0);//2
console.log(b0);//3

简单值注意

虽然传递的是指向数字对象的引用复本,但我们并不能通过它来更改其中的基本类型值

function foo(x){

  x=x+1;

  console.log(x);//3

}

var a=2;

var b= new Number(a);//Object(a)也一样

foo(b);

console.log(b);//2

__________________________________

数组

var a=[1,2,3];
var b=a;
b.push(4);
console.log(a); //[1,2,3,4]
console.log(b); //[1,2,3,4]

var c=[1,2,3];
var d=c;
d=[4,5,6];
console.log(c);//[1,2,3]
console.log(d);//[4,5,6]

__________________________________

对象

var obj={a:2};

function foo(weapper){

  wrapper.a=42;

}

foo(obj);

console.log(obj.a);// 42

_________________________________________________

注意函数参数

function foo(x){
  x.push(4);
  console.log(x);//[1,2,3,4]

  x=[4,5,6];
  x.push(7);
  console.log(x);//[4,5,6,7]
}
var e=[1,2,3];
foo(e);
console.log(e);//[1,2,3,4]而非[4,5,6,7]

我们像函数传递e的时候,实际是将引用e的一个复本赋值给x,而a仍然指向[1,2,3].在函数中我们可以通过引用x来更改数组的值(push(4)之后变为[1,2,3,4]).但x=[4,5,6]并不影响e的指向,所以e仍然指向[1,2,3,4].

不能通过引用x来更改引用e的指向,只能更改e和x的共同指向的值。

如果要将e的值变为[4,5,6,7],必须更改x指向的数组,而不是为x赋值一个新的数组

function foo(x){
x.push(4);
console.log(x);//[1,2,3,4]

x.length=0;
x.push(4,5,6,7);
console.log(x);//[4,5,6,7]
}
var e=[1,2,3];
foo(e);
console.log(e);//[4,5,6,7]

时间: 2024-10-12 03:14:37

js 值和引用的相关文章

js中 原始值和引用值

在 ECMAScript 中,变量可以存在两种类型的值,即原始值和引用值. 原始值-----存储在栈(stack)中的简单数据段,也就是说,它们的值直接存储在变量访问的位置; 引用值-----存储在堆(heap)中的对象,也就是说,存储在变量处的值是一个指针(point),指向存储对象的内存处. 如果一个值是引用类型的,那么它的存储空间将从堆中分配.由于引用值的大小会改变,所以不能把它放在栈中,否则 会降低变量查寻的速度.相反,放在变量的栈空间中的值是该对象存储在堆中的地址.地址的大小是固定的,

【我的OOP学习笔记】值与引用(2)语义类型

值与引用 值语义的对象是独立的,语义的对象却是允许共享的.由于Java不支持值类型对象,Java程序员才更需要加强这方面的意识.语法和语义并不总是一致的——语法上的值类型可能在语义上是引用类型,语法上的引用类型可能在语义上是值类型.永远不要忘记一个基本原则:语法只是手段,语义才是目的. 为了判断一个类型的语义,那么简明的‘石蕊测试法’便是一个很好的选择.在不影响程序正确性的前提下,一个对象的复件能否代替原件?如果可以则该对象的类型是值语义的,否则是引用语义的.(这种判断方法与语法无关,完全取决于

C# 函数参数传递(按值和引用)

C#中的数据类型.分值类型和引用类型两大类. 值类型:直接存储数据的值,保存在内存中的stack(堆栈)中 引用类型:存储对值的引用,实际上存储的就是一个内存的地址.引用类型的保存分成两块,实际值保存在托管堆(heap)中.实际值的内存地址保存在stack中 当使用引用类型时先找到stack中的地址,再找到heap中的实际值. 也就是说保存引用类型时要用到stack和heap,但使用引用类型时我们实际上只用到stack中的值,然后通过这个值间接的访问heap中的值 C#预定义的简单类型,像int

ECMAScript 原始值和引用值

在 ECMAScript 中,变量可以存在两种类型的值,即原始值和引用值. 原始值和引用值 在 ECMAScript 中,变量可以存在两种类型的值,即原始值和引用值. 原始值 存储在栈(stack)中的简单数据段,也就是说,它们的值直接存储在变量访问的位置. 引用值 存储在堆(heap)中的对象,也就是说,存储在变量处的值是一个指针(point),指向存储对象的内存处. 为变量赋值时,ECMAScript 的解释程序必须判断该值是原始类型,还是引用类型.要实现这一点,解释程序则需尝试判断该值是否

js彈出層或者js彈出引用url Frame 層

function Popup() { var _this = this; this.CssName = "layermask";//樣式 //遮蓋層 this.hiddLayer = function() { try{ var obj = document.getElementById("syspopup_layer"); if (obj != null) document.body.removeChild(obj); }catch(e){} }; this.sho

为什么赋值操作符函数的参数为const引用,返回值为引用

为什么赋值操作符函数的参数为const引用,返回值为引用 1.返回值类型 返回类型一般声明为类型的引用,并在函数结尾时返回实例自身的引用(即*this).这里主要有两个原因:(1)返回引用可以减少一次拷贝构造和析构函数导致不必要的开销,因为返回值类型不是引用,会创建一个匿名对象,这个匿名对象时个右值,获取return的值.(2)可以实现连续赋值 在例子中 b=c=a; 返回值不是引用类型也是可以的,其运算顺序 b=(c=a); c得到一个右值,再将右值赋给b,所以逻辑上没有问题的.但是如果是 (

理解PHP的变量,值与引用的关系

--- title: 理解PHP的变量,值与引用的关系 createdDate: 2015-03-11 category: php --- PHP的变量与C++中的变量是两种截然不容的概念.如果没有理解清楚,使用C++的方式来思考PHP就会遇到一些问题. C++中,变量与值是绑定的.值是内存的上的一块内存上的数据,而变量则是操作这块内存的名称.变量消失(比如超出作用域)值也会消失. 而PHP中,变量和值是两个概念.PHP是一种弱类型语言,值在PHP的内部(zend引擎),被存放在一个zval结构

原始值和引用值

在 ECMAScript 中,变量可以存在两种类型的值,即原始值和引用值. 原始值 存储在栈(stack)中的简单数据段,也就是说,它们的值直接存储在变量访问的位置. 引用值 存储在堆(heap)中的对象,也就是说,存储在变量处的值是一个指针(point),指向存储对象的内存处. 为变量赋值时,ECMAScript 的解释程序必须判断该值是原始类型,还是引用类型.要实现这一点,解释程序则需尝试判断该值是否为 ECMAScript 的原始类型之一,即 Undefined.Null.Boolean.

JavaScript-原始值和引用值

一.原始值和引用值的概念 在 ECMAScript 中,变量可以存在两种类型的值,即原始值和引用值. 1.1 原始值 (1)原始值指的是 原始类型 的值,也叫 基本类型,例如 Number.Stirng.Boolean.Null.Underfined . (2)存储在栈(stack)中的简单数据段,也就是说,它们的值直接存储在变量访问的位置. (3)注意 在许多语言中,字符串都被看作引用类型,而非原始类型,因为字符串的长度是可变的.ECMAScript 打破了这一传统. 1.2 引用值 (1)引