阅读(1085) (10)

JavaScript学习笔记整理(2):类型、值和变量

2017-06-19 11:57:45 更新

1、数据类型

JavaScript语言的每一个值,都属于某一种数据类型。 JavaScript共有六种数据类型:

数值(number):整数和小数 字符串(string):字符组成的文本 布尔值(boolean):true和false两个特定值。 undefined:表示未定义或不存在。 null:表示空缺,即此处应该有一个值,但此时为空。 对象(object):各种值组成的集合。

通常,我们将数值、字符串、布尔值称为原始类型(primitive type),即它们是最基本的数据类型,无法再细分了。而将对象称为合成类型(complex type)的值,因为一个对象往往是多个原始类型的值的合成,可以看作是一个存放各种值的容器。至于undefined和null,一般将它们看成两个特殊值。
JavaScript中除了数字、字符串、布尔值、null和undefined之外就是对象了。 对象(object)是属性(property)的集合,每个属性都由“名/值对”构成。

2、typeof运算符

在JavaScript中,我们可以用typeof运算符来确定一个值到底是什么类型。

(1)原始类型
数值、字符串、布尔值分别返回number、string、boolean。

typeof 12  // "number"

typeof '12'  // "string"

typeof false //"boolean"

(2)函数 函数返回function。

function a(){}

typeof a   // "function"

(3)undefined undefined返回undefined。

typeof undefined   // "undefined"

可用typeof检测一个变量是否声明。

if(typeof a === "undefined" ){

}

(4)其他 除此以外,其他情况都返回object

typeof window  // "object"

typeof {}  // "object"

typeof []  // "object"

typeof null // "object"

3、数值

JavaScript不区分整数值和浮点数值。JavaScript中的所有数字均用浮点数值表示。 JavaScript采用IEEE 754标准定义的64位浮点格式表示数字。
数值范围
-9007199254740992 ~ 9007199254740992 (-2的53次方 ~ 2的53次方)。当数值超过了此范围的整数,则无法保证低位数字的精度。 JavaScript中实际的操作则是基于32位整数。 使用字面量(literal)时,JavaScript对整数提供四种进制的表示方法:十进制、十六进制、八进制、2进制。

十进制:没有前导0的数值。 八进制:有前缀0o或0O的数值,或者有前导0、且只用到0-7的七个阿拉伯数字的数值。 十六进制:有前缀0x或0X的数值。 二进制:有前缀0b或0B的数值。

在十六进制中,0~9之间的数字和a(A)~f(F)之间的字母构成,a~f的字母对应的表示数字10~15 在浮点数中,我们还可以用指数记数法来表示,即在实数后跟字母e或E,后面再跟正负号,其后再加一个整型的指数。这种记数方法表示的数值,是由前面的实数乘以10的指数次幂。

12e3   /// 12*10*10*10=12000

在两种情况下,JavaScript会自动将数值转为科学计数法表示: (1)小数点前的数字多于21位

1234567890123456789012 // 1.2345678901234568e+21

(2)小数点后的零多于5个

// 小数点后紧跟5个以上的零, // 就自动转为科学计数法 0.0000003 // 3e-7

特殊数值
正零和负零
在JavaScript内部,实际上存在2个0:一个是+0,一个是-0。它们是等价的。

-0 === +0 //true


Infinity
当JavaScript在算术运算时发生溢出(overflow)、下溢(underflow)或被零整除时不会报错。

当数字运算结果超过了JavaScript所能表示的数字上限(溢出),结果为一个特殊的无穷大(Infinity)值。同样,当负数的值超过了JavaScript所能表示的负数范围,结果为负无穷大(-Infinity)。

Infinity大于一切数值(除了NaN),-Infinity小于一切数值(除了NaN)。

isFinite函数返回一个布尔值,检查某个值是不是正常数值,而不是Infinity。

注意:0除以0是无意义的,会返回NaN。
NaN
NaN用来表示非数字值。

NaN不等于任何值,包括它本身。

NaN === NaN  //false

isNaN方法可以用来判断一个值是否为NaN。

isNaN(NaN)  //true

isNaN(12)  //false

注意:isNaN只对数值有效,如果传入其他值,会被先转成数值。比如,传入字符串的时候,字符串会被先转成NaN,所以最后返回true,这一点要特别引起注意。也就是说,isNaN为true的值,有可能不是NaN,而是一个字符串。

isNaN('a') //true


一般来说,使用isNaN之前,最好判断一下数据类型。

typeof value === 'number' && isNaN(value)

判断NaN更可靠的方法是,利用NaN是JavaScript之中唯一不等于自身的值这个特点,进行判断。

value !== value

4、字符串

字符串就是零个或多个排在一起的字符,放在单引号或双引号之中。

'a'

"a"

单引号字符串的内部,可以使用双引号。双引号字符串的内部,可以使用单引号。
如果要在单引号字符串的内部,使用单引号(或者在双引号字符串的内部,使用双引号),就必须在内部的单引号(或者双引号)前面加上反斜杠,用来转义。

'a 'b' '

字符串默认只能写在一行中。如果要拆分成数行,每行必须以反斜杠()结束。

var a = " Hello

world

! ";

推荐在HTML中使用双引号,在JavaScript中使用单引号。

在JavaScript中,我们可以用加号(+)来连接字符串。

var a = 'Hello' + 'world';

字符串可以被视为字符数组,因此可以使用数组的方括号运算符,用来返回某个位置的字符(位置编号从0开始)。

var a = 'hello';

a[0]  // "h"

a[1]  // "e"

length属性返回字符串的长度,该属性也是无法改变的。

如果方括号中的数字超过字符串的长度,或者方括号中根本不是数字,则返回undefined。

注意:字符串与数组仅仅是相似而已。字符串是无法改变字符串之中的单个字符。

var a = 'hello';

delete s[0];

s // "hello"


s[0] = 'a';

s  // "hello"

转义

反斜杠()在字符串内有特殊含义,用来表示一些特殊字符,所以又称为转义符。 需要用反斜杠转义的特殊字符,主要有下面这些:

null(u0000) b 后退键(u0008) f 换页符(u000C) n 换行符(u000A) r 回车键(u000D) t 制表符(u0009) v 垂直制表符(u000B) ' 单引号(u0027) " 双引号(u0022) 反斜杠(u005C)

5、null和undefined

null是JavaScript语言的关键字,常用来描述“空值”。 对null执行typeof运算,结果会返回“object”,也就是说,可以将null认为是一个特殊的对象值。 undefined undefined表示“未定义”

注意:尽管null和undefined是不同的,但它们都表示“值的空缺”,两者往往可以互换。当用相等运算符“==”来比较两者时,会返回true。(要使用严格相等运算符“===”来区分它们)

6、布尔值

布尔值表示真或假。这个类型只有两个值,保留字true 和false。 下列运算符会返回布尔值:

两元逻辑运算符: && (And),|| (Or) 前置逻辑运算符: ! (Not) 相等运算符:===,!==,==,!= 比较运算符:>,>=,<,<=

布尔值常用于JavaScript总的控制结构中。例如,JavaScript中的if..else语句,如果布尔值为true执行第一段逻辑,如果为false执行另一段逻辑。 如果JavaScript预期某个位置应该是布尔值,会将该位置上现有的值自动转为布尔值。转换规则是除了下面六个值被转为false,其他值都视为true。

undefined null false 0 NaN ""或''(空字符串)

7、变量声明

在JavaScript程序总,使用一个变量之前应当先声明。 变量是使用关键字var来声明的。 变量的声明和赋值,是分开的两个步骤,上面的代码将它们合在了一起,实际的步骤是下面这样。

var a; a=1;

JavaScirpt是一种动态类型语言,也就是说,变量的类型没有限制,可以赋予各种类型的值。 如果只是声明变量而没有赋值,则该变量的值是undefined。undefined是一个JavaScript关键字,表示“无定义”。 如果一个变量没有声明就直接使用,JavaScript会报错,告诉你变量未定义。
重复的声明

如果使用var重新声明一个已经存在的变量,是无效的。

var a=1; var a; a //1

但是,如果第二次声明的同时还赋值了,则会覆盖掉前面的值。

var x=1; var x=2; x //2

声明提前(变量提升)
JavaScript引擎的工作方式是,先解析代码,获取所有被声明的变量,然后再一行一行地运行。这造成的结果,就是所有的变量的声明语句,都会被提升到代码的头部,这就是声明提前(变量提升,hoisting)。

var scope='global'; function f(){ console.log(scope); //输出‘undefined’,而不是‘global’ var scope='local'; //变量在这里赋初始值,但变量本身在函数体内任何地方均是有定义的。 console.log(scope); //输出‘local’ }

上面的代码实质是这样执行的:

var scope='global'; 

function f(){ 

    var scope;  //变量会提前到函数头部执行

    console.log(scope); //输出‘undefined’,而不是‘global’ 

    scope='local'; //上面已经声明,这里只是赋值

    console.log(scope); //输出‘local’ 

}


注意:变量提升只对var命令声明的变量有效,如果一个变量不是用var命令声明的,就不会发生变量提升。

变量作用域
全局变量:不在任何函数体内声明的变量。全局变量拥有全局作用域,在JavaScript代码中的任何地方都是有定义的。
局部变量:在函数内声明的变量,只在函数体内有定义。

在函数体内,局部变量的优先级高于同名的全局变量。也就是说,如果函数内声明的一个局部变量或者函数参数中带有的变量和全局变量重名,那么全局变量就被局部变量所覆盖。


注意:在函数中使用var关键字进行显式申明的变量是做为局部变量,而没有用var关键字,使用直接赋值方式声明的是全局变量。