js基础-类型、值和变量(上)

/ 0评 / 0

简单介绍

本文篇幅有点长。。。。程序运行需要对值进行操作。比如

console.log('Hello World!')  //Hello World!就是值

如果没有值,程序运行时没有意义的。在编程语言中。能够表示并操作值得类型称作数据类型。编程语言中最基本的特性就是能够支持各种数据类型。当我们需要对值进行保存以备将来使用的时候,我们就需要用到变量。变量就是一个值得符号名称,可以通过名称来获得对值得引用。我们引出了先引出本文要讲的一些东西,下面我们会详细来探究。

js的数据类型分为两类:原始类型和对象类型(在《javaScript高级程序设计》中是将其分为基本类型和引用类型,本质是一样的,只是叫法不一样)。js的原始类型包括数字(Number)、字符串(String)、布尔值(Boolean)、null(空)和undefined(未定义)。其中null和undefined是特殊的两个特殊的原始值,他们分别代表了各自特殊类型的唯一成员。

js除了原始类型之外就是对象了,对象(Object)是属性的集合,每个属性有“键/值对”构成。

不同的的js对象是“键/值对”的无序集合。同样也有有序集合的特殊对象就是数组(Array)表示带编号的值的有序集合,数组具有专用的此法和特有的行为特性(函数方法)

var arr=['one','two','three'];
arr[0]   //one  
arr[1]   //two
arr[2]   //three

js还定义了另一种特殊对象,函数(Function);函数是具有与他相关联的可执行代码的对象,通过函数来运行可执行代码,并返回运算结果。同样,函数也专有的行为特性。

js语言核心还定义了三种可供我们实例化的类型,日期(Date)、正则(RegExp)、和错误类型(Error);他们有自己独立的运行。

js有自己的内存管理机制,可以自动对内存进行垃圾回收。等等

我们先大概过一遍js的一些最基础的东西,我们现在来讨论本文的主要内容。

具体内容

1.数字

js的类型同样可以分为可变类型和不可变类型。可变类型的值是可以修改的,对象和数组属于可变类型。数字、布尔值、null和undefined属于不可变类型。比如修改一个数字内容本身就说不同了。

js是不区分整数值和浮点数值的。js的所有数字都是采用浮点数值表示。JavaScript所能表示的数值范围为正负1.7976931348623157乘以10的308次方,其最小所能表示的小数为正负5乘以10的负324次方,这两个边界值可以分别通过访问Number对象的MAX_VALUE属性和MIN_VALUE属性来获取。

console.log(Number.MAX_VALUE);
console.log(Number.MIN_VALUE);

js能够表示的整数范围是从-~ 9007199254740992。如果使用了超过此范围的煮熟,则数字计算是会出错的;

var a=9007199254740992+3;
console.log(a);

js

正确的运算结果应该是9007199254740995,但JavaScript给出的计算结果却是9007199254740996。尝试改变计算公式后可以发现,只要整数大于9007199254740992,这种计算结果的错误将频繁出现。

当一个数字直接出现在js程序中,我们称之为数字直接量。js支持多种格式的数字直接量。但是有个特殊情况要说下,就是在任何数字直接量钱加负号(-)例如-1;就可以得到他们的负值,但是负号是运算符(我们接下去会讨论),并不是数字直接量的组成语言!

2.整型直接量

在js程序中,数值表示的是一个十进制整数,可能有人对进制不理解,这里简单说一下:

进制也就是进位制,是人们规定的一种进位方法。 对于任何一种进制---X进制,就表示某一位置上的数运算时是逢X进一位。 十进制是逢十进一,十六进制是逢十六进一,二进制就是逢二进一,以此类推,x进制就是逢x进位。

除了是进制的整型直接量,js同样能是被十六进制(以16为基数)的值,十六进制值是0~9和a(A)~f(F)之间表示的。其中a~f表示10~15,例如

例:2AF5换算成10进制:
用竖式计算:
第0位: 5 * 16^0 = 5
第1位: F * 16^1 = 240
第2位: A * 16^2= 2560
第3位: 2 * 16^3 = 8192

5 * 16^0 + F * 16^1 + A * 16^2 + 2 * 16^3 = 10997

我们要记得ECMAScript的标准是不支持八进制(以八位基数)直接量。在某些情况下是可以支持的,但是在严格模式下,八进制是明令禁止的。关于严格模式:除了正常运行模式,ECMAscript 5添加了第二种运行模式:"严格模式"(strict mode)。顾名思义,这种模式使得Javascript在更严格的条件下运行。"严格模式"体现了Javascript更合理、更安全、更严谨的发展方向,包括IE 10在内的主流浏览器,都已经支持它,许多大项目已经开始全面拥抱它。另一方面,同样的代码,在"严格模式"中,可能会有不一样的运行结果;一些在"正常模式"下可以运行的语句,在"严格模式"下将不能运行。掌握这些内容,有助于更细致深入地理解js,让你变成一个更好的程序员。

3.浮点型直接量

浮点型直接量是可以含有小数点的。它们采用的是传统的实数写法。有一个整数部分、小数点、小数部分组成。

还可以用指数记数法表示浮点型直接量例如

3.14
2435.321
.321223
6.02e23    //6.02*10的23次方

 4.js中的算术运算

js是使用语言本身提供的算数运算符来进行数字计算的。这些常用数字运算符有

加法运算符(+)
减法运算符(-)
乘法运算符(*)
出发运算符(/)
求余与运算符(%)

还有其他很多运算符我们先不讨论。除了上面基本的运算符外。js还支持更加复杂的算术运算。这些复杂运算符通过作为作为Math(算数)对象的属性定义的函数和常量来实现的,具体可以参考W3school去做个demo测试下,以下是截图

js中算数运算在溢出(overflow)、下溢(unoverflow)或被零整除时不会报错。当数字超出了js所能表示的数字上限(溢出),结果是一个特殊值Infinity(无穷大),同样的有正无穷大就有负无穷大。当负数超过了js所能表示的负数范围,结果为-Infinty(负无穷大)。无穷大值的算数运算(+、-、*、/)结果还是无穷大值(当然还保留他们的正负号)。

下溢是当运算结果无限接近于零并比js所能表示的最小值还小的时候发生的一种情形。这种情况下,js将会返回0.当一个负数发生下溢时候,js会返回一个特殊的值“负零”。这个值和正常的0完全一样。只是很少用到而已。

被零整除是不会保错的,他只是简单的返回负无穷大(-Infinity)或者无穷大(Infinity)。

var a=1/0;
console.log(a);    //Infinity

但是还有一种情况就是0/0,这种晕死是没有什么意义的,它会返回一个非数字值(not-a-number),用NaN表示。有几种运算情况下会返回NaN,无穷大除以无穷大、给负数做开方运算或者算术运算符与不是数字或无法转换为数字的操作数一直使用时都会返回NaN.Nan和任何值都不相等,包括它本身

console.log(NaN==NaN)    //false

要判断一个值是不是NaN,可以用x!=X来判断,当且仅当x是NaN的时候,表达式的结果是true.也有函数isNaN()的作用与之相似,如果参数是NaN或者一个非数字值(比如字符串和对象),则返回true.

console.log(isNaN(123))     //false
console.log(isNaN(0/0))     //true
console.log(isNaN(NaN)     //true

类似的方法还有isFinite(),在参数不是NaN、Infinite或-Infinite的时候才返回true.

5.二进制浮点数和四舍五入错误

var a=0.1;
var b=0.2;
var c=0.3;
var d=a+b;
console.log(c==d)     //?
console.log(d)           //?

大家可以试一下,印象最深刻了,为什么会出现上面这种情况呢,众所周知,计算机的内存是有限的,目前是没有存在说有无限存储空间的计算机的。js也是如此,实数有无数个,但js通过浮点数的形式只能表示其中有限的个数(大概有18437736874454810627个)也就是说,当在js中使用实数的时候,常常只是真实值的一个近似表示而已。

js采用了IEEEE-754浮点数表示法(几乎所有语言都用这个表示法)。这是二进制表示法,可以精准表示分数(1/2、1/8、1/1024)。但是我们常用的分数都是十进制分数(1/10、1/100之类),所以二进制浮点数并不能靳准表示类似于0.1这样类型的数字。要记住在所有采用这个浮点数表示法的语言中都会出现这种问题,这不是js独有的问题。要注意的是。我们的金融计算涉及到的这些计算都是基于整数“分”来进行货币单位的计算的。

 

6.日期和时间

js的语言合兴包括Date()构造函数,用来表示或者创建时间和日期的对象。这些对象为日期计算提供了很多有用的API(应用程序接口,简单来说就是怎么用的方法)。例如我要获取当前的时间

var t=new Date()   
 //实例化一个日期对象,我们先不搞复杂的,只需要只是实例化就是把抽象的一类东西变成具象的对象操作就可以了。

console.log(t.getFullYear())     //今年是2017   所以返回2017

类似的很多方法可以查阅  js Date()

7.字符串直接量

字符串直接量是有单引号或者双引号括起来的字符序列。记住,有单引号定界的字符串中可以包含双引号,有双引号定界的字符串也可以包含单引号

“”  //空字符串
“text”  
'text'
"123"
"age:'18'"
"hello world"

js中,使用单引号和双引号是没有什么区别的,只不过在HTML中用的是双引号,所以就我个人喜好用单引号。当然了,在有些情况下比如

can't和your's等英文缩写和所有格中,因为撇号和单引号是同一个字符,我们使用单引号的话,必须用反斜线(\)来转译所有的撇号。

js的内置功能之一就是字符串的链接了。如果将(+)号运用于数字,表示两数相加,如果用于字符串中,则表示字符串拼接。例如

var a="1";
var b="2";
console.log(a+b)   //12

要确定一个字符串的长度,可以使用字符串的length属性

var str="123abc";
console.log(str.length)  //6

除了length属性了,字符串还有许多调用的方法,这里只简单介绍下,以后会详细的讨论。

var str="abc123123";    
str.charAt(0)    //“a” 得到字符串str位置0的字符,主要字符串数组等最开始是0而不是1
str.charAt(str.lenght-1)  //“3”  得到str最后一个字符
str.substring(1,4)  //"bc1"  得到第2~4个字符
str.slice(1,4)   //"bc1" 同上
str.slice(-3)  //"132"  得到最后三个字符
str.indexOf(”1“);   //3  字符1在字符串str首次中出现的位置  
str.lastIndexOf("1")   //6  字符1在字符串str最后一次中出现的位置  
str.indexOf("3",4)   //5  在位置4以及之后首次出现字符3的位置
......

更多字符串的属性和方法,可以参考W3C的http://www.w3school.com.cn/jsref/jsref_obj_string.asp

8.转义字符

上面提到转移,在js中反斜线(/)有着特别用处,反斜线(/)后加一个字符,就不再表示它们的字面含义了。比如\n,就是一个转义字符,表示的是换行符。上面中的\'中,当需要在一个单引号定界的字符串中使用撇号的时候,就是转义字符登场的时候了。因为反斜线可以避免使用常规方式解释单引号。

js中常见的转义字符有

转义字符含义
\0NUL字符
\b退格符
\t水平制表符
\n换行符
\v垂直制表符
\f换页符
\r回车符
\'撇号或单引号
\"双引号
\\反斜线

知识内容比较多,为了方便阅读,我分成上中下篇来回顾了!

简书求关注http://www.jianshu.com/u/bfd55badb1f4

欢迎讨论交流~

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注