JavaScript

JavaScript 数据类型和变量

2019-03-07  本文已影响11人  Rising_life

JavaScript 数据类型

字符串、数字、数组、布尔、对象、Null、Undefined

Number (数字)

JavaScript不区分整数和浮点数,统一用Number表示。

合法的Number类型

123;    // 整数123

0.456;    // 浮点数0.456

1.2345e3;    // 科学计数法表示1.2345x1000,等同于1234.5

-99;    // 负数

NaN;    // NaN表示Not a Number,当无法计算结果时用NaN表示

Infinity;    // Infinity表示无限大,当数值超过了JavaScript的Number所能表示的最大值时,就表示为Infinity

Number可以直接做四则运算,规则和数学一致:

1 + 2; // 3

( 1 + 2 ) * 5 / 2; // 7.5

2 / 0; // Infinity

0 / 0; // NaN

10 % 3; // 1

10.5 % 3; // 1.5

注意 % 是求余运算。


String (字符串)

字符串是以单引号 ( ' ) 或双引号 ( " ) 括起来的任意文本,单引号或双引号只是一种表示方式,不是字符串的一部分。

转义字符  \

输出 单引号 或 双引号 可以用转义字符 \ 来标识

转义字符 \ 可以转义很多字符,比如 \n 表示换行,\t 表示制表符,字符 \ 本身也要转义,所以 \\ 表示的字符就是 \。

ASCII字符

ASCII字符可以以 \x## 形式的十六进制表示,例如:

'\x41';    //完全等同于'A'

还可以用 \u#### 表示一个Unicode字符:

'\u4e2d\u6587';    //完全等同于'中文'

多行字符串

由于多行字符串用 \n 写起来比较费事,所以最新的ES6标准新增了一种多行字符串的表示方法,用反引号 ` ... ` 表示:

模板字符串

多个字符串可以用 + 号连接起来

如果有很多变量需要连接,用+号就比较麻烦。ES6新增了一种模板字符串,表示方法和上面的多行字符串一样,但是它会自动替换字符串中的变量:

注意:拼接时要用反引号括起来,否则 ${... } 会以字符串的形式输出

操作字符串

获取字符串的长度:(注意:空格也是字符串的一部分)

要获取字符串某个指定位置的字符,使用类似Array的下标操作,索引号从0开始:

字符串是不可变的,如果对字符串的某个索引赋值,不会有任何错误,但是,也没有任何效果:

字符串常用方法

JavaScript为字符串提供了一些常用方法,注意,调用这些方法本身不会改变原有字符串的内容,而是返回一个新字符串:

toUpperCase

toUpperCase()把一个字符串全部变为大写:

toLowerCase

toLowerCase() 把一个字符串全部变为小写:

indexOf

indexOf()会搜索指定字符串出现的位置:

substring

substring()返回指定索引区间的子串:


Array  (数组)

数组是一组按顺序排列的集合,集合的每个值称为元素。

JavaScript的数组可以包括任意数据类型。并通过索引来访问每个元素。

数组用[]表示,元素之间用,分隔。

[ 1,3.14,'Hello',null,true,undefined ];

另一种创建数组的方法是通过Array()函数实现:

newArray(1,2,3);    // 创建了数组[1, 2, 3]

然而,出于代码的可读性考虑,强烈建议直接使用[]。

要取得Array的长度,直接访问length属性:

请注意,直接给Array的length赋一个新的值会导致Array大小的变化:

Array可以通过索引把对应的元素修改为新的值,因此,对Array的索引进行赋值会直接修改这个Array:

如果通过索引赋值时,索引超过了范围,同样会引起Array大小的变化:

大多数其他编程语言不允许直接改变数组的大小,越界访问索引会报错。然而,JavaScript的Array却不会有任何错误。在编写代码时,不建议直接修改Array的大小,访问索引时要确保索引不会越界。

indexOf

与String类似,Array也可以通过indexOf()来搜索一个指定的元素的位置:

注意:数字 30 和 字符串 '30' 是不同的元素

slice

slice()就是对应String的substring()版本,它截取Array的部分元素,然后返回一个新的Array:

注意:到slice()的起止参数包括开始索引,不包括结束索引。

如果不给slice()传递任何参数,它就会从头到尾截取所有元素。利用这一点,我们可以很容易地复制一个Array:

push 和 pop

push()向Array的末尾添加若干元素,pop()则把Array的最后一个元素删除掉:

unshift 和 shift

如果要往Array的头部添加若干元素,使用unshift()方法,shift()方法则把Array的第一个元素删掉:

sort

sort()可以对当前Array进行排序,它会直接修改当前Array的元素位置,直接调用时,按照默认顺序排序:

想要按照指定的顺序排序需要创建函数。

reverse

reverse()把整个Array的元素给反转:

splice

splice()方法是修改Array的“万能方法”,它可以从指定的索引开始删除若干元素,然后再从该位置添加若干元素:

concat

concat()方法把当前的Array和另一个Array连接起来,并返回一个新的Array:

注意:concat()方法并没有修改当前Array,而是返回了一个新的Array。

concat()方法可以接收任意个元素和Array,并且自动把Array拆开,然后全部添加到新的Array里:

join

join()方法是一个非常实用的方法,它把当前Array的每个元素都用指定的字符串连接起来,然后返回连接后的字符串:

多维数组

如果数组的某个元素又是一个Array,则可以形成多维数组

var arr = [[1,2,3], [400,500,600],'-'];

上述Array包含3个元素,其中头两个元素本身也是Array。

数组的元素可以通过索引来访问。请注意,索引的起始值为0:

var arr = [1,2,3.14,'Hello',null,true];

arr[0]; // 返回索引为0的元素,即1

arr[5]; // 返回索引为5的元素,即true

arr[6]; // 索引超出了范围,返回undefined


Boolean (布尔) 

布尔值和布尔代数的表示完全一致,一个布尔值只有true、false两种值,要么是true,要么是false,可以直接用true、false表示布尔值,也可以通过布尔运算计算出来:

true;//这是一个true值false;//这是一个false值2>1;//这是一个true值2>=3;//这是一个false值

&&运算是与运算,只有所有都为true,&&运算结果才是true:

true&&true;//这个&&语句计算结果为truetrue&&false;//这个&&语句计算结果为falsefalse&&true&&false;//这个&&语句计算结果为false

||运算是或运算,只要其中有一个为true,||运算结果就是true:

false||false;//这个||语句计算结果为falsetrue||false;//这个||语句计算结果为truefalse||true||false;//这个||语句计算结果为true

!运算是非运算,它是一个单目运算符,把true变成false,false变成true:

!true;//结果为false!false;//结果为true! (2>5);//结果为true

布尔值经常用在条件判断中,比如:

varage =15;if(age >=18) {    alert('adult');}else{    alert('teenager');}


Null 和 Undefined

null表示一个“空”的值,它和0以及空字符串''不同,0是一个数值,''表示长度为0的字符串,而null表示“空”。

在其他语言中,也有类似JavaScript的null的表示,例如Java也用null,Swift用nil,Python用None表示。但是,在JavaScript中,还有一个和null类似的undefined,它表示“未定义”。

JavaScript的设计者希望用null表示一个空的值,而undefined表示值未定义。事实证明,这并没有什么卵用,区分两者的意义不大。大多数情况下,我们都应该用null。undefined仅仅在判断函数参数是否传递的情况下有用。


Object (对象) 

JavaScript的对象是一种无序的集合数据类型,它由若干键值对组成。

JavaScript的对象用于描述现实世界中的某个对象:

var person = {    

name: 'Bob',    

age: 20,   

 tags:  ['js','web','mobile'],    

city: 'Beijing',   

 hasCar: true,    

zipcode: null

}; 

JavaScript对象的键都是字符串类型,值可以是任意数据类型。上述person对象一共定义了6个键值对,其中每个键又称为对象的属性,例如,person的name属性为'Bob',zipcode属性为null。

要获取一个对象的属性,我们用对象变量.属性名的方式:

person.name;    //'Bob'

person.zipcode;    //null

JavaScript用一个{...}表示一个对象,键值对以xxx: xxx形式申明,用,隔开。注意,最后一个键值对不需要在末尾加,,如果加了,有的浏览器(如低版本的IE)将报错。

访问属性是通过 . 操作符完成的,但这要求属性名必须是一个有效的变量名。如果属性名包含特殊字符,就必须用''括起来.

属性名middle-school不是一个有效的变量,就需要用 ' ' 括起来。访问这个属性也无法使用 . 操作符,必须用['xxx']来访问

也可以用 xiaoming['name'] 来访问 xiaoming 的 name 属性,不过 xiaoming.name 的写法更简洁。我们在编写JavaScript代码的时候,属性名尽量使用标准的变量名,这样就可以直接通过 object.prop 的形式访问一个属性了。

实际上JavaScript对象的所有属性都是字符串,不过属性对应的值可以是任意数据类型。

访问不存在的属性不报错,而是返回undefined:

由于JavaScript的对象是动态类型,你可以自由地给一个对象添加或删除属性:

如果我们要检测xiaoming是否拥有某一属性,可以用in操作符:

如果in判断一个属性存在,这个属性不一定是xiaoming的,它可能是xiaoming继承得到的,因为toString定义在object对象中,而所有对象最终都会在原型链上指向object,所以xiaoming也拥有toString属性。

hasOwnProperty()方法:判断一个属性是否是xiaoming自身拥有的,而不是继承得到的。


变量

变量的概念基本上和初中代数的方程变量是一致的,只是在计算机程序中,变量不仅可以是数字,还可以是任意数据类型。

变量在JavaScript中就是用一个变量名表示,变量名是大小写英文、数字、$和_的组合,且不能用数字开头。变量名也不能是JavaScript的关键字,如if、while等。申明一个变量用var语句,比如:

vara;// 申明了变量a,此时a的值为undefinedvar$b=1;// 申明了变量$b,同时给$b赋值,此时$b的值为1vars_007 ='007';// s_007是一个字符串varAnswer =true;// Answer是一个布尔值truevart =null;// t的值是null

变量名也可以用中文,但是,请不要给自己找麻烦。

在JavaScript中,使用等号=对变量进行赋值。可以把任意数据类型赋值给变量,同一个变量可以反复赋值,而且可以是不同类型的变量,但是要注意只能用var申明一次,例如:

vara =123;// a的值是整数123a ='ABC';// a变为字符串

这种变量本身类型不固定的语言称之为动态语言,与之对应的是静态语言。静态语言在定义变量时必须指定变量类型,如果赋值的时候类型不匹配,就会报错。例如Java是静态语言,赋值语句如下:

inta =123;// a是整数类型变量,类型用int申明a ="ABC";// 错误:不能把字符串赋给整型变量

和静态语言相比,动态语言更灵活,就是这个原因。

请不要把赋值语句的等号等同于数学的等号。比如下面的代码:

varx =10;x = x +2;

如果从数学上理解x = x + 2那无论如何是不成立的,在程序中,赋值语句先计算右侧的表达式x + 2,得到结果12,再赋给变量x。由于x之前的值是10,重新赋值后,x的值变成12。

要显示变量的内容,可以用console.log(x),打开Chrome的控制台就可以看到结果。

// 打印变量x

 Run

使用console.log()代替alert()的好处是可以避免弹出烦人的对话框。

上一篇下一篇

猜你喜欢

热点阅读