数字

JavaScript不区分整数和浮点数,所有数字都用浮点数表示。

  • 能够表示最大值是 -253 ~ 253,包含边界。超过范围的数无法保证低位数字的精度。
  • JavaScript能直接识别十进制的整型直接量和十六进制值(以0x0X为前缀,由0~9a(A)~f(F)构成,如:0xff,即15 * 16 + 15 = 255)。ECMAScript标准不支持八进制直接量。
  • 浮点数直接量表达式:[digits][.digits][(E|e)(+|-)digits],如:3.12E12 => 3.1212, 浮点数值的最高精度是 17 位小数
  • 算数运算符:加+、减-、乘*、除/、取余%
  • JavaScript中算数运算在溢出、下溢(无限接近于零并比JavaScript能表示的最小值还小的数,JavaScript将会返回0)或被零整除时不会报错(返回正(或负)无穷,例外:零除以零,结果是一个非数字,用NaN表示)。溢出时,结果为无穷大(Infinity)值;下溢结果为负无穷(-Infinity)。基于无穷大的加减乘除运算结果还是无穷大(保留正负号)。
  • NaN表示非数字值,它和任何值都不相等,包括自身。判断一个值是否为NaN:x != x,当切只当x为NaN时,表达式为true。

函数isNaN(),如果参数为NaN或者非数字则返回true;函数isFinite(),在参数不是NaNInfinity-Infinity的时候返回true

  • JavaScript采用了IEEE-754浮点数表示法(几乎所有现代编程语言所采用),这是一种二进制表示法,可以精确的表示分数,如:1/2、1/8和1/1024。但在现实生活中通常用十进制分数,1/10、1/100等。二进制表达式具有足够的精度,但并不能精确的表示类似0.1这样的简单数字。要避免这些舍入问题(特别时金融领域),尽量使用大整数进行计算,例如:乘以相同的倍数,结果再除以相同倍数
var x = .3 - .2;
var y = .2 - .1;
x == y // false
x == .1 //false
y == .1 // true
// 由于舍入误差,0.3与0.2的近似差值并不等于0.2与0.1的近似差值
var a = (.3 * 10 - .2 * 10) / 10
var b = (.2 * 10 - .1 * 10) / 10
a == b // true
a == .1 // true
b == .1 // true

除了以十进制表示外,整数还可以通过八进制(以 8 为基数)或十六进制(以 16 为基数)的字面值 来表示。其中,八进制字面值的第一位必须是零(0),然后是八进制数字序列(0~7)。如果字面值中的 数值超出了范围,那么前导零将被忽略,后面的数值将被当作十进制数值解析。

var octalNum1 = 070; // 八进制的 56
var octalNum2 = 079; // 无效的八进制数值——解析为 79
var octalNum3 = 08; // 无效的八进制数值——解析为 8

!> 八进制字面量在严格模式下是无效的,会导致支持的 JavaScript 引擎抛出错误。

十六进制字面值的前两位必须是 0x,后跟任何十六进制数字(0~9 及 A~F)。其中,字母 A~F 可以大写,也可以小写。如下面的例子所示:

var hexNum1 = 0xA; // 十六进制的 10
var hexNum2 = 0x1f; // 十六进制的 31

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

NaN

NaN,即非数值(Not a Number)是一个特殊的数值,这个数值用于表示一个本来要返回数值的操作数,未返回数值的情况。其有两个特点:

  1. 任何涉及 NaN 的操作(例如 NaN/10)都会返回 NaN
  2. NaN 与任何值都不相等,包括 NaN 本身

ECMAScript 定义了 isNaN()函数。其会尝试 将接收到的值转换为数值,若能转为数值则返回false,否则返回true。

alert(isNaN(NaN)); //true
alert(isNaN(10)); //false(10 是一个数值)
alert(isNaN("10")); //false(可以被转换成数值 10)
alert(isNaN("blue")); //true(不能转换成数值)
alert(isNaN(true)); //false(可以被转换成数值 1)

数值转换

有 3 个函数可以把非数值转换为数值:Number()、parseInt()和 parseFloat()。

Number()

如果是 Boolean 值,true 和 false 将分别被转换为 1 和 0。
如果是数字值,只是简单的传入和返回。
如果是 null 值,返回 0。
如果是 undefined,返回 NaN。
如果是字符串,遵循下列规则:
如果字符串中只包含数字(包括前面带正号或负号的情况),则将其转换为十进制数值,即"1" 会变成 1,"123"会变成 123,而"011"会变成 11(注意:前导的零被忽略了);
如果字符串中包含有效的浮点格式,如"1.1",则将其转换为对应的浮点数值(同样,也会忽 略前导零);
如果字符串中包含有效的十六进制格式,例如"0xf",则将其转换为相同大小的十进制整 数值;
如果字符串是空的(不包含任何字符),则将其转换为 0;
如果字符串中包含除上述格式之外的字符,则将其转换为 NaN。
如果是对象,则调用对象的 valueOf()方法,然后依照前面的规则转换返回的值。如果转换的结果是 NaN,则调用对象的 toString()方法,然后再次依照前面的规则转换返回的字符串值。

!> 一元加操作符的操作与 Number()函数相同。

parseInt()

parseInt()函数在转换字符串时,更多的是看其是否符合数值模式。它会忽略字 符串前面的空格,直至找到第一个非空格字符。如果第一个字符不是数字字符或者负号,parseInt() 就会返回 NaN;也就是说,用 parseInt()转换空字符串会返回 NaN(Number()对空字符返回 0)。如 果第一个字符是数字字符,parseInt()会继续解析第二个字符,直到解析完所有后续字符或者遇到了 一个非数字字符。

如果字符串中的第一个字符是数字字符,parseInt()也能够识别出各种整数格式(即前面讨论的 十进制、八进制和十六进制数)。也就是说,如果字符串以"0x"开头且后跟数字字符,就会将其当作一 5 个十六进制整数;如果字符串以"0"开头且后跟数字字符,则会将其当作一个八进制数来解析。

var num1 = parseInt("1234blue"); // 1234
var num2 = parseInt(""); // NaN
var num3 = parseInt("0xA"); // 10(十六进制数)
var num4 = parseInt(22.5); // 22
var num5 = parseInt("070"); // 56(八进制数)
var num6 = parseInt("70"); // 70(十进制数)
var num7 = parseInt("0xf"); // 15(十六进制数

!> ECMAScript 5 中,即使是在非严格 模式下parseInt()已经不具有解析八进制值的能力,为此转换时可以提供第二个参数--使用的基数(即多少进制)。

var mum8 = parseInt("0xAF", 16); // 175
// 或
var mum9 = parseInt("AF", 16); // 175
var num10 = parseInt("070", 6); // 0

parseFloat()

parseFloat()也是从第一个字符(位置 0)开始解析每个字符。而且 也是一直解析到字符串末尾,或者解析到遇见一个无效的浮点数字字符为止。需要注意的点:

  1. 字符串中的第一个小数点是有效的,而第二个小数点就是无效的了,因此它后面的字符串将被忽略。举例来说, "22.34.5"将会被转换为 22.34。
  2. 始终都会忽略前导 的零。parseFloat()可以识别前面讨论过的所有浮点数值格式,也包括十进制整数格式。但十六进制格 式的字符串则始终会被转换成 0。由于 parseFloat()只解析十进制值,因此它没有用第二个参数指定基 数的用法。
  3. 如果字符串包含的是一个可解析为整数的数(没有小数点,或者小数点后 都是零),parseFloat()会返回整数。
var num1 = parseFloat("1234blue");  //1234(整数)
var num2 = parseFloat("0xA"); //0
var num3 = parseFloat("22.5"); //22.5
var num4 = parseFloat("22.34.5"); //22.34
var num5 = parseFloat("0908.5"); //908.5
var num6 = parseFloat("3.125e7"); //31250000

字符串

JavaScript的字符直接量,是由单引号或双引号括起来的字符序列。ECMAScript 中的字符串是不可变的,也就是说,字符串一旦创建,它们的值就不能改变。要改变 某个变量保存的字符串,首先要销毁原来的字符串,然后再用另一个包含新值的字符串填充该变量

  • ES3中,字符串直接量必须写在一行中;ES5可以拆分数行,行间必须以反斜线(\)分割
var a = "nice\
to\
meet\
you";
console.log(a); // nice to meet you
  • 转义字符\,避免常规的字符串解析,转义符号。

!> 如果\字符位于没有在下表中的字符前,则忽略\

代码 输出
\o NUL字符
\' 单引号
\" 双引号
\& 和号
\\ 反斜杠
\n 换行符
\r 回车符
\t 水平制表符
\v 垂直制表符
\b 退格符
\f 换页符
\xXX 由两位十六进制数XX指定的Latin-1字符
\uXXXX 由4位十六进制数XXXX指定的Unicode字符
var a = 'you\'re right' // you're right

转换为字符串

要把一个值转换为一个字符串有两种方式:

  1. 第一种是使用几乎每个值都有的 toString()方法

!> 除nullundefined无toString方法外(调用toString方法会报错),几乎所有的js对象、变量都支持toString方法

特别的,数值在调用toString方法时可以传递一个参数:输出数值的基数)。默认情况下toString方法以十进制格式返回字符串标识,传递基数可以输出任意有效进制格式的字符串值。

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

在不知道要转换的值是不是 null 或 undefined 的情况下,还可以使用转型函数 String(),这个 函数能够将任何类型的值转换为字符串。String()函数遵循下列转换规则:

如果值有 toString()方法,则调用该方法(没有参数)并返回相应的结果;
如果值是 null,则返回"null";
如果值是 undefined,则返回"undefined"。
// 数值和布尔值的转换结果与调用 toString()方法得到的结果相同。
String(10) // "10"
String(true) // "true"
// null 和 undefined 没有 toString()方法,所以 String() 函数就返回了这两个值的字面量。
String(undefined) // "undefined"
String(null) // "null"
let a = "test", b;
a + b = "testundefined"

!> tips: 将某个值转为字符串,可以使用加号操作符,即将其与一个空串('')加在一起

字符串方法

详见MDN字符串

!> 在JavaScript中字符串时固定不变的,类似replace()toUpperCase()的方法都返回新字符串,原字符串本身并没有发生改变

在ES5中,字符串可以当作只读数组,除了使用charAt()方法,也可以使用方括号来访问字符串中的单个字符(16位值):

s = "hello"
s[0] // => 'h'
s[s.length - 1] // => o

布尔值

布尔值指代真或假、开或关、是或否。这个类型只有两个值,保留字true和false。

任意的Javascript的值都可以转换位布尔值,下面这些值或被转换成false:

false
undefined
null
0
-0
NaN
"" //空字符串

其他所有值,包括所有对象(数组)都会转换成true。JavaScript期望使用一个布尔值时,会将自动转换

布尔运算符

&& // 与
|| // 或
! // 非

nullundefined

Undefined 类型只有一个值,即特殊的 undefined。在使用 var 声明变量但未对其加以初始化时,这个变量的值就是 undefined,例如:

    var message; // 这个变量声明之后默认取得了 undefined 值
// 下面这个变量并没有声明
// var age
alert(message);
alert(age);
// "undefined" // 产生错误

由于 undefined 并不是 JavaScript 的关键字,所以我们在赋值某个变量为 undefined 时可能会有点意想不到的结果。

function t(){
var undefined = 10;
console.log(undefined);
}
t(); // 大多数浏览器下都是10

如上代码我们可能希望赋值为 undefined,但却得到了 10 这个莫名其妙的情况。所以我们可以使用使用 void 替换 undefined。void 运算符对给定的表达式进行求值,然后返回 undefined。

Null 类型类型只有一个值,即特殊的 null,从逻辑角度来看,null 值表 示一个空对象指针,而这也正是使用 typeof 操作符检测 null 值时会返回"object"的原因。早期的js只有null,第 3 版引入undefined是为了正式区分空对象指针与未经初始化的变量。

特殊的:

null == undefined // true,undefined 值是派生自 null 值的,因此 ECMA-262 规定对它们的相等性测试要返回 true,这其中 == 做了隐式转换

null === undefined // false

Javascript-基本类型的更多相关文章

  1. JavaScript事件类型

    JavaScript事件类型 Web浏览器中可能发生的事件有很多类型.这里我将主要将下面几种常用的事件类型: UI事件 焦点事件 鼠标与滚轮事件 键盘与文本事件 复合事件 变动事件 HTML5事件 设 ...

  2. Flow: JavaScript静态类型检查工具

    Flow: JavaScript静态类型检查工具 Flow是Facebook出品的,针对JavaScript的静态类型检查工具.其代码托管在github之上,并遵守BSD开源协议. 关于Flow 它可 ...

  3. javascript 操作符类型隐性转换

    javascript 操作符类型隐性转换 (一).一元操作符只能操作一个值的操作符叫做一元操作符1.递增和递减操作符a. 在应用于一个包含有效数字字符的字符串时,先将其转换为数字值,再执行加减1的操作 ...

  4. javascript学习-类型判断

    javascript学习-类型判断 1.类型判断的的武器 javascript中用于类型判断的武器基本上有以下几种: 严格相等===,用来判断null,undefined,true,false这种有限 ...

  5. JavaScript的类型自动转换高级玩法JSFuck

    0 前言 最开始是不小心在微信公众号(程序员大咖)看到一篇JS的高逼格代码,然后通过里面的链接跳转到了JSFuck的wiki,就像顺着迷宫找宝藏的感觉,感叹JS的自动类型转换的牛逼. 1 样例 (!( ...

  6. 面向对象的JavaScript --- 动态类型语言

    面向对象的JavaScript --- 动态类型语言 动态类型语言与面向接口编程 JavaScript 没有提供传统面向对象语言中的类式继承,而是通过原型委托的方式来实现对象与对象之间的继承. Jav ...

  7. javascript 字典类型的使用

    javascript  字典类型的使用 1.使用Array: var arr = new Array(); arr["zs"] = "zhangsan"; ar ...

  8. javascript变量类型及作用域

    javascript变量类型及作用域 一.简介 变量类型 ECMAScript变量可能包含两种不同类型的数据值:基本类型和引用类型. 基本类型 基本类型指的是简单的数据段,5种基本数据类型:undef ...

  9. js课程 1-3 Javascript变量类型详解

    js课程 1-3  Javascript变量类型详解 一.总结 一句话总结:js对象点(属性方法),json对象冒号(属性方法).属性和方法区别只有一个括号. 1.json对象中的函数的使用? 函数名 ...

  10. JavaScript 基础类型,数据类型

    1.基础类型:undefined,null,Boolean,Number,String,Symbol Undefined类型:一个没有被赋值的变量会有个默认值undefined; Null类型:nul ...

随机推荐

  1. querySelector和getElementById方法的区别

    一.querySelector() 的定义 querySelector() 方法选择指定 CSS 选择器的第一个元素 querySelectorAll() 方法选择指定的所有元素 二.与 getEle ...

  2. hihocoder 1931 最短管道距离

    描述 在一张2D地图上有N座城市,坐标依次是(X1, Y1), (X2, Y2), ... (XN, YN). 现在H国要修建一条平行于X轴的天然气主管道.这条管道非常长,可以认为是一条平行于X轴的直 ...

  3. Git 的用法

    对于GIT  的用法,最近一直在寻找方法.网上也能找到一些方法.但是感觉说的不是很清楚,在这里我基于自己经验写一些. 对于任何一种方法都要安装GIT. 我是基于VS Code 2015 来做的. 在安 ...

  4. List集合和Set集合UML图总结

    1.List和Set,用RationalRose展示 2.Map

  5. tcp文件下载

    服务器端 import socket def send_file_2_client(new_client_socket,client_addr): # 接收信息 file_name = new_cli ...

  6. [TJOI2015]弦论(第k小子串)

    题意: 对于一个给定的长度为n的字符串,求出它的第k小子串. 有参数t,t为0则表示不同位置的相同子串算作一个,t为1则表示不同位置的相同子串算作多个. 题解: 首先,因为t的原因,后缀数组较难实现, ...

  7. HTML 008 head

    HTML <head> 查看在线实例 <title> - 定义了HTML文档的标题使用 <title> 标签定义HTML文档的标题 <base> - 定 ...

  8. File类的createNewFile()和mkdirs() mkdir()

    createNewFile文件不存在则创建,存在则不创建并返回false,文件路径必须存在才可创建路径下的文件(注意它只能创建文件,即如果你给了/storage/emulated/0/hello/sn ...

  9. bzoj 3420: Poi2013 Triumphal arch 树形dp+二分

    给一颗树,$1$ 号节点已经被染黑,其余是白的,两个人轮流操作,一开始 $B$ 在 $1$ 号节点,$A$ 选择 $k$ 个点染黑,然后 $B$ 走一步,如果 $B$ 能走到 $A$ 没染的节点则 $ ...

  10. 2017.11.7 Noip2017 考前模拟赛

    ----------------------------------T1---------------------------------- ——>数学老师的报复 题目描述 11 班数学大佬 Y ...