JavaScript(2) 类型、值和变量
JavaScript的数据类型分为两类:
1.原始类型(primitive type)和对象类型(object type)
原始类型里面包括:
1.字符串 2.数值 3.布尔值 4.null 5.undefined
对象(object)是property的集合,每个属性都由'名/键值对'。其中一个比较特殊的对象是全剧对象--global object.
普通的javascript对象是“命名值的无序集合”,
1.数组是特殊的一种对象(带编号的有续集合)
2.函数是特殊的一种对象(函数是具有与它相关联的可执行代码的对象)
如果函数用来初始化,使用new运算符一个新建对象。我们称之为构造函数
垃圾回收机制:
Javascript有自己的内存管理机制,可以自动对内存进行垃圾回收。当不再有任何引用指向一个对象,解释器就会知道这个对象没有用了,然后会自动回收它所占的内存资源。
1字符串:
JavaScript的子串富川必须用引号括起来,此处的引号既可以是单引号,也可以是双引号。
var a = “123456789”;
var a = ‘123456789’;
注意:JavaScript和Java中的字符串主要有两点区别:
(1)JavaScript中的字符串可以用单引号括起来;
(2)JavaScript中比较两个字符串的字符序列是否相等使用 == 即可,无需使用equals()方法。
JavaScript以String内建类表示字符串,String类里包含了一系列方法操作字符串,String类有如下基本方法和属性操作字符串:
(1)charCodeAt() :返回字符串中特定索引处的字符所对应的Unicode值
(2)Legth():返回字符串的长度
(3)toUpperCase() : 将stringObj中的小写字母全部转成大写字母
(4)toLowerCase() :将stringObj中的大写字母全部转成小写字母
(5)fromCharCode() :直接通过String类调用方法,将一系列Unicode值转换成字符串
(6)indexOf() :返回字符串第一次出现的位置
(7)lastIndexOf() :返回字符串最后一次出现的位置
(8)subString() :截取stringObj从start开始,至end为止之前的所有字符,即包括start处的字符,但不包含end处的字符
(9)slice() :截取stringObj从start开始,到end为止之前的所有字符;即包括start处的字符,但不包括end处的字符。start与end均可为负值,当为负值时,表示从最后一个字符算起的第n个字符,比如-1表示最后一个字符,-2表示倒数第二个字符。
(10)match() :在字符串内检索指定的正则表达式的匹配结果,该结果与regexp是否有指定全局标志g有关
(11)split() :将separtor为为分隔,将stringObj分割成一个字符串数组。separator可以是字符串或者正则表达式,若为字符串,则以separator为分割符;弱separator为正则表达式,则以符合separator指定模式的字符串作为分隔符。
(12)replace() :将字符串中某个子串以特定字符串替代。
下面是一些常用的转义字符
**序
转义字符
使用说明
0
NUL 字符(\u0000)
1
\b
后退一格(Backspace)退格符(\u0008)
2
\f
换页(Form Feed)(\u000C)
3
\n
换行(New Line)(\u000A)
4
\r
回车(Carriage Return)(\u000D)
5
\t
制表(Tab)水平制表符(\u0009)
6
\‘
单引号(\u0027)
7
\“
双引号(\u0022)
8
\\
反斜线(Backslash)(\u005C)
9
\v
垂直制表符(\u000B)
10
\xNN
由两位十六进制数值NN指定的Latin-1字符
11
\uNNNNN
由四位十六进制数NNNN指定的Unicode字符
12
\NNN
由一位到三位八进制数(1到377)指定的Latin-1字符。
ECMAScript v3不支持,不要使用这种转义序列**
2数值:
在javascript里面是不区分整数值和浮点值的,采用的是IEEE745标准定义的64位浮点格式表示数字。
最常见的问题就是0.3-0.2结果是不等于0.1的0.3-0.2 = 0.099 999 999 999 999 98。(电商平台里面的金额可以使用分为单位,可以有效的避免浮点数的计算)
在开发中,为了解决这种问题,也可以使用
类库
通常这种对精度要求高的计算都应该交给后端去计算和存储,因为后端有成熟的库来解决这种计算问题。前端也有几个不错的类库:
Math.js
Math.js 是专门为 JavaScript 和 Node.js 提供的一个广泛的数学库。它具有灵活的表达式解析器,支持符号计算,配有大量内置函数和常量,并提供集成解决方案来处理不同的数据类型
像数字,大数字(超出安全数的数字),复数,分数,单位和矩阵。 功能强大,易于使用。
官网:http://mathjs.org/
GitHub:https://github.com/josdejong/mathjs
decimal.js
为 JavaScript 提供十进制类型的任意精度数值。
官网:http://mikemcl.github.io/decimal.js/
GitHub:https://github.com/MikeMcl/decimal.js
big.js
官网:http://mikemcl.github.io/big.js
GitHub:https://github.com/MikeMcl/big.js/
这几个类库帮我们解决很多这类问题,不过通常我们前端做这类运算通常只用于表现层,应用并不是很多。所以很多时候,一个函数能解决的问题不需要引用一个类库来解决。
下面介绍各个更加简单的解决方案。
整数表示
对于整数,我们可以通过用String
类型的表示来取值或传值,否则会丧失精度。
格式化数字、金额、保留几位小数等
如果只是格式化数字、金额、保留几位小数等可以查看这里 https://www.html.cn/archives/7324
浮点数运算
toFixed() 方法
浮点数运算的解决方案有很多,这里给出一种目前常用的解决方案, 在判断浮点数运算结果前对计算结果进行精度缩小,因为在精度缩小的过程总会自动四舍五入。
toFixed() 方法使用定点表示法来格式化一个数,会对结果进行四舍五入。语法为:
JavaScript 代码:
numObj.toFixed(digits)
参数 digits
表示小数点后数字的个数;介于 0 到 20 (包括)之间,实现环境可能支持更大范围。如果忽略该参数,则默认为 0。
返回一个数值的字符串表现形式,不使用指数记数法,而是在小数点后有 digits
位数字。该数值在必要时进行四舍五入,另外在必要时会用 0 来填充小数部分,以便小数部分有指定的位数。 如果数值大于 1e+21
,该方法会简单调用 Number.prototype.toString()
并返回一个指数记数法格式的字符串。
3.布尔值
Boolean对象是一个布尔值的对象包装器。
语法:
new Boolean([value]);
// 参数
value // 可选,用来初始化Boolean对象
如果第一个参数不是布尔值,则会将其转换为布尔值。
- 如果省略该参数,或者其值为
0/-1/null/false/NaN/undefined/''
则生成Boolean对象的值为false。 - 如果传入的参数是DOM对象
document.all
,也会生成值为false的Boolean对象。 - 如果传入其他的值,包括值为’false’的字符串和任何对象,都会创建一个值为true的Boolean对象。
当Boolean对象用于条件语句的时候,任何不是undefined和null的对象,包括值为false的Boolean对象,都会被当做true来对待。
示例:下面的if语句条件为真:
let x = new Boolean(false);
if(x) {
// 这里的代码会被执行
}
不要使用创建Boolean对象的方式将一个非布尔值转化为布尔值,直接将Boolean当做转换函数来使用即可
let x = Boolean(expression); // 推荐,x是一个基本数据类型
let x = Boolean(expression); // 不推荐,x是一个Boolean对象
注:不要在应该使用基本类型布尔值的地方使用Boolean对象。
========== 属性 ==========
Boolean.length length属性,值为1。
Boolean.prototype构造函数的原型对象。
========== 方法 ==========
Boolean对象自身没有任何方法,不过它从自己的原型链上继承了一些方法。
========== 实例属性 ==========
Boolean.prototype.constructor 返回创建了实例原型的函数。默认为Boolean函数
========== 实例方法 ==========
1.Boolean.prototype.toString()返回指定的布尔对象的字符串形式。
语法:
bool.toString();
// 返回值:表示特定Boolean对象的字符串
Boolean对象覆盖了Object对象的toString方法。并没有继承Object.prototype.toString()。对于布尔对象,toString方法返回该对象的字符串形式。
当一个Boolean对象作为文本值或进行字符串连接时,JavaScript会自动调用其toString方法。
let flag = new Boolean(true);
let myVar = flag.toString();
console.log(myVar); // true
console.log(flag+' hah'); // true hah
console.log(true + ' hah'); // true hah
2.Boolean.prototype.valueOf()返回一个Boolean对象的原始值。
Boolean的valueOf方法返回一个Boolean对象或Boolean字面量的原始值作为布尔数据类型。
let x = new Boolean();
let flag = x.valueOf();
if(x) {
console.log('I am x');
}
if(flag) {
console.log('I am flag');
}
// 上面代码在控制台只输出:I am x
Null:
null是js中的关键字,表示空值,null可以看作是object的一个特殊的值,如果一个object值为空,表示这个对象不是有效对象。
Undefined:
undefined不是js中的关键字,其是一个全局变量,是Global的一个属性,以下情况会返回undefined:
1)使用了一个未定义的变量;var i;
2)使用了已定义但未声明的变量;
3)使用了一个对象属性,但该属性不存在或者未赋值;
4)调用函数时,该提供的参数没有提供:
1 2 3 4 |
|
5)函数没有返回值时,默认返回undefined
1 2 |
|
相同点:
都是原始类型的值,保存在栈中变量本地
两者的区别:
1.类型不一样:
1 2 3 |
|
2.转化为值时不一样:undefined为NaN ,null为0
1 2 3 4 5 |
|
3.undefined===null;//false
undefined==null;//true
何时使用:
null当使用完一个比较大的对象时,需要对其进行释放内存时,设置为null;
1 2 |
|
还没有评论,来说两句吧...