【JavaScript 从零开始】 原始值和对象引用、类型转换
JavaScript 中的原始值(undefined、null 、 布尔值、数值和字符串)于对象(包括数组和函数)有着根本区别。
原始值是不可更改的:任何方法都无法改变(或“突变”)一个原始值。
对于数字和布尔值来说显然如此-----改变数字的值本身就说不通,而对字符串来说就不那么明显了,
因为字符串看起来是有字符组成的数组,我们期望可以通过指定索引来修改字符串中的字符。
实际上,JavaScript是禁止这样做的。
字符串中所有的方法看上去返回了一个修改后的字符串,实际上返回的是一个新的字符串值。
例如:
var s = "hello"; //定义一个有小写字母组成的文本
s.toUpperCase(); //返回“HELLO”,但并没有改变s的值
s //=>"hello": 原来字符串的值并未改变
比较
原始值得比较是值得比较:只有在它们的值相等时它们才相等。
如果比较两个单独的字符串,当且仅当它们的长度相等且每个索引的字符都相等时,JavaScript才认为它们相等。
对象和原始值不同。首先,它们是可变的 -----它们的值是可修改的:
var o ={x:1}; //定义一个对象
o.x=2; //通过修改对象属性值来修改对象
o.y=3; //再次修改这个对象,给它增加一个新属性 var a = [1,2,3]; //数组也可修改的
a[0]=0; //修改数组的一个元素
a[3]=4; //给数组增加一个新元素
对象的比较并非值得比较:即使两个对象包含同样的属性及相同的值,它们也不是相等的。
各个索引元素完全相等的数组也不相等。
var o = {x:1}, p = {x: 1}; //具有相同属性的两个对象
o===p; //=>false : 两个单独的对象永不相等
var a= [] , b = []; //两个单独的空数组
a===b; //=>false : 两个单独的数组永不相等
注:a==b 也是false
我们通常将对象称为引用类型(reference type),以此来和JavaScript的基本类型区分开来。
依照术语的叫法,对象都是引用(reference),对象的比较均是引用的比较:当且仅当它们引用同一个基对象时,它们才相等。
var a = []; //定义一个引用空数组的变量a
var b= a; //变量b引用同一个数组
b[0]=1; //通过变量b 来修改引用的数组
a[0] //=> 1 : 变量a 也回修改
a===b //=> true : a和b引用同一个数组,因此相等
a==b //=> true : a和b引用同一个数组,因此相等
就像你刚刚看到的如上代码,将对象或数组复制给一个变量,激进是复制的引用值:对象本身并有复制一次。
如果你想得带一个对象或数组的副本,则必须显示复制对象的每一个属性或数组的每个元素。
下面这个例子通过循环完成数组的复制(深拷贝数组):
var a = ['a','b','c']; //待复制的数组
var b= []; //复制到的目标空数组
for (var i = 0; i<a.length ; i++) // 遍历a[]中的每个元素
{
b[i]=a[i] //强元素之复制到b中
}
下面是一个, 深拷贝一个方法(深拷贝对象)
function cloneObject(obj) {
var clone = {};
for(var i in obj) {
if(typeof(obj[i])=="object" && obj[i] != null)
clone[i] = cloneObject(obj[i]);
else
clone[i] = obj[i];
}
return clone;
}
//此方法用到了 递归,不清楚的请自行百度一下
//深拷贝的另外两种方法 //使用原型
function object(o) {
function F() {}
F.prototype = o;
return new F();
} var newObject = object(oldObject); //通过JSON
var newObject = JSON.parse(JSON.stringify(oldObject));
类型转换
JavaScript 中的取值类型非常灵活,我们已经从布尔值看到了这一点:
当JavaScript 期望使用一个布尔值的时候,你可以提供任意类型值,JavaScript 将根据需要自行转换类型。
一些值(真值)转换为 true,其他值(假值)转换为 false.
在其他类型中同样适用:
如果JavaScript 期望使用一个字符串,它吧给定的值将转换为字符串。
如果JavaScript 期望使用一个数字,他就把给定的值将转换为数字。(如果转换结果无意义,将返回NaN)
一些例子:
10 + " object" ; //=>"10 object": 数字10将成字符串
"7" * "4" ; //=>28 : 两个字符串均转换为数字
var n= 1- "x" ; //=>NaN : 字符串“x”无法转换为数字
n+" object" //=>“NaN object ” : NaN转换为字符串“NaN”
下表 简要说明了JavaScript 中如何进行类型转换的。
转换和相等性
由于JavaScript可以灵活的类型转换,因此其“==” 相等运算符也随相等的含义灵活多变。
例如 ,如下这些比较结果均是 true:
null == undefined //这两个值被认为相等
"0" == 0 //比较前字符串转换成数字
0 == false //比较前布尔值转换成数字
"0" == false //比较前字符串和布尔值都转换成数字
“==” 等于运算符在判断两个值是否相等时做了类型转换(之后会详解)
“===” 恒等运算符在判断两个值是否相等时并未做任何类型转换。
1、对于string,number等基础类型(原始值),==和===是有区别的 1)不同类型间比较,==之比较“转化成同一类型后的值”看“值”是否相等,===如果类型不同,其结果就是不等 2)同类型比较,直接进行“值”比较,两者结果一样 2、对于Array,Object等高级类型(对象引用),==和===是没有区别的 进行“指针地址”比较 3、基础类型(原始值)与高级类型(对象引用),==和===是有区别的 1)对于==,将高级转化为基础类型,进行“值”比较 2)因为类型不同,===结果为false
【JavaScript 从零开始】 原始值和对象引用、类型转换的更多相关文章
- 什么是JavaScript的原始值?
JavaScript的原始值是指数字.字符串.布尔值.null和undefined. JavaScript的数据类型分为两类:原始类型(primitive type)和对象类型(object type ...
- javascript原始值和对象引用
一句话来说:原始值是不可变的,而对象引用是可变的. js中的原始值(undefined.null.布尔值.数字和字符串)与对象(包括数组和函数)有着本质的区别.原始值是不可更改的,任何方法都无法更改一 ...
- JavaScript检测原始值、引用值、属性
上周写过一篇读书笔记<编写可维护的JavaScript>之编程实践,其中 第8章 避免『空比较』是博主在工作中遇坑较多的雷区,所以特此把该章节重新整理分享,希望大家不再坑队友(>﹏& ...
- 11 JavaScript Number原始值&对象&科学记数法&范围&进制转换&溢出Infinity&NaN
JavaScript Number对象 是经过封装的能处理数字值的对象 由Number()构造器创建 只有一种数字类型 可以使用也可以不使用小数点书写数字 JavaScript原始值与对象: 在Jav ...
- (复杂值vs原始值)&&内存空间 — 准确我们的JavaScript世界观(一):
写在前面 最近在读<JavaScript启示录>,这本书不是JavaScript的详尽的参考指南,但是把对象作为了解JavaScript的透镜,受益匪浅. 那么我们先来聊一下JavaScr ...
- 第三章:Javascript类型、值和变量。
计算机程序的运行需要对值(value)比如数字3.14或者文本"hello world"进行操作,在编程语言中,能够表示并操作的值的类型叫做数据类型(type),编程语言最基本的特 ...
- 复杂值vs原始值&&内存空间
写在前面 最近在读<JavaScript启示录>,这本书不是JavaScript的详尽的参考指南,但是把对象作为了解JavaScript的透镜,受益匪浅. 那么我们先来聊一下JavaScr ...
- JavaScript不可变原始值和可变的对象引用
一.JavaScript不可变原始值 JavaScript中的原始值(undefined,null,布尔值,数字和字符串)与对象(包括了数组和函数)有着根本的区别.原始值是不可变的(undefined ...
- 深入剖析JavaScript中的对象与原始值之间的转换机制
我们都知道原始值之间是可以互相转换的,但是如果对象转原始值呢? 所有的对象在布尔上下文(context)中均为 true .所以对于对象,不存在 to-boolean 转换, 只有字符串和数值转换. ...
随机推荐
- ASP.NET Core 装X利器SignalR:电子画板
电子画板开发需求 教师端需求: 教师登录后能创建房间(教室) 学生加入房间后有通知提醒 教师能够解散房间 基本的画板功能 学生端需求: 能够切换不同在线的房间 能够收到新建房间的通知 能够收到房间 ...
- leetcode 123. 买卖股票的最佳时机 III JAVA
题目: 给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格. 设计一个算法来计算你所能获取的最大利润.你最多可以完成 两笔 交易. 注意: 你不能同时参与多笔交易(你必须在再次购买前出 ...
- docker registry 私有仓库 安装配置、查询、删除
#++++++++++++++++++++++++++++++ #docker-registry 私有仓库 #搜索,下载register镜像 docker search registry docker ...
- 极验(Geetest) Laravel 5 集成开发包,让验证更安全
简述 在网站开发中使用频率最高的工具之一便是验证码,验证码在此也是多种多样,不过简单的图片验证码已经可以被机器识别,极验验证码提供了一个安全可靠的滑动验证码体系,让网站开发更加安全. 先感受一下这种验 ...
- 访问www.baidu.com后会发生什么(一次完整的网络通讯过程)
1.在浏览器中输入www.baidu.com 这意味着浏览器要向百度发送一个网页数据包,要发送数据包,需要知道对方的IP地址,这里我们只知道网址为www.baidu.com,却不知道IP地址,此时应用 ...
- 【NOIP2017】逛公园 最短路+DP
诶,去年场上不会处理$0$的环,只拿了$60$有点可惜. 我们先不管边边权为$0$的边. 我们先跑一次最短路,令$dis[u]$表示从$1$至$u$的最短路的长度. 那么根据题目的要求,从起点走到$u ...
- Oracle 数据库维护管理之--数据库基本信息表管理与优化参考1
1.查看当前系统中的会话(如果权限不足,请使用sys或者system用户登录): select * from v$session t; 2.查看此会话下正在执行的sql语句:select sql_te ...
- 剑指offer三十九之平衡二叉树
一.题目 输入一棵二叉树,判断该二叉树是否是平衡二叉树. 二.思路 详解代码. 三.代码 public class Solution { //判断根节点左右子树的深度,高度差超过1,则不平衡 ...
- 剑指offer二十五之复杂链表的复制
一.题目 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head.(注意,输出结果中请不要返回参数中的节点引用,否 ...
- C++的开源跨平台日志库glog学习研究(二)--宏的使用
上一篇从整个工程上简单分析了glog,请看C++的开源跨平台日志库glog学习研究(一),这一篇对glog的实现代码入手,比如在其源码中以宏的使用最为广泛,接下来就先对各种宏的使用做一简单分析. 1. ...