龙空技术网

第7节 Javascript数据类型-零点程序员-王唯

零点程序员 244

前言:

当前小伙伴们对“js幂运算符”可能比较着重,各位老铁们都想要分析一些“js幂运算符”的相关文章。那么小编也在网络上网罗了一些对于“js幂运算符””的相关资讯,希望我们能喜欢,姐妹们一起来学习一下吧!

ECMAScript中类型可以分为两大类,基本数据类型(原始类型primitive [ˈprɪmətɪv] type)与引用数据类型(也称为复杂数据类型Object type,Object本质上是由一组无序的键值对组成的)

JavaScript中的基本数据类型包括数字、字符串、布尔、null(空)和undefined(未定义)等5种类型:

数字Number:

Number类型是ECMAScript中最重要的类型了,这种类型使用IEEE754格式来表示整数和浮点数(浮点数也被称为双精度数),和其他编程语言不同,JavaScript不区分整数值和浮点数值;在ECMAScript中,Number被定义了不同的数值字面量(直接量)格式;

1)整数:

如:intNum = 10;

说明:除了十进制,整数还可以通过八进制或十六进制的字面值来表示;

十六进制字面值的前两位必须是0x,后跟任何十六制数字(0-9, A-F),其中A-F,可以大写,也可以小写;

var hexNum = 0xA;console.log(hexNum);var num = 0xf5;  // 15*16 + 15 = 255console.log(num);

八进制的第一位必须是零,如:

var octalNum = 070;  // 7*8 = 56console.log(octalNum);var num = 0377;  // 3*8*8 + 7*8 + 7 = 255//var num = 0397; // 297 字面值超出了范围,前导零将被忽略 console.log(num);

注:如果字面值超出了范围,那么前导零将被忽略,后面的数值将当作十进制数据解析;

注:ECMAScript标准不支持八进制,所以在严格模式下是无效的,会抛出错误,所以在ES6下,八进制直接量是不能使用的;

注:在进行算术运算时,所有以八进制和十六进制表示的数值最终都将被转换成十进制数值;

注:可以允许正零(+0)和负零(-0),并认为两者是相等的;另外,严格来说,+和-并不是我们之前学到的正负值,它实际是JS中的一元运算符,并不是数字直接量语法的组成部分。

2)浮点数:

所谓浮点数,就是该数值中必须包含一个小数点,采用的是传统的实数写法;一个实数由整数部分、小数点和小数部分组成;小数点前可以没有整数(但不推荐这样写法);如:

var floatNum = 1.1;floatNum = .5;console.log(floatNum);

注:浮点数需要的内存空间是整数的两倍;因此,ECMAScript会在有可能的情况下,把浮点数转换为整数,如,小数点后面没有跟任何数字,或者浮点数本身就是一个整数,那么这个数值就可以作为整数来保存;如:

var floatNum = 1.;  floatNum = 9.0;     // 1, 9

对于极大的数或极小的数,可以用e表示法(即科学计数法);用e表示的数值等于e前面的数值乘以10的指数次幂;如:

var floatNum = 3.1415e10;  // 输出不一定是计数法,如:31415000000floatNum = 3.1415e-10;     // 3.1415e-10

注:默认情况下,ECMAScript会将那些小数点后面带有6个零以上的浮点数转换为以e表示法表示的数值;

注:浮点数最高精度是17位小数,但在进行算术计算时其精确度远远不如常数,如:0.1加上0.2不等于0.3,等于0.30000000000000004,这个小小的舍入误差会导致无法测试特定的浮点数值,如

console.log(0.1+0.2);       // 0.30000000000000004if(0.1+0.2==0.3){    console.log("不相等的");}

说明:如果a和b是0.05和0.25,或者是0.15和0.15都不会有问题,但如果是0.1和0.2,就有问题,因此,永远不要测试某个特定的浮点数值;

注:有关浮点数值计算会产生舍入误差的问题的原因,这是使用基于IEEE754数值的浮点计算的通病,并非只是ECMAScript有,其它使用相同数值格式的语言也存在这个问题。

3)数值范围:

由于内存的限制,ECMAScript并不能保存任意的数值;

其能够表示的最小值保存在Number.MIN_VALUE中,在绝大部分的浏览器中,这个值是5e-324;表示最大值保存在Number.MAX_VALUE中,值为1.7976931348623157e+308;

console.log(Number.MAX_VALUE);     // 1.7976931348623157e+308console.log(Number.MIN_VALUE);      // 5e-324console.log(Number.MAX_SAFE_INTEGER);   // 9007199254740991console.log(Number.MIN_SAFE_INTEGER);   // -9007199254740991

Number.MAX_SAFE_INTEGER 常量表示在 JavaScript 中最大的安全整数,值为9007199254740991;

Number.MIN_SAFE_INTEGER常量表示在 JavaScript 中最小的安全整数,值为-9007199254740991;

这两个Number静态属性是ES6引入的;

如果某次计算的结果超出了Javascript数值范围的值,那么这个数值将被自动转换成特殊的Infinity(无穷 )值;即,如果这个数值是负值,就被转为-Infinity负无穷,否则为Infinity正无穷;但是,这是理论会导致这个样果,实际上不是,这主要还是因为IEEE754这个标准闹的,后期我会专门讲讲这个标准。

如果某个计算结果是Infinity,那么该值参与下一次运算,结果还是Infinity;如果运行结果是比JavaScript能表示的最小值还小的时,将会返回0,否则会返回该负数;

要想确定一个数值是否为有穷的,可以使用isFinite()函数,这个函数会判断其参数是否位于最小值与最大值之间,返回true或false;

访问Number.POSITIVE_INFINITY和Number.NEGATIVE_INFINITY也可以得到正负Infinity值;即这两个属性中分别保存着Infinity和-Infinity;

4)NaN:

NaN,非数值(Not a Number)是一个特殊的数值,其用于表示一个本来要返回数值却未返回数值的情况(这样就不会抛出错误的);如,在其他编程语言中,任何数值除以非数值都会导致错误,从而停止执行;但在ECMAScript中,任何数值除以非数值会返回NaN,不会影响其他代码的执行;

console.log(3/"a");  // NaN

注:除以0的结果是Infinite,不是NaN;

NaN两个特点:任何涉及NaN的操作都会返回NaN;其次NaN与任何值都不相等,包括NaN本身,如:

console.log(NaN / 10);  // NaNconsole.log(NaN == NaN);  // false

针对NaN的这两个特点,ECMAScript定义了isNaN()函数,其接受一个参数,该参数可以是任何类型,其判断该参数是否“不是数值”;isNaN()会先尝试把参数转换为数值;某些不是数值的值会直接转换为数值,如字符串”10”或Boolean值;而任何不能被转换为数值的值都会导致这个函数返回true,如:

console.log(isNaN(NaN));    // trueconsole.log(isNaN(10));     // falseconsole.log(isNaN("10"));   // falseconsole.log(isNaN("wangwei"));  // trueconsole.log(isNaN(true));   // false

注:isNaN甚至可以检测对象;在基于对象调用isNaN()时,会首先调用对象的valueOf()方法,然后确定该方法返回的值是否可以转换为数值;如果不能,则基于这个返回值再调用toString()方法,再测试返回值。

String字符串:

String类型用于表示由零或多个16位Unicode字符组成的字符序列,即字符串,在JavaScript中,一般用来表示文本;

1)字符字面量:

字符串可由双引号或单引号表示 ,如:

var firstName = "wang";var lastName = 'wei';

两者没有任何区别,一般使用单引号,主要目的是为了方便向后端传递数据,因为后端一般使用双引号,当接收到前端的单引号数据可以直接使用,否则需要进行转义。

var str = "";  // 空字符串var str = " "; // 空格var str = 'name = "wangwei"';

在客户端中,JavaScript代码中有可能会夹杂HTML代码,HTML代码也有可能夹杂JavaScript代码;HTML中可以使用单引号,也可以使用双引号;因此,当两者混杂使用时,HTML使用双引号,JavaScript使用单引号;

2)转义字符:

String类型包含一些特殊的字符字面量,也叫转义序列(有的地方叫做逃逸符),用于表示非打印字符,或者具有其他用途的字符;其使用反斜框后加一个字符;

\n 换行、\t 制表符、\b 退格、\r 回车、\f 进纸、\\ 斜杠、\’ 单引号、\” 双引号、\xnn 以十六进制代码nn表示的一个字符、\unnnn 以十六进制代码nnnn表示的一个Unicode字符

var str = "zero\nnetwork";console.log(str);var text = "this is \u03a3;";  // \u03a3被当作一个字符处理console.log(text);

如果\后的字符不是以上所列的,则忽略\;

在ECMAScript中,书写字符串直接量可以拆分数行,每行必须以反斜线“\“结束,如:

var str = "zero\network\wangwei";console.log(str);

3)字符串的使用:

加号(+)运算用于数字,也可以用于字符串,表示字符串连接,如:

var msg = "hello," + "world";console.log(msg);msg = "wang" + " " + "wei";console.log(msg);

任何字符串的长度都可以通过访问其length属性获得;注:如果字符串中包含双字节字符,该属性有可能不会精确地返回字符串中的字符数目;

console.log("zero network".length);var company = "zero 零点网络";console.log(company.length);

4)字符串的特点:

ECMAScript中的字符串是不可变的,也就是说,字符串一旦创建,它们的值就不能改变;要改变某个变量保存的字符串,首先要销毁原来的字符串,然后再用另一个包含新值的字符串填充该变量,如:

var lang = "Java";lang = lang + "script";console.log(lang);

分析说明:首先创建一个能容纳10个字符的新字符串,然后在这个字符串中填充“Java“和”Script“,最后一步是销毁原来的Java和Script,因为这两个字符串已经没有用了;这个过程是在后台发生的,而这也是某些旧版本的浏览器中拼接字符串时速度很慢的原因;但这些浏览器后来的版本已经解决了这个低效率的问题。

在ECMAScript中,字符串可以当做只读数组,即可以使用数组的方式来访问字符串中的单个字符,如:

var str = "zero network";console.log(str[0]);for(var i=0;i<str.length; i++){    console.log(str[i]);}

Boolean布尔:

Boolean类型是ECMAScript中使用得最多的一种类型,该类型只有两个值:true和false;其代表真或假、开或关、是或否;如:

var found = true;var lost = false;

注:Boolean类型的值true和false是区分大小写的;

布尔值一般用于比较和控制语句中,如:

var a = 10, b = 10;console.log(a == b);if(a == b){    console.log("相等");}else{    console.log("不相等");}

Undefined未定义的:

Undefined类型只有一个值,即特殊的undefined;在使用var声明变量但未对初始化;

var msg;console.log(msg);var message = undefined;console.log(message);

说明:虽然显示的为message初始化了undefined值,但没有必要,因为未经初始化默认就是undefined;

注:包含undefined值与尚未定义的变量是不一样的。

// var age;console.log(age);  // age is not defined

说明:以上使用了未定义的变量,会抛出错误;对于未声明的变量,只能执行一项操作,即使用typeof操作符检测其数据类型。

但是对未初始化的变量执行typeof,会返回undefined值,但对未声明的变量执行typeof也会返回同样的值,如:

var msg;console.log(typeof msg);  // undefinedconsole.log(typeof age);  // undefined

在实际场景中,这两种变量都不可能执行真正的操作。

注:如果一个函数没有返回任何值,则默认返回undefined;如:

function fun(){}console.log(fun());  // undefined

Null:

Null类型也只有一个值,即特殊的null(空值);从逻辑上看,null值表示一个空对象指针,而这也正是使用typeof操作符检测null时会返回object的原因;

var car = null;console.log(car);console.log(typeof car);  // object

注:虽然看起来null是一个特殊的对象值,但实际上它是Null类型的唯一值;

注:如果定义的变量准备在将来用于保存对象,那么最好将该变量初始化为null,而不是其他值;这样一来,只要直接检查null值,就可以知道相应的变量是否已经保存了一个对象的引用了;

if(car!=null){    console.log("对car对象执行其他操作");}

实际上,undefined值是派生自null值的,因此ECMA-262规定对它们的相等性测试要返回true;如:

console.log(null == undefined);  // true

说明:尽管null和undefined有这样的关系,但它们的用途完全不同;如前所讲,无论在什么时候都没有必要把一个变量的值显式地设置为undefined,可是null却不同,只要意在保存对象的变量还没有真正保存对象,就应该明确地让该变量保存null值;这样做不仅可以体现null作为空对象指针的惯例,而且也有助于进一步区分null和undefined。另外,如果一个函数,没有正确的值要返回,可以返回null;

Web前端开发之Javascript-零点程序员-王唯

标签: #js幂运算符 #js加双引号 #varjs变量 #js数据的长度