前言

JavaScript中的变量为松散类型,所谓松散类型就是指当一个变量被申明出来就可以保存任意类型的值,就是不像SQL一样申明某个键值为int就只能保存整型数值,申明varchar只能保存字符串。一个变量所保存值的类型也可以改变,这在JavaScript中是完全有效的,只是不推荐。相比较于将变量理解为“盒子“,《JavaScript编程精解》中提到应该将变量理解为“触手”,它不保存值,而是抓取值。这一点在当变量保存引用类型值时更加明显。

JavaScript中变量可能包含两种不同的数据类型的值:基本类型引用类型。基本类型是指简单的数据段,而引用类型指那些可能包含多个值的对象。本文主要介绍基本数据类型及其特点。

基本类型包括:NullUndefinedNumberStringBoolean。引用类型主要包括:ObjectArrayDateRegExpFunction

接下来主要介绍五种基本类型。引用类型本菜希望在以后的博文中与大家交流。

申明

JavaScript中申明变量通过var操作符,申明的变量会成为其所在作用域内的局部变量,意思就是在全局申明的变量就是通常所说的全局变量,在函数内申明的变量就是以该函数为作用域的局部变量,局部变量会在函数执行完毕后被销毁,未通过var操作符申明的变量会默认为全局变量。需要一次申明多个变量时可以通过单var操作符的方式,代码会更加简洁。

var name = 'susan',
age = '23',
sex = 'female';

typeof操作符

在介绍基本类型值之前,先说下typeof操作符,typeof操作符会返回数据类型的字符串表示。用它来检测基本数据类型比较有效率,而检测引用类型时通常用instanceof操作符。

typeof undefined; //undefined
typeof ; //number
typeof false; //boolean
typeof null; //object
typeof 'abc'; //string
typeof {a:}; //object

这里有一点不同的是,typeof在对null进行检测时会返回字符串“object”,因为在JavaScript中null被当作空对象指针,这一点在Douglas的《JavaScript语言精粹》也被吐槽过,不过了解下就可以了。

Undefined类型

Undefined类型只有一个特殊值即undefiend。所有未初始化的变量均会保存该值。

var aa;
alert(aa); //undefined

这里要注意一点,undefined与未定义的变量不同,如果在代码中调用某个未定义(申明)的变量,解析器会提示如下信息。

意为这个变量没有被申明过,查找的方式是通过沿作用域链向上搜索,如果在全局环境中都没有找到该变量的申明则抛出错误,这部分内容本菜以后和大家讨论。

Null类型

Null类型同样也只包含一个值即null,从逻辑上看它被当作空对象指针,正是由于这个特性,如果你定义某个变量时不确定当前赋何值,但未来需要赋某个object类型值时,正确的方式就是将该变量初始化为null。

这里提一句,在对null与undefined进行==比较时,会返回true,据《JavaScript高级程序设计》说,undefined派生自null,所以ECMA-262规定它俩相等性操作为true。

Boolean类型

Boolean俗称布尔,仅包括两个值:true和false。这里有一个Boolean()转型函数,它可以对任意类型的值使用,作用就是将其它类型值转换为布尔型。转换规则主要如下。

String型:非空字符串-true,空字符串("")-false

Number型:任何非0数-true,0与NaN-false

Object型:任何对象-true,null-false

Undefined型:false

但并非使用该转型函数才会使数据类型转换,当遇到if语句时会对数据进行自动的类型转换。自动类型转换有其优点也有弊端,这里不再扩展。重要的是通过Boolean转型函数理解转换规则,以便在编码中使用。

这里举个非常简单的例子:在某个app中需要通过检测本地是否缓存了用户ID来判断需不需要登录操作。

if (!localStorage['memberId']) {
//登陆操作
}

这里当本地没有用户ID时,localStorage值为undefined,转换后为false值,非运算后为true,执行登录操作。而不需要写成localStorage['memberId'] === undefined等等。

Number类型

JavaScript中的Number类型支持十进制、八进制以及十六进制的数值。关于浮点型的数值这里有几点要注意,在JavaScript中,0.1与.1相同,但是这种省略的写法是不推荐的。由于保存浮点型所需的内存是整型的两倍,所以JavaScript会在适当的时候将不必要的浮点型转换为整型,比如浮点型的10.0会自动保存为整型的10。特别需要注意的一点是,浮点型运算精度远不如整型,例子如下:

console.log(0.1 + 0.2);

可以看到,运算并没有得到预期的结果,所以在实际运算中要注意这一点,同时这个例子也反映出了JavaScript中浮点型的最高精度即为显示的17位小数。过大或过小的数可以使用科学计数法e来表示,这一点就不再赘述。

Infinity

JavaScript能够保存的数值并不是无限大小的,当大于或小于某个界限时,该值会被自动转换为特殊值——Infinity,Infinity也包括正负两种。检测一个数值是否为Infinity可以通过isFinite()函数。

NaN

在Number类型中还有个很特殊的值,那就是NaN,即非数值(Not a Number)。这个特殊值的存在是为了避免在某些需要返回数值时因为运算问题未返回数值报错,影响程序运行。比如一个数除以0,在其他编程语言中会抛出错误,而在JavaScript中会返回NaN。

NaN有两个特点:1.任何涉及NaN的操作均会返回NaN,2.NaN不与任何值相等,包括他自己=.=,即做NaN == NaN的相等性验证时会返回false。

检测一个值是否为NaN可以用isNaN()函数,它会尝试将接收的参数转换为数值,意思就是字符串“10”可以被转换成数值10,而字符串“color”不行。转换成功返回false,反之为true。

数值转换

Number类型的数值转换方式可能通过三个函数:Number()parseInt()parseFloat()。由于Number()转换函数转换规则奇葩(复杂且不合理),所以这里主要介绍parseInt()与parseFloat()。

首先申明一点,parseInt()与parseFloat()函数是专门用于把字符串转换成数字的。这一点可能会导致困惑,明明是用来转换数值的,为什么要接收字符串。举个简单的例子,parseInt()在接收3.14这个浮点型数值时,会自动转换成该值的字符串表示——“3.14”,它会把3.14转换为3从逻辑上来看并不是它真的能对数值取整,而是在解析“3.14”这个字符串时遇到小数点“.”这个不能转换为数值的字符时会自动省略后面的东西。

有了以上的认识,我们来了解这两个函数具体的转换规则:

parseInt()函数在转换字符串时,会忽略前面的空格,直到找到第一个非空字符。如果第一个非空字符不是数字字符或者负号则返回NaN。如果第一个字符是数值字符会继续解析第二个,直到解析完整个字符串或者遇到了一个非数值字符(如上面3.14的例子)。

parseInt(""); //NaN
parseInt(3.14); //
parseInt("4.12"); //
parseInt("xyx123"); //NaN
parseInt("123xyx"); //

parseInt()同样可以解析二进制、八进制与十六进制的数值,由于ECMAScript版本不同对非十进制数解析时会出现分歧,所以最好传入第二个参数作为基数。

parseInt(100111,2); //
parseInt(123,8); //
parseInt("0xBC",16); //

与parseInt()函数类似,parseFloat()也是从第一个字符开始解析,直到字符串末尾或者遇到一个无效的浮点数字字符为止。比如,第一个小数点是有效的,第二个是无效的,因此后面的字符会被忽略。与parseInt()不同的是它始终会忽略开头的0,且不具备传入基数的能力,即只能解析十进制数值。

parseFloat("123xyx"); //
parseFloat("xyx123"); //NaN
parseFloat("012.3"); //12.3
parseFloat("34.5"); //34.5
parseFloat("34.5.6"); //34.5

String类型

在JavaScript中字符串使用单、双引号没有区别,只是要注意起始与结束保持一致即可。JavaScript中也有转义字符,与其他语言基本一致,这里就不再赘述了。任何字符串都可以通过length属性来获取其长度。

var str = 'Hello World';
alert(str.length); //

这里简要说一个特点,ECMAScript中字符串一旦创建了就不能被改变,例如拼接某两个字符串,首先是创建一个新的字符串,将原有的字符串组合后装入其中,最后销毁原来的两个字符串。所以并不是像看上去那样进行简单的拼接。

字符串转换

要将一个值转换为字符串类型有两个方式:1.toString()方法,2.String()转型函数。这两个方法的区别就是null,undefined值没有toString()方法,而任何类型值都可以使用String()函数。

var num = 123;
num.toString(); //"123"
var boo = false;
boo.toString(); //"false"

多数情况下,调用toString()方法不必传递参数。当要确定输出数值的不同进制时,可以传入一个基数。

var num = 10;
num.toString(); //"10"
num.toString(2); //"1010"
num.toString(8); //"12"
num.toString(10); //"10"
num.toString(16); //"a"

在不知道要转换的值是不是null或undefined时,可以使用String()方法。其规则为:如果该值有toString()方法则调用该方法,如果是null或undefined则返回其字符串表示.....好吧,总之用String()转型函数就不会错。

String(10); //"10"
String(true); //"true"
String(null); //"null"
String(undefined); //"undefined"

感谢您的浏览,希望能有所帮助。

JavaScript——变量与基本数据类型的更多相关文章

  1. 初识javascript变量和基本数据类型

    1.1首先,学习使用firebug控制台.设置一下firefox 中的配置选项,以便使控制台中的javascript警告更为严格...以方便我们更好的找出程序中不必要的bug. 1. 在火狐浏览器fi ...

  2. JavaScript变量和数据类型

    变量 变量就是一个元素,类似于数学中的概念,用来指定表示一个对象.在JavaScript中,用来指定变量的关键字为var.当声明新变量时,可以使用关键词 "new" 来声明其类型 ...

  3. JavaScript变量与数据类型详解

    变量 变量来源于数学,是计算机语言中能储存计算结果或能表示值抽象概念.变量可以通过变量名访问. 变量的作用就是用于存储值. 语法: 声明变量时,总是以关键字var打头.任何情况下都应该这样做.然后给变 ...

  4. JavaScript 基础(一) - JavaScript的引入方式,JavaScript 变量命名规则,JS 的五种基本数据类型,ECMAScript 算数运算符,逻辑运算符

    JavaScript的引入方式 直接编写 <!DOCTYPE html> <html lang="en"> <head> <meta ch ...

  5. JavaScript中变量声明以及数据类型

    JavaScript变量 变量名必须以字母或下划线("_")开头 变量也能以 $ 和 _ 符号开头(不过我们不推荐这么做) 变量名称对大小写敏感(y 和 Y 是不同的变量) 变量可 ...

  6. javaScript的注释、变量和基本数据类型

    上一级写了javaScript是用来操作文档对象元素的,这一次带大家看看javaScriput的注释.变量和基本数据类型. 1.注释:注释是什么呢?注释其实就是阻止浏览器解析某一行或者多行代码或描述的 ...

  7. javascript变量的作用域

    javascript变量的作用域 基本类型和引用类型 基本类型值指的是简单的数据段,而引用类型值指的是那个可能由多个值组成的对象  讲一个值赋值给变量时,javascript解析器首先要确定是基本类型 ...

  8. JavaScript 变量

    一,JavaScript 变量(存储信息的容器) 与代数一样,JavaScript 变量可用于存放值(比如 x=2)和表达式(比如 z=x+y). 变量可以使用短名称(比如 x 和 y),也可以使用描 ...

  9. JavaScript 变量作用域

    一. 变量声明 变量用var关键字来声明,如下所示: 变量在未声明的情况下被初始化,会被添加到全局环境. JavaScript执行代码时,会创建一个上下文执行环境,全局环境是最外围的环境.每个函数在被 ...

随机推荐

  1. TreeSet的自然排序(自定义对象 compareTo方法)

    >要实现自然排序,对象集合必须实现Comparable接口,并重写compareTo()方法 >一般需求中描述的是"主要条件",如:按姓名长度排序.  需注意次要条件 ...

  2. 10-19文献阅读之DCB

    ---恢复内容开始--- <一种精确估计区域北斗接收机硬件延迟的方法>-2016-,很有价值 估计北斗接收机硬件延迟,不需要传统复杂的电离层模型.已知一个参考站接收机硬件延迟的条件下,利用 ...

  3. 阿里八八Alapa事后诸葛亮

    设想和目标 1.我们的软件要解决什么问题?是否定义的很清楚?是否对典型用户和典型场景有清晰的描述? 我们的项目希望解决用户对于时间.日程管理上不够方便.直观.易丢失的问题,因为并不是新颖高端的概念,因 ...

  4. 用 Visual Studio Code 调试运行在 homestead 环境中的 laravel 程序

    由于之前做 .net 开发比较熟悉 visualstudio,所以自 visualstudio code 发布后就一直在不同场合使用 vscode ,比如前端.node等等.最近在做 laravel ...

  5. 操作系统的三个接口 shell gui api

    操作系统的三个接口 shell gui api 编程语言是用来告诉操作系统干什么的语言. 编程语言是人机交互语言. 程序.进程:任务集.

  6. 20155314 2016-2017-2 《Java程序设计》实验四 Android程序设计

    20155314 2016-2017-2 <Java程序设计>实验四 Android程序设计 实验任务 基于Android Studio开发简单的Android应用并部署测试 了解Andr ...

  7. 理解Flux架构

    本文摘自<Flux架构入门教程>和<谈一谈我对 React Flux 架构的理解>.也有自己的观点和总结.转载请注明出处. 一.Flux架构描述 1. Flux是什么 Flux ...

  8. leetcode 141. Linked List Cycle 、 142. Linked List Cycle II

    判断链表有环,环的入口结点,环的长度 1.判断有环: 快慢指针,一个移动一次,一个移动两次 2.环的入口结点: 相遇的结点不一定是入口节点,所以y表示入口节点到相遇节点的距离 n是环的个数 w + n ...

  9. 关于SpringApplication包无法导入报错问题

    问题描述:一直再报红线,包始终无法导入,参考过好几个博友分享的解决方案,依然没有效果,对了补充一点SprinBoot版本为2.0.3. 问题解决:目前通过更换版本得到解决1.5.6或者1.5.8都可以 ...

  10. HihoCoder - 1336 二维数状数组(单点更新 区间查询)

    You are given an N × N matrix. At the beginning every element is 0. Write a program supporting 2 ope ...