JavaScript中的原始值和复杂值


Posted in Javascript onJanuary 07, 2016

 前面的话

javascript的数据类型可以分为两种:原始类型和引用类型。原始类型也称为基本类型或简单类型,javascript基本数据类型包括Undefined、Null、Boolean、Number和String五种,而引用类型也称为复杂类型,在Javascript中是Object。与此相对应,它们的值也分别被称为原始值和复杂值

特性

原始值(primitive value)

简单的说:原始值是固定而简单的值,是存放在栈(stack)中的简单数据段,也就是说,它们的值直接存储在变量访问的位置.

原始值是表示Javascript中可用的数据或信息的最底层形式或最简单形式。原始类型的值被称为原始值,是因为它们是不可细化的。也就是说,数字是数字,字符是字符,布尔值则是true或false,null和undefined就是null和undefined。这些值本身很简单,不能表示由其他值组成的值

有哪些类型是原始类型呢?

原始类型(primitive type)有以下五种类型:Undefined,Null,Boolean,Number,String

我们可以使用typeof来判断一个是否在某个类型的范围内.

typeof运算符

对变量或值使用typeof运算符将会返回下列值之一:

JavaScript中的原始值和复杂值

注意:

1.返回值为字符串类型.

2.和原始类型比,还差了个null,这个比较特殊,使用typeof(null),返回的是"object",我们将null理解成是object的占位符.

复杂值

复杂值可以由很多不同类型的javascript对象组成。复杂对象其在内存中的大小是未知的,因为复杂对象可以包含任何值,而不是一个特定的已知值

存储方式

栈存储

因为原始值占据空间固定,是简单的数据段,为了便于提升变量查询速度,将其存储在栈(stack)中

堆存储

由于复杂值的大小会改变,所以不能将其存放在栈中,否则会降低变量查询速度,因此其存储在堆(heap)中,存储在变量处的值是一个指针,指向存储对象的内存处

JavaScript中的原始值和复杂值

访问方式

按值访问

原始值是作为不可细化的值进行存储和操作的,引用它们会转移其值

var myString = 'foo';
var myStringCopy = myString;
var myString = null;
console.log(myString,myStringCopy);//null,'foo'

引用访问

复杂值是通过引用进行存储和操作的,而不是实际的值。创建一个包含复杂对象的变量时,其值是内存中的一个引用地址。引用一个复杂对象时,使用它的名称(即变量或对象属性)通过内存中的引用地址获取该对象值

var myObject = {};
var copyOfMyObject = myObject;//没有复制值,而是复制了引用
myObject.foo = 'bar';//操作myObject中的值
//现在如果输出myObject和copyOfMyObject,则都会输出foo属性,因为它们引用的是同一个对象
console.log(myObject,copyOfMyObject);//Object{foo="bar"}

比较方式

原始值采用值比较,而复杂值采用引用比较。复杂值只有在引用相同的对象(即有相同的地址)时才相等。即使是包含相同对象的两个变量也彼此不相等,因为它们并不指向同一个对象

var price1 = 10;
var price2 = 10;
var price3 = new Number('10');
var price4 = price3;
console.log(price1 == price2);//true
console.log(price1 == price3);//false
price4 = 10;
console.log(price4 == price3);//true
console.log(price4 === price3);//false 
var objectFoo = {same:'same'};
var objectBar = {same:'same'};
console.log(objectFoo == objectBar);//false
var objectA = {foo: 'bar'};
var objectB = objectA;
console.log(objectA == objectB);//true

动态属性

对于复杂值,可以为其添加属性和方法,也可以改变和删除其属性和方法;但简单值不可以添加属性和方法

复杂值支持动态对象属性,因为我们可以定义对象,然后创建引用,再更新对象,并且所有指向该对象的变量都会获得更新。一个新变量指向现有的复杂对象,并没有复制该对象。这就是复杂值有时被称为引用值的原因。复杂值可以根据需求有任意多个引用,即使对象改变,它们也总是指向同一个对象

var str = 'test';
str.property = true;
console.log(str.property);//undefined  
var objA = {property: 'value'};
var pointer1 = objA;
var pointer2 = pointer1;
objA.property = null;
console.log(objA.property,pointer1.property,pointer2.property);//null null null

包装类型

原始值被当作构造函数创建的一个对象来使用时,Javascript会将其转换成一个对象,以便可以使用对象的特性和方法,而后抛弃对象性质,并将它变回到原始值

Javascript 相关文章推荐
javascript下4个跨浏览器必备的函数
Mar 07 Javascript
2010年最佳jQuery插件整理
Dec 06 Javascript
javascript 在firebug调试时用console.log的方法
May 10 Javascript
js读取被点击次数的简单实例(从数据库中读取)
Mar 07 Javascript
原生js实现淘宝首页点击按钮缓慢回到顶部效果
Apr 06 Javascript
JS获取图片lowsrc属性的方法
Apr 01 Javascript
js+html5实现canvas绘制圆形图案的方法
Jun 05 Javascript
谈谈基于iframe、FormData、FileReader三种无刷新上传文件的方法
Dec 03 Javascript
在JavaScript中call()与apply()区别
Jan 22 Javascript
js 中文汉字转Unicode、Unicode转中文汉字、ASCII转换Unicode、Unicode转换ASCII、中文转换
Dec 06 Javascript
Bootstrap table学习笔记(2) 前后端分页模糊查询
May 18 Javascript
解决layui表格的表头不滚动的问题
Sep 04 Javascript
理解JS事件循环
Jan 07 #Javascript
angularjs创建弹出框实现拖动效果
Aug 25 #Javascript
JavaScript中定义类的方式详解
Jan 07 #Javascript
javascript类型系统 Window对象学习笔记
Jan 07 #Javascript
直接拿来用的页面跳转进度条JS实现
Jan 06 #Javascript
基于jQuery实现鼠标点击导航菜单水波动画效果附源码下载
Jan 06 #Javascript
JavaScript动态创建div等元素实例讲解
Jan 06 #Javascript
You might like
PHP FOR MYSQL 代码生成助手(根据Mysql里的字段自动生成类文件的)
2011/07/23 PHP
php实现文件下载功能的几个代码分享
2014/05/10 PHP
PHP base64编码后解码乱码的解决办法
2014/06/19 PHP
destoon调用自定义模板及样式的公告栏
2014/06/21 PHP
php中的常用魔术方法汇总
2016/02/14 PHP
php文件缓存方法总结
2016/03/16 PHP
javascript parseInt 函数分析(转)
2009/03/21 Javascript
不使用中间变量,交换int型的 a, b两个变量的值。
2010/10/29 Javascript
js带按钮的提示框可供选择示例代码
2013/09/17 Javascript
javascript模拟枚举的简单实例
2014/03/06 Javascript
JavaScript使用Replace进行字符串替换的方法
2015/04/14 Javascript
javascript实现通过表格绘制颜色填充矩形的方法
2015/04/21 Javascript
js实现键盘Enter键提交表单的方法
2015/05/27 Javascript
JavaScript地理位置信息API
2016/06/11 Javascript
JavaScript继承定义与用法实践分析
2018/05/28 Javascript
Nuxt v-bind绑定img src不显示的解决
2019/12/05 Javascript
bootstrap-closable-tab可实现关闭的tab标签页插件
2020/08/09 Javascript
JS算法教程之字符串去重与字符串反转
2020/12/15 Javascript
[01:09]2014DOTA2国际邀请赛 TI4西雅图DOTA2 中国美女coser加油助威
2014/07/20 DOTA
[01:09:23]KG vs TNC 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/16 DOTA
在Python的Flask框架中使用日期和时间的教程
2015/04/21 Python
谈谈Python进行验证码识别的一些想法
2016/01/25 Python
Python+Django搭建自己的blog网站
2018/03/13 Python
PyQt5基本控件使用之消息弹出、用户输入、文件对话框的使用方法
2019/08/06 Python
在macOS上搭建python环境的实现方法
2019/08/13 Python
Python使用贪婪算法解决问题
2019/10/22 Python
python 申请内存空间,用于创建多维数组的实例
2019/12/02 Python
python模拟预测一下新型冠状病毒肺炎的数据
2020/02/01 Python
python梯度下降算法的实现
2020/02/24 Python
html5使用Drag事件编辑器拖拽上传图片的示例代码
2017/08/22 HTML / CSS
Hibernate持久层技术
2013/12/16 面试题
大二自我鉴定
2014/01/31 职场文书
英文推荐信格式范文
2014/05/09 职场文书
学校领导班子对照检查材料
2014/08/28 职场文书
2014年高中班主任工作总结
2014/11/08 职场文书
2015年个人剖析材料范文
2014/12/29 职场文书