理解Javascritp中的引用

Author: bugall
Wechat: bugallF
Email: 769088641@qq.com
Github: https://github.com/bugall

一: 函數中的引用傳遞

我們看下下面的代碼的正確輸出是什么

function changeStuff(a, b, c)
{a = a * 10;b.item = "changed";c = {item: "changed"};
}var num = 10;
var obj1 = {item: "unchanged"};
var obj2 = {item: "unchanged"};changeStuff(num, obj1, obj2);console.log(num); // 10
console.log(obj1.item); // changed    
console.log(obj2.item); // unchanged

在javascript中除了基礎類型采用的是值(值類型有哪些)傳遞,而對象采用是引用傳遞。這就好理解為什么a的值沒有被修改。

那為什么obj1的值修改了,但是obj2的值卻沒有被覆蓋?當我們調用changeStuff函數的時候,參數b,c的值分別是obj1,obj2的引用。

當我們去修改的b的值的時候,因為b->obj1的引用關系沒有變,所以實際修改的是obj1的值。但是參數c的情況就不同了,因為我們在函數中對c進行了引用的重新綁定,c = {item: "changed"} 這時候的c中的對象引用已經改變,這里要清楚引用和指針的關系。

二: 邏輯判斷中的引用

通常我們會把==理解為值相同,把===理解為值相同且類型相同。

但是這種理解不是完全準確的。0=='' //true,直觀理解上0怎么會等于''空字符串呢?因為在做==邏輯判斷的時候js會把==兩邊的值做類型轉換,然后再比較。

另外在javascript中比較奇葩的就是關于null,我很難理解為什么null支持比較呢?比如在SQL中我們是不能對null值直接比較的,通常都會使用is null or is not null來做判斷。

如果我們把===理解為值相同,且類型相同那么就無法理解[1] === [1] // false的情況,因為[1]值相同,類型也相同。

我們應該怎么理解===

===不會判斷值是否相同,只會判斷===左右兩邊的變量保存的引用地址是否相同,我們一起看下例子

var a = [1,2,3];
var b = [1,2,3];
var c = a;var ab_eq = (a === b); // false 因為a,b的引用不同,
// 或者理解為a,b引用的對象在堆上不是同一個對象。var ac_eq = (a === c); // true 因為a保存了一份對象的引用,
// `c=a` c會把a的值copy一份,這是a,c的值(保存對象的引用)相同。 其實對于一個變量來說,包含了`左值`和`右值` 后面我會整理文章

類似的例子

var a = { x: 1, y: 2 };
var b = { x: 1, y: 2 };
var c = a;var ab_eq = (a === b); // false type)
var ac_eq = (a === c); // true
var a = { };
var b = { };
var c = a;var ab_eq = (a === b); // false 
var ac_eq = (a === c); // true

總結===的三種情況

對于整型 (numbers):
a === b // 如果值相同返回true對于引用類型來說:
a === b // 如果a,b保存的是同一個對象的引用返回true對字符串來說:
a === b // 左右兩邊的字符相同返回true

var1 == var2 結果圖
圖片描述

三: const中的引用

我們首先看下官方的定義:

constant cannot change through re-assignment
constant cannot be re-declared

簡單翻譯就是:const定義的變量不能被重新定義,不能被重新賦值。
const 只能確保定義的變量的引用地址不會被改變。但是如果引用指向的
是一個對象的話,你是可以對對象里的值進行修改的,因為沒有改變對象
自身的地址。

const x = {};
x = {foo: 'bar'}; // error - re-assigningconst y = ['foo'];
const y = ['bar']; // error - re-declaringconst foo = 'bar'; 
foo = 'bar2';       // error - can not re-assign
var foo = 'bar3';   // error - already declared
function foo() {};  // error - already declared

但是對于值的修改是允許的

const x = {};x.foo = 'bar';console.log(x); // {foo : 'bar'}const y = [];y.push('foo');console.log(y); // ['foo'];

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/258463.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/258463.shtml
英文地址,請注明出處:http://en.pswp.cn/news/258463.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

通過擴展改善ASP.NET MVC的驗證機制[實現篇]

通過擴展改善ASP.NET MVC的驗證機制[實現篇] 原文:通過擴展改善ASP.NET MVC的驗證機制[實現篇]在《使用篇》中我們談到擴展的驗證編程方式,并且演示了本解決方案的三大特性:消息提供機制的分離、多語言的支持和多驗證規則的支持,我們現在來看…

canopen和1939區別_CAN 和 CANopen的區別和聯系

1、CAN與CANopen的共同點與不同點:CAN只定義了物理層與鏈路層,而沒有定義用戶層,用戶可根據自己的需要定義一些網絡上的通信約定; CANopen是在CAN的基礎上定義了用戶層,即規定了用戶、軟件、網絡終端等之間用來進行信…

ONOS系統架構演進,實現高可用性解決方案

上一篇文章《ONOS高可用性和可擴展性實現初探》講到了ONOS系統架構在高可用、可擴展方面技術概況,提到了系統在分布式集群中怎樣保證數據的一致性。在數據終于一致性方面,ONOS採用了Gossip協議。這一部分的變化不大,而在強一致性方案的選擇方…

Struts2_day01

Java Web開發常用框架 SSH(Struts2 Spring Hibernate)SSM(Struts2 Spring MyBatis)SSI(Struts2 Spring iBatis) 多種框架協同工作 Web層 -- Service層 -- Dao層 Struts2框架: Struts2是一個基于MVC設計模式的Web應用框架,它本質上相當于一個servlet,在MV…

使用 python 開發 Web Service

使用 python 開發 Web Service Python 是一種強大的面向對象腳本語言,用 python 開發應用程序往往十分快捷,非常適用于開發時間要求苛刻的原型產品。使用 python 開發 web service 同樣有語言本身的簡捷高速的特點,能使您快速地提供新的網絡服…

python中輸出n開始的5個奇數_送你99道Python經典練習題,練完直接上手做項目,免費送了來拿吧...

學python沒練習題怎么行、今天,給大家準備一個項目: 99道編程練習,這些題如果能堅持每天至少完成一道,一定可以幫大家輕松 get Python 的編程技能。目前,這個項目已經獲得了 2924 Stars,2468 Forks。首先&a…

java 基礎5

一、 什么是數組及其作用? 定義:具有相同數據類型的一個集合 作用:存儲連續的具有相同類型的數據 二、 java中如何聲明和定義數組 2.1 聲明和定義的語法: 數據類型[ ] 數組名;( int[ ] nums ; ) 或 數…

TFS(Team Foundation Server)介紹和入門

在本文的兩個部分中,我將介紹Team Foundation Server的一些核心特征,重點介紹在本產品的日常應用中是怎樣將這些特性結合在一起使用的。 作為一名軟件開發者,在我的職業生涯中,我常常會用到支持軟件開發過程的大量開發工具&#x…

逆函數求導公式_反函數求導法則

反函數的求導法則是:反函數的導數是原函數導數的倒數。例題:求yarcsinx的導函數。首先,函數yarcsinx的反函數為xsiny,所以:y‘1/sin’y1/cosy,因為xsiny,所以cosy√1-x2,所以y‘1/√…

SpringXML方式配置bean的懶加載lazy-init

lazy-init&#xff08;懶加載&#xff09;&#xff0c;表示該bean在容器初始化的時候不進行初始化。例如&#xff1a;<bean name"role1" class"com.fz.entity.Role" lazy-init"true">以上配置表示&#xff1a;spring容器在初始化的時候不會…

windows下system函數的使用

system函數 是可以調用一些DOS命令,比如system("cls");//清屏,等于在DOS上使用cls命令寫可執行文件路徑&#xff0c;可以運行它 下面列出常用的DOS命令,都可以用system函數調用: ASSOC 顯示或修改文件擴展名關聯。AT 計劃在計算機上運行的命令和程序。ATTRIB 顯示或更…

WWDC2017 筆記 - Cocoa Touch 中的新特性

這篇文章是 What’s New in Cocoa Touch / UIKit Session 201 的一些整理。【基于OC】 轉自我的 Blog: Dannys Dream Drag Drop 新的交互方式 拖拽 Drag 需要 Drag 的對象要 add 一個 UIDragInteraction &#xff0c;用法類似于 UIGestureRecognizer 。UIDragInteraction 有一個…

[Hadoop] - 自定義Mapreduce InputFormatOutputFormat

在MR程序的開發過程中&#xff0c;經常會遇到輸入數據不是HDFS或者數據輸出目的地不是HDFS的&#xff0c;MapReduce的設計已經考慮到這種情況&#xff0c;它為我們提供了兩個組建&#xff0c;只需要我們自定義適合的InputFormat和OutputFormat&#xff0c;就可以完成這個需求&a…

PS 色調——老照片效果

這就是通過調色使照片顯得發黃。 R_new0.393*R0.769*G0.189*B; G_new0.349*R0.686*G0.168*B; B_new0.272*R0.534*G0.131*B; clc; clear all; Imageimread(9.jpg); Imagedouble(Image); Image_newImage; Image_new(:,:,1)0.393*Image(:,:,1)0.769*Image(:,:,2)0.189*Image(:,:,3…

jsp出現錯誤

昨天在調試頁面時發生了如圖顯示的異常&#xff0c;它出現的原因是當<jsp:forward>或<jsp:include>標簽沒有參數時&#xff0c;開始標簽和結束標簽</jsp:forward>或</jsp:include>之間不能有空格&#xff0c;不能換行。解決辦法&#xff1a;刪除標簽之…

門限回歸模型的思想_Stata+R:門檻回歸教程

來源 | 數量經濟學綜合整理轉載請聯系進行回歸分析&#xff0c;一般需要研究系數的估計值是否穩定。很多經濟變量都存在結構突變問題&#xff0c;使用普通回歸的做法就是確定結構突變點&#xff0c;進行分段回歸。這就像我們高中學習的分段函數。但是對于大樣本、面板數據如何尋…

【數論】[CF258C]Little elephant and LCM

題目 分析&#xff1a;枚舉最大數&#xff0c;然后找出它所有因數p1…….pk&#xff0c; 從中任意選取一些數&#xff0c;這些數的LCM|這個數且&#xff0c;這些數的最大LCM就是枚舉的這個數&#xff0c;且若pi<aj<pi1則前i個數可以放在j這個位置&#xff0c;即j這個位置…

為普通Object添加類似AttachedProperty的屬性

為普通Object添加類似AttachedProperty的屬性 周銀輝 我們知道&#xff0c;在WPF中對應一個DependencyObject&#xff0c;我們很容易通過AttachedProperty來為類型附加一個屬性。但對于普通的Object而言&#xff0c;這就不可行了。 我現在遇到這樣一個問題&#xff0c;下面有一…

python 操作RabbitMQ

pip install pika使用API操作RabbitMQ基于Queue實現生產者消費者模型View Code 對于RabbitMQ來說&#xff0c;生產和消費不再針對內存里的一個Queue對象&#xff0c;而是某臺服務器上的RabbitMQ Server實現的消息隊列。#!/usr/bin/env python import pika# ###################…

python和嵌入式哪個容易_嵌入式與python選哪個

從概念上來說&#xff0c;嵌入式和Python的區別還是比較明顯的&#xff0c;嵌入式是一個開發領域&#xff0c;而Python則是一門編程語言。嵌入式開發是開發領域的一個重要分支&#xff0c;是物聯網領域技術的重要組成部分&#xff0c;可以說有物聯網的地方就離不開嵌入式開發。…