资讯专栏INFORMATION COLUMN

JavaScript数据类型----原始类型与引用类型(object)详谈

tomlingtm / 1307人阅读

摘要:做个小小的延伸在这个栗子中,两个对象都有一条相同的值,但这两个对象却不相等,为什么呢因为两个对象分别引用的是存放在堆内存中的个不同的对象,故变量和的值引用地址也是不一样的。

JavaScript中,有七种内置类型:6种原始类型和引用类型,他们分别是:

6种原始类型(基本类型):

空值(null)

未定义(undefined)

布尔值(boolean)

数字(number)

字符串(string)

符号(symbol,ES6中新增)

引用类型:

对象(object)

类型判断

我们可以用typeof运算符来查看类型的值:

typeof(undefined)        //"undefined"
typeof("123")            //"string"
typeof(123)              //"number"
typeof(true)             //"boolean"
typeof Symbol()          //"symbol"
typeof({name:"oops"})    //"object"
typeof([1,2,3])          //"object"

我们注意到,null值并不在列,为什么呢?这里比较特殊:

typeof(null)              //"object" ,  这是js中的一个bug

我们应该使用正确的方法来判断null值的类型:

var a = null;
(!a && typeof a ==="object")  //true

现在让我们来看另一个问题:什么是undefined?
答案是:变量在未持有值时,变量的类型为undefined。
为什么我会在这里会多带带提出这个问题?因为很多开发人员把undefined等同于undeclared(未声明),这是一个观念性的错误。已在作用域中声明的变量但未赋值的,称为undefined;相反,还未在作用域中声明的变量,称为undeclared(未声明)。
举个栗子:

var a;
a;   //undefined
c;   //Uncaught ReferenceError: c is not defined

是不是忽然明白了这两者的差别,BUT!!,请看这个栗子:

var a;
typeof a;     //"undefined"
typeof b;     //"undefined"  

奇怪,变量b未在作用域中声明,为什么不报错且typeof的值怎么还是undefined?那是因为typeof的一种特殊的安全机制。利用这点,当我们用if条件语句判断某个变量是否有值时,可以用这种方法。举个栗子:

//变量a未声明,以下方式会报错
if(a){
  ...
}

//变量a未声明,以下方式就是安全的
if( typeof a !== "undefined"){
   ...
}

so ,通过typeof检查undeclared变量是个不错的方法。

基本类型(原始类型)

js中有六种基本类型,他们是:UndefinedNullBooleanNumberStringSymbol (new in ES 6),基本类型的储存方式为栈内存(Stack)储存,下图所示。

由此得出以下三点结论;

基本类型的值是不可变的

基本类型的比较是它们的值的比较

基本类型的变量是存放在栈内存(Stack)里的

举个栗子:

var a = "oops";
b = a;
b;               //"oops"
a = "哈哈";
a;               //"哈哈"
b;               //"oops" ,a值的改变不会影响b的值
引用类型

我们先来一个栗子看看引用类型是如何在计算机内存储的:

var a ={};
var b;
a.name = "oops";
a.age = 24;
b = a;
console.log( b.age );      //24
a.name = "hz";
b.age = 18;
console.log( a.age )       //18

从这个例子中可以看出,引用类型的值是保存在堆内存(Heap)中的对象,栈内存保存变量的指针,堆内存中保存具体的对象。

做个小小的延伸:

var a ={name:"hz"};
var b ={name:"hz"};

console.log( a == b );     //false
console.log( a === b );    //false

在这个栗子中,a,b两个对象都有一条相同的值,但这两个对象却不相等,为什么呢?因为
a ,b 两个对象分别引用的是存放在堆内存中的2个不同的对象,故变量 a和 b的值(引用地址)也是不一样的。

以上。
有错误的地方希望大家指出来,共同探讨。

参考资料:
【文章】 JavaScript 深入了解基本类型和引用类型的值
【书籍】 你不知道的javascript(中卷) 第一章:类型

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

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

相关文章

  • JavaScript-如何实现克隆(clone)函数

    摘要:前提知识在实现克隆函数之前你需要明白以下一些概念如果你已经明白了请直接阅读实现部分什么是值类型引用类型很多新手可能会对值类型引用类型原始类型基本类型等等名称感到困惑这里就解释一下这些概念一个事物是可以有多种区分形式的比如猫我们可以说它是猫科 前提知识 在实现克隆函数之前,你需要明白以下一些概念,如果你已经明白了,请直接阅读 实现 部分. 什么是值类型、引用类型? 很多新手可能会对 值类...

    JasonZhang 评论0 收藏0
  • 基础回顾-javascript数据类型

    摘要:栈区由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。属性返回对创建此对象的构造函数的引用。所有的和都是宿主对象参考高级程序设计堆和栈的概念和区别全面解析中的数据类型与类型转换 数据类型 数据类型划分 javascript中定义了6中基本数据类型(原始值类型),和一种复杂数据类型(引用类型),所谓复杂类型,其本质是由无序的名值对(key:val...

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

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

    aikin 评论0 收藏0
  • JavaScript面向对象精要》读书笔记

    摘要:解除引用的最佳手段是将对象变量设置为。字面形式允许你在不需要使用操作符和构造函数显示创建对象的情况下生成引用值。函数就是值可以像使用对象一样使用函数因为函数本来就是对象,构造函数更加容易说明。 JavaScript(ES5)的面向对象精要 标签: JavaScript 面向对象 读书笔记 2016年1月16日-17日两天看完了《JavaScript面向对象精要》(参加异步社区的活动送...

    GitCafe 评论0 收藏0
  • JavaScript中的数据类型

    摘要:八进制字面值的第一位必须是,然后是八进制数字序列。十六进制字面量的前两位必须是,后跟任何十六进制数字以及。而自动创建的基本包装类型的对象,则只存在于一行代码的执行瞬间,然后立即销毁。 前言 ECMAScript 迄今为止标准定义了 7 种数据类型:6 种原始类型-- String、Number、 Boolean、 Undefined、Null 和 Symbol;1 种引用类型-- O...

    szysky 评论0 收藏0

发表评论

0条评论

tomlingtm

|高级讲师

TA的文章

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