资讯专栏INFORMATION COLUMN

深入了解JavaScript对象(1)--原始类型和引用类型

mindwind / 806人阅读

摘要:原始类型和引用类型原始类型存储简单数据值,引用类型存储对象,其本质是指向内存位置的应用。保存指向内存中实际对象所在位置的指针鉴别引用类型操作符以一个对象和一个构造函数为参数。这些特殊引用类型的存在使得原始引用类型用起来和对象一样方便。

原始类型和引用类型

1.原始类型存储简单数据值,引用类型存储对象,其本质是指向内存位置的应用。

注:其他编程语言用栈存储原始类型,用堆存储引用类型。JavaScript原始值被保存在变量对象内,而引用值则作为一个指针保存在变量对象内,该指针指向实际对象在内存中的存储位置。

2.原始类型:boolean,number,string,null,undefined。原始类型的变量直接保存原始值(而不是一个指向对象的指针),也就是说,当你将原始值赋值给一个变量时,该值被复制到变量中,每一个变量都有它自己的一份数据拷贝。

var name = "张三";
var age = 18;
var show = true;
var object = null;
var flag = undefined;

// 一个变量的改变并不会影响到其他变量
var color1 = "red";
var color2 = color1;
console.log(color1);    // red
console.log(color2);    // red
color2 = "blue";
console.log(color1);    // red
console.log(color2);    // blue

3.引用类型:引用类型不在变量中保存对象,所以例子中的object变量实际上并不包含对象的实例,而是一个指向内存中实际对象所在位置的指针(或者说是引用)。这就意味着,当你将一个对象赋值给变量时,实际上赋值给这个变量的是一个指针。也就是说,这两个变量指向内存中的同一个对象。

var object = new Object(); //保存指向内存中实际对象所在位置的指针

4.鉴别引用类型

instanceof操作符以一个对象和一个构造函数为参数。如果对象是构造函数所指定的类型的一个实例,instanceof返回true;否则返回false。intanceof操作符可鉴别继承类型,意味着所有的引用类型都继承Object。

var items = [];
var object = {};
function reflect(value){
    return value;
}
console.log(items instanceof Array);    // true
console.log(object instanceof Object);    // true
console.log(reflect instanceof Function);    // true

5.鉴别数组
当JavaScript的值在同一个页面不同框架之间传来传去,再用instanceof来鉴别引用类型的时候,就可能出现问题,因为每一个框架都有它自己的全局上下文--Object、Array以及其他内建类型的版本。所以,当你把数组从一个框架传到另一个框架时,instanceof就无法识别,因为该数组是来自不同框架的Array的实例。所以这个时候,得用Array.isArray()方法来鉴别数组,该方法只兼容IE9及以上。

6.原始封装类型
原始封装类型共有3种,(String,Number和Boolean)。这些特殊引用类型的存在使得原始引用类型用起来和对象一样方便。例如:

var name = "张三";
var firstChar = name.charAt(0);
console.log(firstChar);    // 张

// 背后发生的事情
var name = "张三";
var temp = new String(name);
var firstChar = temp.charAt(0);
temp = null;
console.log(firstChar);    // 张

var name = "张三";
name.last = "王五";
console.log(name.last);    // undefined

// 背后发生的事情
var name = "张三";
var temp = new String(name);
temp.last = "王五";
temp = null;

var temp = new String(name);
console.log(temp.last);    // undefined
temp = null;

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/83589.html

相关文章

  • JavaScript 深入了解基本类型引用类型的值

    摘要:原文链接一个变量可以存放两种类型的值,基本类型的值和引用类型的值。引入了一种新的原始数据类型,表示独一无二的值。 原文链接 一个变量可以存放两种类型的值,基本类型的值(primitive values)和引用类型的值(reference values)。 ES6 引入了一种新的原始数据类型 Symbol,表示独一无二的值。它是 JavaScript 语言的第七种数据类型,前六种是:Un...

    Mr_houzi 评论0 收藏0
  • 深入js隐式类型转换

    摘要:结合实际中的情况来看,有意或无意中涉及到隐式类型转换的情况还是很多的。此外当进行某些操作时,变量可以进行类型转换,我们主动进行的就是显式类型转换,另一种就是隐式类型转换了。 前言 相信刚开始了解js的时候,都会遇到 2 ==2,但 1+2 == 1+2为false的情况。这时候应该会是一脸懵逼的状态,不得不感慨js弱类型的灵活让人发指,隐式类型转换就是这么猝不及防。结合实际中的情况来看...

    tomato 评论0 收藏0
  • JavaScript 是如何工作的:JavaScript 的共享传递按值传递

    摘要:它对数组和对象使用按值传递,但这是在的共享传参或拷贝的引用中使用的按值传参。例如在这里,变量和值在执行期间存储在堆栈中。返回值这是可选的,函数可以返回值,也可以不返回值。变量被推入堆栈,从而在执行时成为的副本。 这是专门探索 JavaScript 及其所构建的组件的系列文章的第 22 篇。 想阅读更多优质文章请猛戳GitHub博客,一年百来篇优质文章等着你! 如果你错过了前面的章节,可...

    keithyau 评论0 收藏0
  • JavaScript 是如何工作的:JavaScript 的共享传递按值传递

    摘要:它对数组和对象使用按值传递,但这是在的共享传参或拷贝的引用中使用的按值传参。例如在这里,变量和值在执行期间存储在堆栈中。返回值这是可选的,函数可以返回值,也可以不返回值。变量被推入堆栈,从而在执行时成为的副本。 这是专门探索 JavaScript 及其所构建的组件的系列文章的第 22 篇。 想阅读更多优质文章请猛戳GitHub博客,一年百来篇优质文章等着你! 如果你错过了前面的章节,可...

    陈伟 评论0 收藏0
  • 【基础系列】javascript数据类型原始类型

    摘要:返回布尔值,表示参数字符串是否在原字符串的头部。布尔值中布尔值有两个和和都表示值的空缺,但事从背后更深远的角度考虑,他们的还是有差别的。首先我们来看一下类型转化表任意的值都可以转换为布尔值,只有会被转换为,其他所有值都会被转换成。 开辟了一个关于javascript的基础系列,更加深入、细致的了解这门语言。今天分享的是js的数据类型。 javascript的数据类型可以分为两类:原始类...

    aikin 评论0 收藏0

发表评论

0条评论

mindwind

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<