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 ...
随机推荐
- db2 alter table 语法
DB2 alter:add/delete/reset column 1.添加字段 alter table [table_name] add [column_name] [column_type] ...
- Memo打印
加入Printers单元, ; Left ; y ;; do begin Printer.Canvas.TextOut(x,y,Memo1.Lines[i]) ...
- 【BZOJ1833】【ZJOI2010】数字计数 数位DP
链接: #include <stdio.h> int main() { puts("转载请注明出处[辗转山河弋流歌 by 空灰冰魂]谢谢"); puts("网 ...
- 【边做项目边学Android】小白会遇到的问题--This Android SDK requires Android Developer Toolkit version 23.0.0 or above
问题描写叙述: 上一篇讲到解决Appcompat_V7问题要减少adt版本号,于是就换旧版本号22.3.0啊,又一次打开Eclipse.立刻弹出: This Android SDK requires ...
- Thread和Runnable差别
继承Thread类的,我们相当于拿出三件事即三个卖票10张的任务分别分给三个窗体,他们各做各的事各卖各的票各完毕各的任务.由于MyThread继承Thread类.所以在new MyThread的时候在 ...
- iOS-#ifdef DEBUG代码块介绍
iOS-#ifdef DEBUG宏定义介绍 一.#ifdef DEBUG代码块 #ifdef DEBUG // Debug 模式的代码... #else // Release 模式的代码... #en ...
- android反编译经验谈
反编译这事,找对了工具其实非常简单. 反编译工具下载地址http://pan.baidu.com/s/1eQvshwu android的反编译要经过两个步骤: 1.把dex文件转为jar 2.jar转 ...
- Java基础知识强化之集合框架笔记28:ArrayList集合练习之去除ArrayList集合中的重复字符串元素(升级)
1. 需求:ArrayList去除集合中字符串的重复值(字符串的内容相同) 要求:不能创建新的集合,就在以前的集合上做. 2. 代码示例之 去除集合中重复元素,不创建新的集合: package ...
- PRD产品需求文档概要
PRD概念 PRM就是Product Requirements Document的简称,也就是产品需求模型.一般来说一个产品会伴随有市场需求文档(Market Requirements Documen ...
- HTML5移动开发中的input输入框类型
HTML5规范引入了许多新的input输入框类型 在HTML5移动开发中,通过这些新的输入框类型来显示定制后的键盘布局,用户体验更好,更容易填写各种表单 本文中,实测手机为肾4S与米4 数字类型num ...