JavaScript变量相关问题
本文重在探讨JavaScript变量包含的两种不同数据类型的值——基本类型值和引用类型值的区别。在此外稍微带过ECMAScript和JavaScript的关系。
题为JavaScript变量,但更具体的说应该是ECMAScript变量。
二十世纪九十年代,Netscape公司和微软公司推出了两个不同版本的JavaScript,不利于JavaScript的开发和使用,促使欧洲计算机制造商协会(ECMA,European Computer Manufacturers Association)着手处理JavaScript的标准化问题,从而完成了著名的 ECMA-262——定义了一种名为ECMAScript的新脚本语言的标准。
一个完整的JavaScript实现包括ECMAScript,文档对象模型(DOM,Document Object Model),以及浏览器对象模型(BOM,Browser Object Model)。ECMAScript作为JavaScript的核心以及实现的基础,是ECMA-262标准规定的在语法、类型、语句、关键字、保留字、操作符和对象这几个方面内容的语言的描述。
ECMA-262标准规定的ECMAScript变量是松散类型的,可以用来保存任何类型的数据,所以不同类型初始化变量的操作可以放在一条语句中执行,如下列代码是合法的。
var message = "hello", //string
age = 20, //number
found = false; //boolean
用 var 操作符定义的变量将成为定义该变量的作用域中的局部变量,退出该作用域后变量会被立即销毁。例如在函数内定义一个变量,当函数被调用的时候,该变量即被创建,但在函数退出后,该变量将无法再被继续访问。
ECMAScript中有6种数据类型(也只有6中,ECMAScript不支持任何创建自定义类型的机制)。
其中基本数据类型包括5种——underfined、null、boolean、number、string,这5种基本数据类型按值访问,其值属于文章开头提到的基本类型值,是简单的数据段,可以操作保存在变量中的实际的值。
第6种为复杂数据类型——object,本质上是由一组无序的名-值对组成的,属于引用类型值,是保存在内存中的对象。JavaScript不允许直接操作对象的内存空间,在操作对象时实际是在操作对象的引用而不是实际的对象。
虽然定义变量时不需要规定其为何种数据类型,但基本类型和引用类型的值可以执行的操作还是大相径庭。
属性的添加
对于引用类型的值,可以为其属性和方法进行添加、改变和删除,如下列代码:
var obj = new object(); //创建对象并保存在obj中
obj.name = "Marry"; //添加名为name的属性,赋予字符串值“Marry”
alert(obj.name); //弹出"Marry"
如果obj对象不被销毁或者name属性不被删除,这个属性将一直存在。
再看基本类型值:
var name = "Marry"; //创建字符串
name.age = 20; //添加名为age的属性,赋予number值20
alert(name.age); //弹出"underfined"
name字符串被添加了一个age属性,为其赋值20,但下次访问时这个属性就不见了。
这说明只能给引用类型值动态地添加属性。
复制变量值
从变量a向变量b复制基本类型的值,会在变量b对象上创建一个新值,将该值复制到给变量a分配的位置上,独立保存。这两个变量参与的任何操作都不会互相影响。
若从变量c向变量d复制引用类型的值,同样会将存储在变量d对象中的值复制一份放到为变量c分配的空间中,但这个值的副本实际是一个指针,与变量d指向堆内存中的同一个对象。两个变量实际引用同一个对象,改变其中一个变量,将影响另一个变量。
具体区别见如下例子:
//基本类型值
var num1 = 5;
var num2 = num1;
num2 = num2 + 5;
alert(num1); //
alert(num2); // //引用类型值
var obj1 = new object();
var obj2 = obj1;
obj1.name = "Marry";
alert(obj2.name); //"Marry"
函数传参
ECMAScript中所有函数的参数都是按值传递的,即将函数外部的值复制给函数内部的参数。鉴于基本类型值与引用类型值复制变量的不同,其函数传参的效果也不同。
在向参数传递基本类型值时,被传递的参数被赋给一个局部变量,函数内部参数的变化不影响函数外部的变量;向参数传递引用类型值时,会把这个值在内存中的地址复制给一个局部变量,因此这个局部变量的变化将会反映在函数的外部。如下列例子:
//传递基本类型值
function addnum(num) {
num += 10;
return num;
}
var num1 = 5;
var num2 = addnum(num1);
alert(num1); //5,无变化
alert(num2); // //传递引用类型值
function setage(obj) {
obj.age = 20;
}
var obj1 = new object();
setage(obj1)
alert(obj1.age); //
在局部作用域中修改的对象反映在全局作用域中,很多人会以为这是按引用传递。但函数对象确实都是按值传递,见下列例子:
function setage(obj) {
obj.age = 20;
obj = new object();
obj.age = 30;
}
var obj1 = new object();
setage(obj1)
alert(obj1.age); //
此例中在函数内部为obj重新定义了一个对象,且为其age属性重新赋值,但这一变化并未反映在函数外部,说明obj1 并不是按引用传递的。实际函数内重新定义的对象为局部对象,在退出函数后就会被立即销毁。
检测类型
基本类型值可以通过typeof检测,但typeof检测引用类型时只能返回object。所以为了知道某个值是什么类型的对象,ECMAScript提供了instanceof操作符,语法如下:
result = variable instanceof constructor
如果变量是引用类型的实例,instanceof操作符就会返回true。
第一篇技术文,原本想放些实例,但想了想还是想还是从基础的东西开始记录。
时间也有些晚了,脑子不是很清楚((⊙o⊙)…),有错误和补充之处请多多指教(抱拳)
JavaScript变量相关问题的更多相关文章
- 六天玩转javascript:javascript变量与表达式(1)
说明 本系列属于进阶系列,语常用语法等不在本系列介绍范围之内. 在我刚开始做一个程序员并开发项目的时候,我总是喜欢使用开发语言的各种特性,每次m$发布新版C#的时候我总是会把开发者预览版下好,亲自体验 ...
- 深入浅出 JavaScript 变量、作用域和内存 v 0.5
本文主要从原理入手分享变量和作用域的相关知识,最后结合本文所分享知识,再次深入了解下闭包的运行原理. 主要参考<JS高级程序设计> <JS权威指南> <高性能 JS> ...
- JavaScript变量作用域(Variable Scope)和闭包(closure)的基础知识
在这篇文章中,我会试图讲解JavaScript变量的作用域和声明提升,以及许多隐隐藏的陷阱.为了确保我们不会碰到不可预见的问题,我们必须真正理解这些概念. 基本定义 作用范围是个“木桶”,里面装着变量 ...
- JavaScript变量: 变量命名原则
变量的命名相对而言没有太多的技术含量,今天整理有关于变量命名相关的原则,主要是想告诉大家,虽然命名没有技术含量,但对于个人编码,或者说一个团队的再次开发及阅读是相当有用的.良好的书写规范可以让你的Ja ...
- 浅谈JavaScript变量声明提升
前段时间阿里实习生内推,一面就被刷了,也是郁闷.今天系统给发通知,大致意思就是内推环节不足以了解彼此,还可以参加笔试,于是赶紧再投一次.官网流程显示笔试时间3月31日,时间快到了,开始刷题.网上搜了一 ...
- js课程 1-3 Javascript变量类型详解
js课程 1-3 Javascript变量类型详解 一.总结 一句话总结:js对象点(属性方法),json对象冒号(属性方法).属性和方法区别只有一个括号. 1.json对象中的函数的使用? 函数名 ...
- javascript变量的作用域
javascript变量的作用域 基本类型和引用类型 基本类型值指的是简单的数据段,而引用类型值指的是那个可能由多个值组成的对象 讲一个值赋值给变量时,javascript解析器首先要确定是基本类型 ...
- JavaScript 变量声明提前
<JavaScript权威指南>中指出:JavaScript变量在声明之前已经可用,JavaScript的这个特性被非正式的称为声明提前(hoisting),即JavaScript函数中声 ...
- JavaScript 变量
一,JavaScript 变量(存储信息的容器) 与代数一样,JavaScript 变量可用于存放值(比如 x=2)和表达式(比如 z=x+y). 变量可以使用短名称(比如 x 和 y),也可以使用描 ...
随机推荐
- Linux配置JDK
在etc/profile文件下添加 export JAVA_HOME=/root/Desktop/jdk1.7.0_79 export CLASSPATH=/root/Desktop/jdk1.7.0 ...
- 关注云端搜索技术:elasticsearch,nutch,hadoop,nosql,mongodb,hbase,cassandra 及Hadoop优化
http://www.searchtech.pro/ Hadoop添加或调整的参数: 一.hadoop-env.sh1.hadoop的heapsize的设置,默认1000 # The maximum ...
- ajax跨域问题及解决
overview ajax是一种创建交互式网页应用的网页开发技术,是一种用于创建快速动态网页的技术,通过在后台与服务器进行少量数据交换.而ajax的跨域问题则是请求了其他项目的接口地址,当协议.子域名 ...
- Host文件修改后无效的解决办法
什么是hosts文件? 简单的说,hosts文件是用于本地dns服务(相关主题:什么是DNS缓存,如何清除DNS缓存?)的,采用ip 域名的格式写在一个文本文件当中,Hosts是一个没有扩展名的系统文 ...
- React组件开发(二)表达式
var obj = { name:"xiaoming", age:"18" } var Hello= React.createClass({ render:fu ...
- 3713: [PA2014]Iloczyn
3713: [PA2014]Iloczyn Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 327 Solved: 181[Submit][Status ...
- 多线程爬坑之路-ThreadLocal源码及原理的深入分析
ThreadLocal<T>类:以空间换时间提供一种多线程更快捷访问变量的方式.这种方式不存在竞争,所以也不存在并发的安全性问题. This class provides thread-l ...
- AVFoundation之如何从摄像头获取图像
前言: 最近项目有个需求是对试图对手机密码进行强破解的人进行拍照(通过摄像头截图),因为之前没做过,所以一堆坑.现在就把我的经验都分享出来,希望后来人不用再踏上坑途中. 直接上代码: // 创建会话 ...
- java基础之基础语法详录(一)
[前言] java的语法先从基础语法学,Java语言是由类和对象组成的,其对象和类又是由方法和变量组成,而方法,又包含了语句和表达式. 对象:(几乎)一切都是对象,比如:一只熊猫,他的外观,颜色,他在 ...
- iOS性能之WebP
当今互联网,无论网页还是APP,流量占用最大的,多数都是因为图片,越是良好的用户体验,对图片的依赖度越高.但是图片是一把双刃剑,带来了用户体验,吸引了用户注意,却影响了性能,因为网络请求时间会相对比较 ...