JavaScript不可变原始值和可变的对象引用
一、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不可变原始值和可变的对象引用的更多相关文章
- js 不可变的原始值和可变的对象引用
javascript中的原始值(undefined.null.布尔值.数字和字符串)与对象(包括数组和函数)有着根本区别.原始值是不可更改的:任何方法都无法更改(或“突变”)一个原始值.对数字和布尔值 ...
- javascript中的原始值和复杂值
× 目录 [1]特性 [2]存储方式 [3]访问方式 [4]比较方式 [5]动态属性 前面的话 javascript的数据类型可以分为两种:原始类型和引用类型.原始类型也称为基本类型或简单类型,jav ...
- 【JavaScript 从零开始】 原始值和对象引用、类型转换
JavaScript 中的原始值(undefined.null . 布尔值.数值和字符串)于对象(包括数组和函数)有着根本区别. 原始值是不可更改的:任何方法都无法改变(或“突变”)一个原始值. 对于 ...
- 论javascript中的原始值和对象
javascript将数据类型分为两类:原始值(undefined.null.布尔值.数字和字符串),对象(对象.函数和数组) 论点:原始值不可以改变,对象可以改变:对象为引用类型: '原始值不可以改 ...
- JavaScript数据操作--原始值和引用值的操作本质
我的一句话总结:原始值不管是变量赋值还是函数传递都不会改变原值,引用值不管是变量赋值还是函数传递,如果新变量重新赋值,则不会影响原引用值,如新变量是直接操作,就会影响原引用值. 首先明确,值和类型是两 ...
- JavaScript检测原始值、引用值、属性
上周写过一篇读书笔记<编写可维护的JavaScript>之编程实践,其中 第8章 避免『空比较』是博主在工作中遇坑较多的雷区,所以特此把该章节重新整理分享,希望大家不再坑队友(>﹏& ...
- JavaScript中对象转换为原始值的规则
JavaScript中对象转换为原始值遵循哪些原则? P52 对象到布尔值对象到布尔值的转换非常简单:所有的对象(包括数字和函数)都转换为true.对于包装对象亦是如此:new Boolean(fal ...
- javascript中可变值与不可变值(原始值)
字符串原始值修改不了1 var str = "abc"; 2 str[0] = "d"; 3 console.log(str[1]="f") ...
- (复杂值vs原始值)&&内存空间 — 准确我们的JavaScript世界观(一):
写在前面 最近在读<JavaScript启示录>,这本书不是JavaScript的详尽的参考指南,但是把对象作为了解JavaScript的透镜,受益匪浅. 那么我们先来聊一下JavaScr ...
随机推荐
- Django中的Model(表结构)
Model(表设计) 在这里只提经常用到的三种联表结构: 一对多:models.ForeignKey(其他表) 多对多:models.ManyToManyField(其他表) 一对一:models.O ...
- Google邮箱:Gmail国际顶级邮箱
本博文的主要内容有 .Google邮箱的介绍 1.Google邮箱的介绍 https://zh.wikipedia.org/wiki/Gmail http://mail/google.com/ h ...
- thinkphp框架dump友好调试输出函数
/** * 浏览器友好的变量输出 * @param mixed $var 变量 * @param boolean $echo 是否输出 默认为True 如果为false 则返回输出字符串 * @par ...
- java工具类--数据库操作封装类
java对数据库操作简单处理,如下代码即可,封装了 增删改查及获取连接.关闭连接. 代码如下: package com.test; import java.sql.Connection; import ...
- vs2012关闭IDE硬件加速设置
对于我这样的老古董电脑是很有必要的设置! 如图所示:
- POJ 3414 Pots【bfs模拟倒水问题】
链接: http://poj.org/problem?id=3414 http://acm.hust.edu.cn/vjudge/contest/view.action?cid=22009#probl ...
- delphi TColorDialog
TColorDialog 预览 实现过程 动态创建和使用颜色对话框 function ShowColorDlg:TColor;begin with TColorDialog.Cre ...
- [RxJS] Filtering operators: skipWhile and skipUntil
After takeUntil() and takeWhile() function, let's have a look on skipWhile() and skilUntil() functio ...
- Visual Studio 调试技巧 -- 为 Lambda 表达式设置中断
如果我说 .NET 世界上最厉害的开发平台(语言),资深的同仁肯定不会往下看了,因为这将是一个无休止的争论,到头来搞不好还是人身攻击.然而,如果我说 Visual Studio 是世界上最友好最强大的 ...
- [转] Node.js 服务端实践之 GraphQL 初探
https://medium.com/the-graphqlhub/your-first-graphql-server-3c766ab4f0a2#.n88wyan4e 0.问题来了 DT 时代,各种业 ...