javascript的变量类型真的很要人纠结,即使你是很有经验的js工程师,你也很难说清楚js的类型和分类。
最近在讲javascript入门指南的时候,有人提出数组为什么不是基本类型,我通过演示typeof []
的结果来说明,数组是对象类型派生出来的,而不是六种基本类型。
其实要理解javascript的变量类型很简单,就是我们要找到一个划分的标准。
javascript变量类型分类
在很多书中都提到了javascript的变量类型,每本书都有不同的划分标准,如果按照typeof和instanceof的返回值来区分,可以把javascript的变量类型分为两套类型系统:基本类型和对象类型衍生出来的对象类型系统。
基本类型包括:undefined,number,boolean,string,object,function,他们之前通过typeof的返回值来区分。
第二套对象类型系统是由第一套系统衍生发展而来的,例如前面提到的Array,还有Null,Number,Boolean等等,对象类型可以通过instanceof来判断。
那么对象类型中的Number和基本类型中的number又是什么关系呢?他们又是什么区别呢?
答案就是,他们是映射关系,即下例:
var a = new Number(123); console.log(a.valueOf()===123);//true var b = new String(123); console.log(b.valueOf()===123);//false console.log(b.valueOf()==='123');//true
obj.valueOf()返回的是该对象的原始值。
值类型和引用类型
这里再谈谈值类型和引用类型的问题,在javascript中:undefined、string、number和boolean是“值类型”,而object与function是“引用类型”。所有引用类型都可以看着Object()的子类,所以任意函数也是Object()的子类。
怎么理解值类型和引用类型呢??看下面的例子:
值类型示例
var a = 123; var b = a; a = 1; console.log(b);//123
引用类型示例
var c = [1,2,3]; var d = c; d[0] = 4; console.log(c);//[4,2,3]
值类型和引用类型解释
看见上面的示例,有些人可能就晕了,很多人一不小心就改变了引用类型的值,而自己还不清楚程序出现了什么问题!
当值类型a赋值给b时,这时候会在内存中给b分配空间,所以a和b是完全独立的两个变量。
而c和d之间,通过赋值,产生了引用关系,两者之间都指向了同一个数组,所以修改其中一个值会改变对方的值。
在实际开发中一定要记住这点,不要乱赋值,否则会犯上面的错误。例如下例,可以先把使用的site赋值出来,这样变量e是一个值类型,不会产生引用问题。
var c = {site:'js8.in'}; var d = c; var e = d.site; d.site = 'weibo.com'; console.log(e);//js8.in
arguments的值
ECMAScript中函数的参数是按值传递的,当参数为引用类型值时便按引用传递是一种错误或者不全面的说法。
对于参数为基本类型值的情况,很容易理解。但对于引用类型值的参数,却很容易让人误解为是按引用传递的。如下面的例子:
function fn(arg){ arg.site = 'js8.in'; arg = new Object(); arg.site = 'weibo.com'; } var obj = new Object(); fn(obj); console.log(obj.site)//js8.in console.log(window.arg);//undefined
示例中,如果arguments是按照引用类型传递的,那么obj.site应该为weibo.com,但是结果却是js8.in。
事实是这样的:当参数为引用类型值时的确是按引用传递的。
至于的你后面举的例子也是一个引用传递的,obj把引用传给arg,arg引用的内存空间和obj的一致,所以设置site为js8.in的时候,obj能接受到。后面你new了一个新的Object,相当于开了一个新的内存空间,然后arg引向了那块新内存,但是obj引用的内存还是原来那块,所以后面site赋值了,obj不改变。这个跟C/C++的指针有点像。至于window.arg为undefined,是因为js的作用域是词法作用域,function外的当然引用不了function内的,与值传递或者引用传递木有关系啊(来自周某欣)。
最后来一张周爱民大神的javascript类型关系图:
javascript变量类型
相关推荐
在JavaScript中,变量类型可以通过typeof运算符来检测,它会返回一个表示变量类型的字符串。例如: ```*** ***(typeof undefined); // "undefined" ***(typeof null); // "object"(在JavaScript中,null被认为是...
在深入学习和应用JavaScript编程时,理解变量类型以及变量作用域是至关重要的。JavaScript是一种动态类型的语言,意味着变量可以存储不同类型的值,并且不需要在声明时指定类型。在JavaScript中,所有的变量都存储为...
这个过程展示了JavaScript变量类型的动态性,以及为什么不应该频繁改变变量的类型。 在实际编程中,类型转换有时是不可避免的,但是理解其规则能够帮助开发者写出更健壮、更可预测的代码。频繁地改变变量类型可能会...
### JavaScript变量详解 #### 一、变量命名 在JavaScript中,变量命名有着一定的规范和推荐的最佳实践,这对于代码的可读性和维护性至关重要。 ##### 1. 命名规则 - **首字符限制**:变量名的第一个字符必须是...
javascript各种变量类型之间的转换
在JavaScript中,变量可以看作是一个装东西的盒子,可以用来存储各种类型的数据,并且这个数据是可以改变的。通过变量名,我们可以访问和操作存储在其中的数据。 ### 2.2.2 变量的定义方式 在JavaScript中,声明和...
JavaScript是弱类型语言,变量可以存储不同数据类型,包括Number、String、Boolean、Object、Function,以及特殊的数据类型Null和Undefined。基本数据类型是不可变的,而引用数据类型(如对象和函数)是可变的,它们...
#### 五、JavaScript变量类型 ##### 基本数据类型 - **数值类型**:如整数、浮点数等。 - **字符串类型**:由字符序列组成的数据类型。 - **布尔类型**:只有两个值,true和false。 ##### 复合数据类型 - **数组...
JavaScript变量,数据类型,运算符【JavaScript全栈入门教程2】
### JavaScript中的变量与数据类型 #### 一、变量的概念与作用 在JavaScript中,变量扮演着极其重要的角色,它是用于存储数据值的容器。通过变量,开发者能够在程序中引用和操作这些值,使得代码变得更加灵活和可...
JavaScript获取变量数据类型案例源码
JavaScript变量遵循特定的命名规则: 1. 变量名必须以字母、下划线(_)或美元符号($)开头。 2. 变量名可以包含字母、数字、下划线或美元符号,但不能包含空格或其他特殊字符。 3. 变量名是区分大小写的,`y`和`Y`...
### JavaScript变量类型转换 #### 基础数据类型 - **整型**:如`123`。 - **浮点型**:如`123.3`。 - **布尔型**:`true`或`false`。 - **字符串**:如`"abc"`。 - **NaN**:表示“不是一个数字”,可以用`isNaN()...
1.区分大小写 ...2.弱类型变量 全部的变量都用var关键字标示,JavaScript解释器会自动分配 3.句子的尾部分号是可选的 如:var name=23; or var name=23都可以 <script language=’javascript’
本文实例讲述了JavaScript变量基本使用方法。分享给大家供大家参考,具体如下: JavaScript 是一种弱类型语言,javascript的变量类型由它的值来决定。 定义变量需要用关键字 ‘var’ var iNum = 123; var sTr = '...
在进行JavaScript变量类型检测时,通常推荐使用`constructor`方法,因为它可以提供更精确的结果。但在某些特定情况下,当构造函数被修改或不可靠时,可以考虑使用`typeof`作为辅助方法,或者使用其他更高级的类型...
JavaScript对象变量图是一种表示JavaScript程序中变量和它们之间关系的图形化工具,它有助于开发者理解对象、变量、函数以及它们如何相互作用。在JavaScript中,一切都是对象,包括基本类型(如字符串、数字、布尔值...