热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

JavaScript数据范例原始范例与援用范例(object)详谈

JavaScript中,有七种内置范例:6种原始范例和援用范例,他们离别是:6种原始范例(基础范例):空值(null)未定义(undefined)布尔值(boolean)数字(nu

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)贮存,下图所示。
《Javascript数据范例----原始范例与援用范例(object)详谈》

由此得出以下三点结论;

  1. 基础范例的值是不可变的
  2. 基础范例的比较是它们的值的比较
  3. 基础范例的变量是存放在栈内存(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

《Javascript数据范例----原始范例与援用范例(object)详谈》

从这个例子中能够看出,援用范例的值是保留在堆内存(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(中卷) 第一章:范例


推荐阅读
  • 本文介绍了闭包的定义和运转机制,重点解释了闭包如何能够接触外部函数的作用域中的变量。通过词法作用域的查找规则,闭包可以访问外部函数的作用域。同时还提到了闭包的作用和影响。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文介绍了在wepy中运用小顺序页面受权的计划,包含了用户点击作废后的从新受权计划。 ... [详细]
  • 本文记录了在vue cli 3.x中移除console的一些采坑经验,通过使用uglifyjs-webpack-plugin插件,在vue.config.js中进行相关配置,包括设置minimizer、UglifyJsPlugin和compress等参数,最终成功移除了console。同时,还包括了一些可能出现的报错情况和解决方法。 ... [详细]
  • 本文介绍了H5游戏性能优化和调试技巧,包括从问题表象出发进行优化、排除外部问题导致的卡顿、帧率设定、减少drawcall的方法、UI优化和图集渲染等八个理念。对于游戏程序员来说,解决游戏性能问题是一个关键的任务,本文提供了一些有用的参考价值。摘要长度为183字。 ... [详细]
  • 本文详细解析了JavaScript中相称性推断的知识点,包括严厉相称和宽松相称的区别,以及范例转换的规则。针对不同类型的范例值,如差别范例值、统一类的原始范例值和统一类的复合范例值,都给出了具体的比较方法。对于宽松相称的情况,也解释了原始范例值和对象之间的比较规则。通过本文的学习,读者可以更好地理解JavaScript中相称性推断的概念和应用。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • 使用eclipse创建一个Java项目的步骤
    本文介绍了使用eclipse创建一个Java项目的步骤,包括启动eclipse、选择New Project命令、在对话框中输入项目名称等。同时还介绍了Java Settings对话框中的一些选项,以及如何修改Java程序的输出目录。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 不同优化算法的比较分析及实验验证
    本文介绍了神经网络优化中常用的优化方法,包括学习率调整和梯度估计修正,并通过实验验证了不同优化算法的效果。实验结果表明,Adam算法在综合考虑学习率调整和梯度估计修正方面表现较好。该研究对于优化神经网络的训练过程具有指导意义。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
author-avatar
手机用户2502914287
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有