一、JavaScript不可变原始值

  JavaScript中的原始值(undefined,null,布尔值,数字和字符串)与对象(包括了数组和函数)有着根本的区别。原始值是不可变的(undefined,null,布尔值,数字和字符串)任何方法都不法更改(或“突变”)一个原始值。

var s= "Hello world!";
console.log(s.toUpperCase()); //=>HELLO WORLD! //可以看到返回的值是....
console.log(s); //=>Hello world! //可以看到这个值没有被修改

可以看到s的值最终是没有被修改

原始值的比较是值值的比较,只有在他们的值相同的情况下,Javascript才会认为他们是相等的。对于两个单独的字符串来讲,当它们的长度相等且每个索引的字符都相等时,Javascript才会认为他们是相等的


二、可变的对象引用

  对象和原始值不同,它们首先是可变的,也就是说他们值是可以改变的;

  

var  a = {x:1};
a.x= 2;
a.y= 3; console.log(a.x); //=>2
console.log(a.y); //=>3

  下面的定义也有“二”:对象的比较和原始值的的值的比较,就算是两个对象包含同样的属性及相同的值,它们也是不相等的只有在索引元素完全相等的两个数组也不会相等的

var arr1 = ['a','b','c'];
var arr2 = ['a','b','c'];
//可以看到上面的两个数组arr1和arr2的元素是相同的
console.log(arr1 === arr2); //=>false 首先用一下javascript当中的最牛X的恒等来比较一下!发现不相等
console.log(arr1 == arr2); //=>false 最后在用一下普通的比较一下,发现也是不相

  那么就看上面的定义的,那样,我们用他们的值和索引来比较看看他们会不会相等呢?

var arr1 = ['a','b','c'];
var arr2 = ['a','b','c'];
//可以看到上面的两个数组arr1和arr2的元素是相同的
console.log(arr1 === arr2); //=>false 首先用一下javascript当中的最牛X的恒等来比较一下!发现不相等
console.log(arr1 == arr2); //=>false 最后在用一下普通的比较一下,发现也是不相同的; //写一个判断元素和值比较的一个函数
function test(arr1,arr2){
if(arr1.length != arr2.length) return false; //如果他们的数组长度都不相等的话,那么他们一定是不相等的;
for(var i = 0; i < arr1.length; i++)
if(arr1[i] !== arr2[i])return false; //如果两个数组当中的有一个值不相等就返回false,判定为两个数组不相等
return true; //如果是返回的是true的话,那么说明arr1和arr2是相等的两个数组;
} console.log(test(arr1,arr2)); //=>true 可以发现他们是相等的;这里我使用了恒等来判定的;这样判定可以防止javascript进行数据类型的隐式救困转换

JavaScript不可变原始值和可变的对象引用的更多相关文章

  1. js 不可变的原始值和可变的对象引用

    javascript中的原始值(undefined.null.布尔值.数字和字符串)与对象(包括数组和函数)有着根本区别.原始值是不可更改的:任何方法都无法更改(或“突变”)一个原始值.对数字和布尔值 ...

  2. javascript中的原始值和复杂值

    × 目录 [1]特性 [2]存储方式 [3]访问方式 [4]比较方式 [5]动态属性 前面的话 javascript的数据类型可以分为两种:原始类型和引用类型.原始类型也称为基本类型或简单类型,jav ...

  3. 【JavaScript 从零开始】 原始值和对象引用、类型转换

    JavaScript 中的原始值(undefined.null . 布尔值.数值和字符串)于对象(包括数组和函数)有着根本区别. 原始值是不可更改的:任何方法都无法改变(或“突变”)一个原始值. 对于 ...

  4. 论javascript中的原始值和对象

    javascript将数据类型分为两类:原始值(undefined.null.布尔值.数字和字符串),对象(对象.函数和数组) 论点:原始值不可以改变,对象可以改变:对象为引用类型: '原始值不可以改 ...

  5. JavaScript数据操作--原始值和引用值的操作本质

    我的一句话总结:原始值不管是变量赋值还是函数传递都不会改变原值,引用值不管是变量赋值还是函数传递,如果新变量重新赋值,则不会影响原引用值,如新变量是直接操作,就会影响原引用值. 首先明确,值和类型是两 ...

  6. JavaScript检测原始值、引用值、属性

    上周写过一篇读书笔记<编写可维护的JavaScript>之编程实践,其中 第8章 避免『空比较』是博主在工作中遇坑较多的雷区,所以特此把该章节重新整理分享,希望大家不再坑队友(>﹏& ...

  7. JavaScript中对象转换为原始值的规则

    JavaScript中对象转换为原始值遵循哪些原则? P52 对象到布尔值对象到布尔值的转换非常简单:所有的对象(包括数字和函数)都转换为true.对于包装对象亦是如此:new Boolean(fal ...

  8. javascript中可变值与不可变值(原始值)

    字符串原始值修改不了1 var str = "abc"; 2 str[0] = "d"; 3 console.log(str[1]="f") ...

  9. (复杂值vs原始值)&&内存空间 — 准确我们的JavaScript世界观(一):

    写在前面 最近在读<JavaScript启示录>,这本书不是JavaScript的详尽的参考指南,但是把对象作为了解JavaScript的透镜,受益匪浅. 那么我们先来聊一下JavaScr ...

随机推荐

  1. Django中的Model(表结构)

    Model(表设计) 在这里只提经常用到的三种联表结构: 一对多:models.ForeignKey(其他表) 多对多:models.ManyToManyField(其他表) 一对一:models.O ...

  2. Google邮箱:Gmail国际顶级邮箱

    本博文的主要内容有 .Google邮箱的介绍   1.Google邮箱的介绍 https://zh.wikipedia.org/wiki/Gmail http://mail/google.com/ h ...

  3. thinkphp框架dump友好调试输出函数

    /** * 浏览器友好的变量输出 * @param mixed $var 变量 * @param boolean $echo 是否输出 默认为True 如果为false 则返回输出字符串 * @par ...

  4. java工具类--数据库操作封装类

    java对数据库操作简单处理,如下代码即可,封装了 增删改查及获取连接.关闭连接. 代码如下: package com.test; import java.sql.Connection; import ...

  5. vs2012关闭IDE硬件加速设置

    对于我这样的老古董电脑是很有必要的设置! 如图所示:

  6. POJ 3414 Pots【bfs模拟倒水问题】

    链接: http://poj.org/problem?id=3414 http://acm.hust.edu.cn/vjudge/contest/view.action?cid=22009#probl ...

  7. delphi TColorDialog

    TColorDialog 预览          实现过程 动态创建和使用颜色对话框 function ShowColorDlg:TColor;begin  with TColorDialog.Cre ...

  8. [RxJS] Filtering operators: skipWhile and skipUntil

    After takeUntil() and takeWhile() function, let's have a look on skipWhile() and skilUntil() functio ...

  9. Visual Studio 调试技巧 -- 为 Lambda 表达式设置中断

    如果我说 .NET 世界上最厉害的开发平台(语言),资深的同仁肯定不会往下看了,因为这将是一个无休止的争论,到头来搞不好还是人身攻击.然而,如果我说 Visual Studio 是世界上最友好最强大的 ...

  10. [转] Node.js 服务端实践之 GraphQL 初探

    https://medium.com/the-graphqlhub/your-first-graphql-server-3c766ab4f0a2#.n88wyan4e 0.问题来了 DT 时代,各种业 ...